{"version":3,"file":"GCManagedHash.mjs","sources":["../../../src/utils/data/GCManagedHash.ts"],"sourcesContent":["import { type GCable, type GCData } from '../../rendering/renderers/shared/GCSystem';\nimport { type Renderer } from '../../rendering/renderers/types';\n\nimport type EventEmitter from 'eventemitter3';\n\n/**\n * Options for the {@link GCManagedHash}.\n * @internal\n */\nexport interface GCManagedHashOptions<T extends GCable & { uid: number } & Pick<EventEmitter, 'once' | 'off'>>\n{\n    renderer: Renderer;\n    type: GCData['type'];\n    onUnload?: (item: T, ...args: any[]) => void;\n    priority?: number;\n    name: string;\n}\n\n/**\n * A hash for managing renderable and resource resources with GC integration.\n * @internal\n */\nexport class GCManagedHash<T extends GCable & { uid: number } & Pick<EventEmitter, 'once' | 'off'>>\n{\n    // Exposed directly for GC system access\n    public items: Record<number, T> = Object.create(null);\n    private _renderer: Renderer;\n    private _onUnload?: (item: T, ...args: unknown[]) => void;\n    public readonly name: string;\n\n    constructor(options: GCManagedHashOptions<T>)\n    {\n        const { renderer, type, onUnload, priority, name } = options;\n\n        this._renderer = renderer;\n        renderer.gc.addResourceHash(this, 'items', type, priority ?? 0);\n        this._onUnload = onUnload;\n        this.name = name;\n    }\n\n    /**\n     * Add an item to the hash. No-op if already added.\n     * @param item\n     * @returns true if the item was added, false if it was already in the hash\n     */\n    public add(item: T): boolean\n    {\n        if (this.items[item.uid]) return false;\n        this.items[item.uid] = item;\n        item.once('unload', this.remove, this);\n        item._gcLastUsed = this._renderer.gc.now;\n\n        return true;\n    }\n\n    public remove(item: T, ...args: unknown[]): void\n    {\n        if (!this.items[item.uid]) return;\n\n        const gpuData = item._gpuData[this._renderer.uid];\n\n        if (!gpuData) return;\n\n        this._onUnload?.(item, ...args);\n\n        gpuData.destroy();\n        item._gpuData[this._renderer.uid] = null;\n        this.items[item.uid] = null;\n    }\n\n    public removeAll(...args: unknown[]): void\n    {\n        Object.values(this.items).forEach((item) => item && this.remove(item, ...args));\n    }\n\n    public destroy(...args: unknown[]): void\n    {\n        this.removeAll(...args);\n        this.items = Object.create(null);\n        this._renderer = null;\n        this._onUnload = null;\n    }\n}\n"],"names":[],"mappings":";AAsBO,MAAM,aAAA,CACb;AAAA,EAOI,YAAY,OAAA,EACZ;AANA;AAAA,IAAA,IAAA,CAAO,KAAA,mBAA2B,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAOhD,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,MAAK,GAAI,OAAA;AAErD,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,IAAA,QAAA,CAAS,GAAG,eAAA,CAAgB,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,YAAY,CAAC,CAAA;AAC9D,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,IAAI,IAAA,EACX;AACI,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,GAAG,OAAO,KAAA;AACjC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AACvB,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,GAAA;AAErC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEO,MAAA,CAAO,SAAY,IAAA,EAC1B;AACI,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AAE3B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,UAAU,GAAG,CAAA;AAEhD,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,EAAM,GAAG,IAAI,CAAA;AAE9B,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,GAAI,IAAA;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,EAC3B;AAAA,EAEO,aAAa,IAAA,EACpB;AACI,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,GAAG,IAAI,CAAC,CAAA;AAAA,EAClF;AAAA,EAEO,WAAW,IAAA,EAClB;AACI,IAAA,IAAA,CAAK,SAAA,CAAU,GAAG,IAAI,CAAA;AACtB,IAAA,IAAA,CAAK,KAAA,mBAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACrB;AACJ;;;;"}