Sha256: b2cb108d5fb865aec7069021a7c12cc8093bc4cbbf362b9d90bf278ae278c8ac

Contents?: true

Size: 1.63 KB

Versions: 34

Compression:

Stored size: 1.63 KB

Contents

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

Version data entries

34 entries across 33 versions & 12 rubygems

Version Path
optimacms-0.1.61 spec/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
disco_app-0.18.0 test/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
disco_app-0.18.2 test/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
disco_app-0.16.1 test/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
disco_app-0.15.2 test/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
disco_app-0.18.4 test/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
disco_app-0.18.1 test/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
disco_app-0.12.7.pre.puma.pre.3 test/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
disco_app-0.14.0 test/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
disco_app-0.13.6.pre.puma.pre.3 test/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
tang-0.2.1 spec/tang_app/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
groonga-client-model-6.0.0 test/apps/rails6.0.3.5/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
groonga-client-model-6.0.0 test/apps/rails6.1.3/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
ruby2js-4.0.4 lib/tasks/testrails/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
ruby2js-4.0.3 lib/tasks/testrails/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
tang-0.2.0 spec/tang_app/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
tang-0.1.0 spec/tang_app/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
tang-0.0.9 spec/tang_app/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
enju_library-0.3.8 spec/dummy/node_modules/websocket-extensions/lib/pipeline/ring_buffer.js
ilog-0.4.1 node_modules/websocket-extensions/lib/pipeline/ring_buffer.js