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
			| 
											3 years ago
										 | "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; |