123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- 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');
- const array = this._array;
- const originalLength = this._length;
- if (length < originalLength) {
- // Remove trailing references
- for (let 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) {
- const 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;
- }
- const 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;
|