UNPKG

@itwin/core-frontend

Version:
119 lines 4.26 kB
"use strict"; /*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ /** @packageDocumentation * @module Utils */ Object.defineProperty(exports, "__esModule", { value: true }); exports.UniqueTileUserSets = exports.ReadonlyTileUserSet = void 0; const core_bentley_1 = require("@itwin/core-bentley"); /** An immutable set of [[TileUser]]s wherein uniqueness is determined by each TileUser's unique integer identifier. * @see [[UniqueTileUserSets]]. */ class ReadonlyTileUserSet extends core_bentley_1.ReadonlySortedArray { constructor(user) { super((lhs, rhs) => lhs.tileUserId - rhs.tileUserId); if (undefined !== user) this._array.push(user); } } exports.ReadonlyTileUserSet = ReadonlyTileUserSet; class TileUserSet extends ReadonlyTileUserSet { copyFrom(src) { this._array.length = src.length; let i = 0; for (const user of src) this._array[i++] = user; } clone() { const clone = new TileUserSet(); clone.copyFrom(this); return clone; } insert(user) { return this._insert(user); } remove(user) { return this._remove(user); } clear() { this._clear(); } } function compareTileUserSets(lhs, rhs) { if (lhs === rhs) return 0; let diff = lhs.length - rhs.length; if (0 === diff) { for (let i = 0; i < lhs.length; i++) { diff = lhs.get(i).tileUserId - rhs.get(i).tileUserId; if (0 !== diff) break; } } return diff; } const emptySet = new ReadonlyTileUserSet(); const scratchSet = new TileUserSet(); class TileUserSetSet extends core_bentley_1.SortedArray { constructor() { super((lhs, rhs) => compareTileUserSets(lhs, rhs)); } getForUser(user) { for (let i = 0; i < this.length; i++) { const set = this._array[i]; if (1 === set.length && set.get(0) === user) return set; } const newSet = new TileUserSet(user); this.insert(newSet); return newSet; } getTileUserSet(user, users) { if (undefined === users || users.isEmpty) return this.getForUser(user); // Use the scratch set for equality comparison - only allocate if no equivalent set already exists. const toFind = scratchSet; toFind.copyFrom(users); toFind.insert(user); const found = this.findEqual(toFind); if (undefined !== found) { toFind.clear(); return found; } const newSet = toFind.clone(); toFind.clear(); this.insert(newSet); return newSet; } clearAll() { this.forEach((set) => set.clear()); this.clear(); } forgetUser(user) { for (const set of this) set.remove(user); } } /** Maintains a set of [[TileUserSets]] designed to minimize duplication. * For example, the tile request scheduler needs to associate with each [[TileRequest]] the set of [[TileUser]]s awaiting the request's response. * Using UniqueTileUserSets ensures all tiles requested by the same user use the same TileUserSet object. * Additionally, whenever a user is unregistered there is no need to track down every associated tile request - the user can just be removed from the TileUserSets managed by this object. * The TileUserSets managed by this object should be treated as immutable - "adding" a user to an existing set should be done using [[getTileUserSet]]. */ class UniqueTileUserSets { _sets = new TileUserSetSet(); getTileUserSet(user, users) { return this._sets.getTileUserSet(user, users); } clearAll() { this._sets.clearAll(); } clear() { this._sets.clear(); } remove(user) { this._sets.forgetUser(user); } static get emptySet() { return emptySet; } } exports.UniqueTileUserSets = UniqueTileUserSets; //# sourceMappingURL=TileUserSet.js.map