| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | "use strict";function arrayMove(src, srcIndex, dst, dstIndex, len) {    for (var j = 0; j < len; ++j) {        dst[j + dstIndex] = src[j + srcIndex];        src[j + srcIndex] = void 0;    }}function Queue(capacity) {    this._capacity = capacity;    this._length = 0;    this._front = 0;}Queue.prototype._willBeOverCapacity = function (size) {    return this._capacity < size;};Queue.prototype._pushOne = function (arg) {    var length = this.length();    this._checkCapacity(length + 1);    var i = (this._front + length) & (this._capacity - 1);    this[i] = arg;    this._length = length + 1;};Queue.prototype._unshiftOne = function(value) {    var capacity = this._capacity;    this._checkCapacity(this.length() + 1);    var front = this._front;    var i = (((( front - 1 ) &                    ( capacity - 1) ) ^ capacity ) - capacity );    this[i] = value;    this._front = i;    this._length = this.length() + 1;};Queue.prototype.unshift = function(fn, receiver, arg) {    this._unshiftOne(arg);    this._unshiftOne(receiver);    this._unshiftOne(fn);};Queue.prototype.push = function (fn, receiver, arg) {    var length = this.length() + 3;    if (this._willBeOverCapacity(length)) {        this._pushOne(fn);        this._pushOne(receiver);        this._pushOne(arg);        return;    }    var j = this._front + length - 3;    this._checkCapacity(length);    var wrapMask = this._capacity - 1;    this[(j + 0) & wrapMask] = fn;    this[(j + 1) & wrapMask] = receiver;    this[(j + 2) & wrapMask] = arg;    this._length = length;};Queue.prototype.shift = function () {    var front = this._front,        ret = this[front];    this[front] = undefined;    this._front = (front + 1) & (this._capacity - 1);    this._length--;    return ret;};Queue.prototype.length = function () {    return this._length;};Queue.prototype._checkCapacity = function (size) {    if (this._capacity < size) {        this._resizeTo(this._capacity << 1);    }};Queue.prototype._resizeTo = function (capacity) {    var oldCapacity = this._capacity;    this._capacity = capacity;    var front = this._front;    var length = this._length;    var moveItemsCount = (front + length) & (oldCapacity - 1);    arrayMove(this, 0, this, oldCapacity, moveItemsCount);};module.exports = Queue;
 |