You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.6 KiB
66 lines
1.6 KiB
'use strict'; |
|
|
|
var RingBuffer = function(bufferSize) { |
|
this._bufferSize = bufferSize; |
|
this.clear(); |
|
}; |
|
|
|
RingBuffer.prototype.clear = function() { |
|
this._buffer = new Array(this._bufferSize); |
|
this._ringOffset = 0; |
|
this._ringSize = this._bufferSize; |
|
this._head = 0; |
|
this._tail = 0; |
|
this.length = 0; |
|
}; |
|
|
|
RingBuffer.prototype.push = function(value) { |
|
var expandBuffer = false, |
|
expandRing = false; |
|
|
|
if (this._ringSize < this._bufferSize) { |
|
expandBuffer = (this._tail === 0); |
|
} else if (this._ringOffset === this._ringSize) { |
|
expandBuffer = true; |
|
expandRing = (this._tail === 0); |
|
} |
|
|
|
if (expandBuffer) { |
|
this._tail = this._bufferSize; |
|
this._buffer = this._buffer.concat(new Array(this._bufferSize)); |
|
this._bufferSize = this._buffer.length; |
|
|
|
if (expandRing) |
|
this._ringSize = this._bufferSize; |
|
} |
|
|
|
this._buffer[this._tail] = value; |
|
this.length += 1; |
|
if (this._tail < this._ringSize) this._ringOffset += 1; |
|
this._tail = (this._tail + 1) % this._bufferSize; |
|
}; |
|
|
|
RingBuffer.prototype.peek = function() { |
|
if (this.length === 0) return void 0; |
|
return this._buffer[this._head]; |
|
}; |
|
|
|
RingBuffer.prototype.shift = function() { |
|
if (this.length === 0) return void 0; |
|
|
|
var value = this._buffer[this._head]; |
|
this._buffer[this._head] = void 0; |
|
this.length -= 1; |
|
this._ringOffset -= 1; |
|
|
|
if (this._ringOffset === 0 && this.length > 0) { |
|
this._head = this._ringSize; |
|
this._ringOffset = this.length; |
|
this._ringSize = this._bufferSize; |
|
} else { |
|
this._head = (this._head + 1) % this._ringSize; |
|
} |
|
return value; |
|
}; |
|
|
|
module.exports = RingBuffer;
|
|
|