You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							74 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
	
	
							74 lines
						
					
					
						
							1.8 KiB
						
					
					
				"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.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;
 |