| module.exports = class FixedFIFO { |
| constructor (hwm) { |
| if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) throw new Error('Max size for a FixedFIFO should be a power of two') |
| this.buffer = new Array(hwm) |
| this.mask = hwm - 1 |
| this.top = 0 |
| this.btm = 0 |
| this.next = null |
| } |
| |
| clear () { |
| this.top = this.btm = 0 |
| this.next = null |
| this.buffer.fill(undefined) |
| } |
| |
| push (data) { |
| if (this.buffer[this.top] !== undefined) return false |
| this.buffer[this.top] = data |
| this.top = (this.top + 1) & this.mask |
| return true |
| } |
| |
| shift () { |
| const last = this.buffer[this.btm] |
| if (last === undefined) return undefined |
| this.buffer[this.btm] = undefined |
| this.btm = (this.btm + 1) & this.mask |
| return last |
| } |
| |
| peek () { |
| return this.buffer[this.btm] |
| } |
| |
| isEmpty () { |
| return this.buffer[this.btm] === undefined |
| } |
| } |