You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
3.8 KiB
JavaScript
164 lines
3.8 KiB
JavaScript
import Check from "./Check.js";
|
|
import defaultValue from "./defaultValue.js";
|
|
|
|
/**
|
|
* A wrapper around arrays so that the internal length of the array can be manually managed.
|
|
*
|
|
* @alias ManagedArray
|
|
* @constructor
|
|
* @private
|
|
*
|
|
* @param {Number} [length=0] The initial length of the array.
|
|
*/
|
|
function ManagedArray(length) {
|
|
length = defaultValue(length, 0);
|
|
this._array = new Array(length);
|
|
this._length = length;
|
|
}
|
|
|
|
Object.defineProperties(ManagedArray.prototype, {
|
|
/**
|
|
* Gets or sets the length of the array.
|
|
* If the set length is greater than the length of the internal array, the internal array is resized.
|
|
*
|
|
* @memberof ManagedArray.prototype
|
|
* @type Number
|
|
*/
|
|
length: {
|
|
get: function () {
|
|
return this._length;
|
|
},
|
|
set: function (length) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
Check.typeOf.number.greaterThanOrEquals("length", length, 0);
|
|
//>>includeEnd('debug');
|
|
var array = this._array;
|
|
var originalLength = this._length;
|
|
if (length < originalLength) {
|
|
// Remove trailing references
|
|
for (var i = length; i < originalLength; ++i) {
|
|
array[i] = undefined;
|
|
}
|
|
} else if (length > array.length) {
|
|
array.length = length;
|
|
}
|
|
this._length = length;
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Gets the internal array.
|
|
*
|
|
* @memberof ManagedArray.prototype
|
|
* @type Array
|
|
* @readonly
|
|
*/
|
|
values: {
|
|
get: function () {
|
|
return this._array;
|
|
},
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Gets the element at an index.
|
|
*
|
|
* @param {Number} index The index to get.
|
|
*/
|
|
ManagedArray.prototype.get = function (index) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
Check.typeOf.number.lessThan("index", index, this._array.length);
|
|
//>>includeEnd('debug');
|
|
|
|
return this._array[index];
|
|
};
|
|
|
|
/**
|
|
* Sets the element at an index. Resizes the array if index is greater than the length of the array.
|
|
*
|
|
* @param {Number} index The index to set.
|
|
* @param {*} element The element to set at index.
|
|
*/
|
|
ManagedArray.prototype.set = function (index, element) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
Check.typeOf.number("index", index);
|
|
//>>includeEnd('debug');
|
|
|
|
if (index >= this._length) {
|
|
this.length = index + 1;
|
|
}
|
|
this._array[index] = element;
|
|
};
|
|
|
|
/**
|
|
* Returns the last element in the array without modifying the array.
|
|
*
|
|
* @returns {*} The last element in the array.
|
|
*/
|
|
ManagedArray.prototype.peek = function () {
|
|
return this._array[this._length - 1];
|
|
};
|
|
|
|
/**
|
|
* Push an element into the array.
|
|
*
|
|
* @param {*} element The element to push.
|
|
*/
|
|
ManagedArray.prototype.push = function (element) {
|
|
var index = this.length++;
|
|
this._array[index] = element;
|
|
};
|
|
|
|
/**
|
|
* Pop an element from the array.
|
|
*
|
|
* @returns {*} The last element in the array.
|
|
*/
|
|
ManagedArray.prototype.pop = function () {
|
|
if (this._length === 0) {
|
|
return undefined;
|
|
}
|
|
var element = this._array[this._length - 1];
|
|
--this.length;
|
|
return element;
|
|
};
|
|
|
|
/**
|
|
* Resize the internal array if length > _array.length.
|
|
*
|
|
* @param {Number} length The length.
|
|
*/
|
|
ManagedArray.prototype.reserve = function (length) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
Check.typeOf.number.greaterThanOrEquals("length", length, 0);
|
|
//>>includeEnd('debug');
|
|
|
|
if (length > this._array.length) {
|
|
this._array.length = length;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Resize the array.
|
|
*
|
|
* @param {Number} length The length.
|
|
*/
|
|
ManagedArray.prototype.resize = function (length) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
Check.typeOf.number.greaterThanOrEquals("length", length, 0);
|
|
//>>includeEnd('debug');
|
|
|
|
this.length = length;
|
|
};
|
|
|
|
/**
|
|
* Trim the internal array to the specified length. Defaults to the current length.
|
|
*
|
|
* @param {Number} [length] The length.
|
|
*/
|
|
ManagedArray.prototype.trim = function (length) {
|
|
length = defaultValue(length, this._length);
|
|
this._array.length = length;
|
|
};
|
|
export default ManagedArray;
|