| 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;
 |