/script-kiddie/002_script_kiddie/script-kiddie/node_modules/bluebird/js/release/queue.js |
@@ -0,0 +1,73 @@ |
"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; |