UNPKG

gamesocket.io

Version:
103 lines (102 loc) 4.21 kB
'use strict' Object.defineProperty(exports, '__esModule', { value: true }) exports.List = void 0 /** * Структура данных, выполняющая функции массива и соверщающая дополнительные оптимизации. * @template {Object}T тип хранимых объектов */ class List { /** Массив внутренних элементов, которые доступны только наследникам */ _elements = new Array() /** * Специальное значение, которое используется для определения свободных мест внутри массива * в случае, если будет указан настраеваемый undefined, движок V8 сможет сделать дополнительные оптимизации */ _undefined /** * Задает массиву начальный размер и запаолняет его {@link List._undefined | 'List._undefined'} */ constructor(undefinedValue) { if (undefinedValue) this._undefined = undefinedValue } /** Генератор значений элементов. Возвращает любые значения, которые не равны {@link List._undefined | 'List._undefined'} */ *values() { let index = 0 while (index < this._elements.length) { if (this._elements[index] != this._undefined) yield this._elements[index++] else index++ } } /** * Добавляет набор новых элементов типа T. * @return false, если один из элементов оказался {@link List._undefined} и добавляет остальные элементы. true в остальных случаях */ add(...elements) { let status = true for (let index = 0; index < elements.length; index++) { if (elements[index] == this._undefined) status = false this._elements[this.freeSpace] = elements[index] } return status } /** * Добавляет элеммент типа T. * @return -1, если один из элементов оказался {@link List._undefined} или index вставленного объекта в случае успеха. */ addOne(element) { if (element == this._undefined) return -1 let index = this.freeSpace this._elements[index] = element return index } /** * Удаляет набор элемментов типа T. * @returns false, если один из элементов оказался {@link List._undefined} или он не был найден в {@link List._elements} и удаляет остальные элементы. true в остальных случаях */ delete(...elements) { let status = true for (let index = 0; index < elements.length; index++) { if (elements[index] == this._undefined) status = false let tmp = this._getElement(elements[index]) if (!~tmp) status = false this._elements[tmp] = this._undefined } return status } indexOf(element) { return this._elements.indexOf(element) } valueOf(index) { return this._elements[index] ?? this._undefined } isUndefined(index) { if (this._elements[index] && this._elements[index] != this._undefined) return false return true } /** * @returns индекс свободной позиции внутри массива. */ get freeSpace() { var indexOfFreeSpace = this._hasFreeSpace if (!~indexOfFreeSpace) return this._elements.length return indexOfFreeSpace } /** * @returns true, если внутри {@link List._elements} есть хотя бы один элемент вида {@link List._undefined} */ get _hasFreeSpace() { return this._elements.indexOf(this._undefined) } /** * * @param объект, который нужно найти * @returns индекс найденного объекта или -1 */ _getElement(element) { for (let i = 0; i < this._elements.length; i++) { if (this._elements[i] == element) return i } return -1 } } exports.List = List