68 lines
1.4 KiB
JavaScript
68 lines
1.4 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.default = Queue;
|
||
|
/** @license MIT License (c) copyright 2010-2016 original author or authors */
|
||
|
/** @author Brian Cavalier */
|
||
|
/** @author John Hann */
|
||
|
|
||
|
// Based on https://github.com/petkaantonov/deque
|
||
|
|
||
|
function Queue(capPow2) {
|
||
|
this._capacity = capPow2 || 32;
|
||
|
this._length = 0;
|
||
|
this._head = 0;
|
||
|
}
|
||
|
|
||
|
Queue.prototype.push = function (x) {
|
||
|
var len = this._length;
|
||
|
this._checkCapacity(len + 1);
|
||
|
|
||
|
var i = this._head + len & this._capacity - 1;
|
||
|
this[i] = x;
|
||
|
this._length = len + 1;
|
||
|
};
|
||
|
|
||
|
Queue.prototype.shift = function () {
|
||
|
var head = this._head;
|
||
|
var x = this[head];
|
||
|
|
||
|
this[head] = void 0;
|
||
|
this._head = head + 1 & this._capacity - 1;
|
||
|
this._length--;
|
||
|
return x;
|
||
|
};
|
||
|
|
||
|
Queue.prototype.isEmpty = function () {
|
||
|
return this._length === 0;
|
||
|
};
|
||
|
|
||
|
Queue.prototype.length = function () {
|
||
|
return this._length;
|
||
|
};
|
||
|
|
||
|
Queue.prototype._checkCapacity = function (size) {
|
||
|
if (this._capacity < size) {
|
||
|
this._ensureCapacity(this._capacity << 1);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Queue.prototype._ensureCapacity = function (capacity) {
|
||
|
var oldCapacity = this._capacity;
|
||
|
this._capacity = capacity;
|
||
|
|
||
|
var last = this._head + this._length;
|
||
|
|
||
|
if (last > oldCapacity) {
|
||
|
copy(this, 0, this, oldCapacity, last & oldCapacity - 1);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function copy(src, srcIndex, dst, dstIndex, len) {
|
||
|
for (var j = 0; j < len; ++j) {
|
||
|
dst[j + dstIndex] = src[j + srcIndex];
|
||
|
src[j + srcIndex] = void 0;
|
||
|
}
|
||
|
}
|