123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- '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;
|