Blame view

node_modules/websocket-extensions/lib/pipeline/ring_buffer.js 1.63 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  '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;