UNPKG

1.87 kBJavaScriptView Raw
1"use strict";
2function arrayMove(src, srcIndex, dst, dstIndex, len) {
3 for (var j = 0; j < len; ++j) {
4 dst[j + dstIndex] = src[j + srcIndex];
5 src[j + srcIndex] = void 0;
6 }
7}
8
9function Queue(capacity) {
10 this._capacity = capacity;
11 this._length = 0;
12 this._front = 0;
13}
14
15Queue.prototype._willBeOverCapacity = function (size) {
16 return this._capacity < size;
17};
18
19Queue.prototype._pushOne = function (arg) {
20 var length = this.length();
21 this._checkCapacity(length + 1);
22 var i = (this._front + length) & (this._capacity - 1);
23 this[i] = arg;
24 this._length = length + 1;
25};
26
27Queue.prototype.push = function (fn, receiver, arg) {
28 var length = this.length() + 3;
29 if (this._willBeOverCapacity(length)) {
30 this._pushOne(fn);
31 this._pushOne(receiver);
32 this._pushOne(arg);
33 return;
34 }
35 var j = this._front + length - 3;
36 this._checkCapacity(length);
37 var wrapMask = this._capacity - 1;
38 this[(j + 0) & wrapMask] = fn;
39 this[(j + 1) & wrapMask] = receiver;
40 this[(j + 2) & wrapMask] = arg;
41 this._length = length;
42};
43
44Queue.prototype.shift = function () {
45 var front = this._front,
46 ret = this[front];
47
48 this[front] = undefined;
49 this._front = (front + 1) & (this._capacity - 1);
50 this._length--;
51 return ret;
52};
53
54Queue.prototype.length = function () {
55 return this._length;
56};
57
58Queue.prototype._checkCapacity = function (size) {
59 if (this._capacity < size) {
60 this._resizeTo(this._capacity << 1);
61 }
62};
63
64Queue.prototype._resizeTo = function (capacity) {
65 var oldCapacity = this._capacity;
66 this._capacity = capacity;
67 var front = this._front;
68 var length = this._length;
69 var moveItemsCount = (front + length) & (oldCapacity - 1);
70 arrayMove(this, 0, this, oldCapacity, moveItemsCount);
71};
72
73module.exports = Queue;