pnpm
Version:
Fast, disk space efficient package manager
63 lines (49 loc) • 1.37 kB
JavaScript
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
// Based on https://github.com/petkaantonov/deque
export default 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
}
}