@oasys/oecs 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1399 -276
- package/README.md +327 -169
- package/dist/core/ecs/access_check.d.cts +31 -31
- package/dist/core/ecs/access_check.d.ts +31 -31
- package/dist/core/ecs/access_check.d.ts.map +1 -1
- package/dist/core/ecs/archetype.d.cts +273 -205
- package/dist/core/ecs/archetype.d.ts +273 -205
- package/dist/core/ecs/archetype.d.ts.map +1 -1
- package/dist/core/ecs/archetype_closure.d.cts +23 -0
- package/dist/core/ecs/archetype_closure.d.ts +23 -0
- package/dist/core/ecs/archetype_closure.d.ts.map +1 -0
- package/dist/core/ecs/archetype_graph.d.cts +34 -34
- package/dist/core/ecs/archetype_graph.d.ts +34 -34
- package/dist/core/ecs/archetype_graph.d.ts.map +1 -1
- package/dist/core/ecs/archetype_types.d.cts +55 -0
- package/dist/core/ecs/archetype_types.d.ts +55 -0
- package/dist/core/ecs/archetype_types.d.ts.map +1 -0
- package/dist/core/ecs/change_feed.d.cts +53 -0
- package/dist/core/ecs/change_feed.d.ts +53 -0
- package/dist/core/ecs/change_feed.d.ts.map +1 -0
- package/dist/core/ecs/changed_query.d.cts +36 -0
- package/dist/core/ecs/changed_query.d.ts +36 -0
- package/dist/core/ecs/changed_query.d.ts.map +1 -0
- package/dist/core/ecs/chunk_columns.d.cts +49 -0
- package/dist/core/ecs/chunk_columns.d.ts +49 -0
- package/dist/core/ecs/chunk_columns.d.ts.map +1 -0
- package/dist/core/ecs/command_log.d.cts +30 -30
- package/dist/core/ecs/command_log.d.ts +30 -30
- package/dist/core/ecs/command_log.d.ts.map +1 -1
- package/dist/core/ecs/component.d.cts +45 -44
- package/dist/core/ecs/component.d.ts +45 -44
- package/dist/core/ecs/component.d.ts.map +1 -1
- package/dist/core/ecs/component_registry.d.cts +53 -0
- package/dist/core/ecs/component_registry.d.ts +53 -0
- package/dist/core/ecs/component_registry.d.ts.map +1 -0
- package/dist/core/ecs/compute_backend.d.cts +18 -7
- package/dist/core/ecs/compute_backend.d.ts +18 -7
- package/dist/core/ecs/compute_backend.d.ts.map +1 -1
- package/dist/core/ecs/deferred_commands.d.cts +15 -14
- package/dist/core/ecs/deferred_commands.d.ts +15 -14
- package/dist/core/ecs/deferred_commands.d.ts.map +1 -1
- package/dist/core/ecs/dispatch_trace.d.cts +32 -31
- package/dist/core/ecs/dispatch_trace.d.ts +32 -31
- package/dist/core/ecs/dispatch_trace.d.ts.map +1 -1
- package/dist/core/ecs/ecs.d.cts +337 -276
- package/dist/core/ecs/ecs.d.ts +337 -276
- package/dist/core/ecs/ecs.d.ts.map +1 -1
- package/dist/core/ecs/ecs_memory.d.cts +134 -136
- package/dist/core/ecs/ecs_memory.d.ts +134 -136
- package/dist/core/ecs/ecs_memory.d.ts.map +1 -1
- package/dist/core/ecs/ecs_options.d.cts +89 -0
- package/dist/core/ecs/ecs_options.d.ts +89 -0
- package/dist/core/ecs/ecs_options.d.ts.map +1 -0
- package/dist/core/ecs/entity.d.cts +4 -4
- package/dist/core/ecs/entity.d.ts +4 -4
- package/dist/core/ecs/entity_allocator.d.cts +24 -22
- package/dist/core/ecs/entity_allocator.d.ts +24 -22
- package/dist/core/ecs/entity_allocator.d.ts.map +1 -1
- package/dist/core/ecs/event.d.cts +37 -23
- package/dist/core/ecs/event.d.ts +37 -23
- package/dist/core/ecs/event.d.ts.map +1 -1
- package/dist/core/ecs/facades.d.cts +12 -126
- package/dist/core/ecs/facades.d.ts +12 -126
- package/dist/core/ecs/facades.d.ts.map +1 -1
- package/dist/core/ecs/frame_stepper.d.cts +12 -12
- package/dist/core/ecs/frame_stepper.d.ts +12 -12
- package/dist/core/ecs/frame_stepper.d.ts.map +1 -1
- package/dist/core/ecs/frame_trace.d.cts +34 -34
- package/dist/core/ecs/frame_trace.d.ts +34 -34
- package/dist/core/ecs/frame_trace.d.ts.map +1 -1
- package/dist/core/ecs/host_commands.d.cts +107 -89
- package/dist/core/ecs/host_commands.d.ts +107 -89
- package/dist/core/ecs/host_commands.d.ts.map +1 -1
- package/dist/core/ecs/index.d.cts +22 -12
- package/dist/core/ecs/index.d.ts +22 -12
- package/dist/core/ecs/index.d.ts.map +1 -1
- package/dist/core/ecs/observer.d.cts +41 -122
- package/dist/core/ecs/observer.d.ts +41 -122
- package/dist/core/ecs/observer.d.ts.map +1 -1
- package/dist/core/ecs/phase.d.cts +79 -0
- package/dist/core/ecs/phase.d.ts +79 -0
- package/dist/core/ecs/phase.d.ts.map +1 -0
- package/dist/core/ecs/plugin.d.cts +125 -0
- package/dist/core/ecs/plugin.d.ts +125 -0
- package/dist/core/ecs/plugin.d.ts.map +1 -0
- package/dist/core/ecs/plugin_slots.d.cts +26 -0
- package/dist/core/ecs/plugin_slots.d.ts +26 -0
- package/dist/core/ecs/plugin_slots.d.ts.map +1 -0
- package/dist/core/ecs/query.d.cts +219 -568
- package/dist/core/ecs/query.d.ts +219 -568
- package/dist/core/ecs/query.d.ts.map +1 -1
- package/dist/core/ecs/query_cache.d.cts +130 -0
- package/dist/core/ecs/query_cache.d.ts +130 -0
- package/dist/core/ecs/query_cache.d.ts.map +1 -0
- package/dist/core/ecs/query_registry.d.cts +47 -0
- package/dist/core/ecs/query_registry.d.ts +47 -0
- package/dist/core/ecs/query_registry.d.ts.map +1 -0
- package/dist/core/ecs/query_terms.d.cts +126 -0
- package/dist/core/ecs/query_terms.d.ts +126 -0
- package/dist/core/ecs/query_terms.d.ts.map +1 -0
- package/dist/core/ecs/ref.d.cts +129 -16
- package/dist/core/ecs/ref.d.ts +129 -16
- package/dist/core/ecs/ref.d.ts.map +1 -1
- package/dist/core/ecs/relation.d.cts +105 -186
- package/dist/core/ecs/relation.d.ts +105 -186
- package/dist/core/ecs/relation.d.ts.map +1 -1
- package/dist/core/ecs/resource.d.cts +14 -14
- package/dist/core/ecs/resource.d.ts +14 -14
- package/dist/core/ecs/resource_registry.d.cts +6 -6
- package/dist/core/ecs/resource_registry.d.ts +6 -6
- package/dist/core/ecs/resource_registry.d.ts.map +1 -1
- package/dist/core/ecs/row_kinds.d.cts +24 -0
- package/dist/core/ecs/row_kinds.d.ts +24 -0
- package/dist/core/ecs/row_kinds.d.ts.map +1 -0
- package/dist/core/ecs/run_condition.d.cts +23 -23
- package/dist/core/ecs/run_condition.d.ts +23 -23
- package/dist/core/ecs/run_condition.d.ts.map +1 -1
- package/dist/core/ecs/schedule.d.cts +98 -114
- package/dist/core/ecs/schedule.d.ts +98 -114
- package/dist/core/ecs/schedule.d.ts.map +1 -1
- package/dist/core/ecs/schedule_plan.d.cts +33 -0
- package/dist/core/ecs/schedule_plan.d.ts +33 -0
- package/dist/core/ecs/schedule_plan.d.ts.map +1 -0
- package/dist/core/ecs/snapshot.d.cts +77 -0
- package/dist/core/ecs/snapshot.d.ts +77 -0
- package/dist/core/ecs/snapshot.d.ts.map +1 -0
- package/dist/core/ecs/snapshot_mount.d.cts +42 -0
- package/dist/core/ecs/snapshot_mount.d.ts +42 -0
- package/dist/core/ecs/snapshot_mount.d.ts.map +1 -0
- package/dist/core/ecs/sparse_store.d.cts +110 -53
- package/dist/core/ecs/sparse_store.d.ts +110 -53
- package/dist/core/ecs/sparse_store.d.ts.map +1 -1
- package/dist/core/ecs/store.d.cts +644 -511
- package/dist/core/ecs/store.d.ts +644 -511
- package/dist/core/ecs/store.d.ts.map +1 -1
- package/dist/core/ecs/store_layout_listener.d.cts +8 -8
- package/dist/core/ecs/store_layout_listener.d.ts +8 -8
- package/dist/core/ecs/store_types.d.cts +122 -0
- package/dist/core/ecs/store_types.d.ts +122 -0
- package/dist/core/ecs/store_types.d.ts.map +1 -0
- package/dist/core/ecs/system.d.cts +151 -66
- package/dist/core/ecs/system.d.ts +151 -66
- package/dist/core/ecs/system.d.ts.map +1 -1
- package/dist/core/ecs/system_context.d.cts +296 -0
- package/dist/core/ecs/system_context.d.ts +296 -0
- package/dist/core/ecs/system_context.d.ts.map +1 -0
- package/dist/core/ecs/system_set.d.cts +48 -0
- package/dist/core/ecs/system_set.d.ts +48 -0
- package/dist/core/ecs/system_set.d.ts.map +1 -0
- package/dist/core/ecs/utils/arrays.d.cts +15 -1
- package/dist/core/ecs/utils/arrays.d.ts +15 -1
- package/dist/core/ecs/utils/arrays.d.ts.map +1 -1
- package/dist/core/ecs/utils/error.d.cts +87 -4
- package/dist/core/ecs/utils/error.d.ts +87 -4
- package/dist/core/ecs/utils/error.d.ts.map +1 -1
- package/dist/core/ecs/utils/plugin_error.d.cts +10 -0
- package/dist/core/ecs/utils/plugin_error.d.ts +10 -0
- package/dist/core/ecs/utils/plugin_error.d.ts.map +1 -0
- package/dist/core/restore_errors.d.cts +30 -0
- package/dist/core/restore_errors.d.ts +30 -0
- package/dist/core/restore_errors.d.ts.map +1 -0
- package/dist/core/store/action_ring.d.cts +48 -49
- package/dist/core/store/action_ring.d.ts +48 -49
- package/dist/core/store/action_ring.d.ts.map +1 -1
- package/dist/core/store/allocator.d.cts +166 -114
- package/dist/core/store/allocator.d.ts +166 -114
- package/dist/core/store/allocator.d.ts.map +1 -1
- package/dist/core/store/buffer_backed_column.d.cts +21 -22
- package/dist/core/store/buffer_backed_column.d.ts +21 -22
- package/dist/core/store/buffer_backed_column.d.ts.map +1 -1
- package/dist/core/store/column_store.d.cts +138 -100
- package/dist/core/store/column_store.d.ts +138 -100
- package/dist/core/store/column_store.d.ts.map +1 -1
- package/dist/core/store/command_dispatch.d.cts +14 -15
- package/dist/core/store/command_dispatch.d.ts +14 -15
- package/dist/core/store/command_dispatch.d.ts.map +1 -1
- package/dist/core/store/command_ring.d.cts +41 -45
- package/dist/core/store/command_ring.d.ts +41 -45
- package/dist/core/store/command_ring.d.ts.map +1 -1
- package/dist/core/store/descriptor.d.cts +35 -18
- package/dist/core/store/descriptor.d.ts +35 -18
- package/dist/core/store/descriptor.d.ts.map +1 -1
- package/dist/core/store/entity_index.d.cts +34 -35
- package/dist/core/store/entity_index.d.ts +34 -35
- package/dist/core/store/entity_index.d.ts.map +1 -1
- package/dist/core/store/event_ring.d.cts +40 -42
- package/dist/core/store/event_ring.d.ts +40 -42
- package/dist/core/store/event_ring.d.ts.map +1 -1
- package/dist/core/store/extend.d.cts +15 -9
- package/dist/core/store/extend.d.ts +15 -9
- package/dist/core/store/extend.d.ts.map +1 -1
- package/dist/core/store/grow.d.cts +3 -3
- package/dist/core/store/grow.d.ts +3 -3
- package/dist/core/store/grow.d.ts.map +1 -1
- package/dist/core/store/header.d.cts +37 -33
- package/dist/core/store/header.d.ts +37 -33
- package/dist/core/store/header.d.ts.map +1 -1
- package/dist/core/store/index.d.cts +10 -10
- package/dist/core/store/index.d.ts +10 -10
- package/dist/core/store/index.d.ts.map +1 -1
- package/dist/core/store/layout_ops.d.cts +72 -63
- package/dist/core/store/layout_ops.d.ts +72 -63
- package/dist/core/store/layout_ops.d.ts.map +1 -1
- package/dist/core/store/region_table.d.cts +28 -21
- package/dist/core/store/region_table.d.ts +28 -21
- package/dist/core/store/region_table.d.ts.map +1 -1
- package/dist/core/store/snapshot.d.cts +31 -16
- package/dist/core/store/snapshot.d.ts +31 -16
- package/dist/core/store/snapshot.d.ts.map +1 -1
- package/dist/core/store/state_hash.d.cts +14 -14
- package/dist/core/store/state_hash.d.ts +14 -14
- package/dist/core/store/state_hash.d.ts.map +1 -1
- package/dist/core/store/store_regions.d.cts +10 -10
- package/dist/core/store/store_regions.d.ts +10 -10
- package/dist/core/store/store_regions.d.ts.map +1 -1
- package/dist/core/store/vendored_abi/abi.d.cts +27 -2
- package/dist/core/store/vendored_abi/abi.d.ts +27 -2
- package/dist/core/store/vendored_abi/abi.d.ts.map +1 -1
- package/dist/host_commands-B2KMx8O2.cjs +1 -0
- package/dist/host_commands-ClVPvhSa.cjs +2 -0
- package/dist/host_commands-CwxVQS1z.js +1524 -0
- package/dist/host_commands-nJvTy88E.js +1667 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +16 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.development.cjs +1 -1
- package/dist/index.development.js +6709 -5729
- package/dist/index.js +5664 -4743
- package/dist/internal.cjs +2 -2
- package/dist/internal.d.cts +5 -2
- package/dist/internal.d.ts +5 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.development.cjs +1 -1
- package/dist/internal.development.js +70 -20
- package/dist/internal.js +138 -83
- package/dist/plugins/abi-D3V-QUSf.cjs +1 -0
- package/dist/plugins/abi-NP8pNxpd.js +42 -0
- package/dist/plugins/arrays-Dr_1hCjL.js +28 -0
- package/dist/plugins/arrays-Dt-Joc4i.cjs +1 -0
- package/dist/plugins/assertions-gtDVfbnQ.js +6 -0
- package/dist/plugins/assertions-z5GQd_bB.cjs +1 -0
- package/dist/{extensions → plugins}/editor/editor.d.cts +56 -56
- package/dist/{extensions → plugins}/editor/editor.d.ts +56 -56
- package/dist/plugins/editor/editor.d.ts.map +1 -0
- package/dist/{extensions → plugins}/editor/field_handle.d.cts +13 -13
- package/dist/{extensions → plugins}/editor/field_handle.d.ts +13 -13
- package/dist/plugins/editor/field_handle.d.ts.map +1 -0
- package/dist/plugins/editor/index.d.cts +22 -0
- package/dist/plugins/editor/index.d.ts +22 -0
- package/dist/plugins/editor/index.d.ts.map +1 -0
- package/dist/plugins/editor.cjs +1 -0
- package/dist/plugins/editor.d.cts +1 -0
- package/dist/plugins/editor.d.ts +1 -0
- package/dist/plugins/editor.development.cjs +1 -0
- package/dist/{extensions/editor/index.development.js → plugins/editor.development.js} +83 -66
- package/dist/{extensions/editor/index.js → plugins/editor.js} +83 -66
- package/dist/plugins/events/event_channel.d.cts +13 -0
- package/dist/plugins/events/event_channel.d.ts +13 -0
- package/dist/plugins/events/event_channel.d.ts.map +1 -0
- package/dist/plugins/events/event_registry.d.cts +22 -0
- package/dist/plugins/events/event_registry.d.ts +22 -0
- package/dist/plugins/events/event_registry.d.ts.map +1 -0
- package/dist/plugins/events/facade.d.cts +26 -0
- package/dist/plugins/events/facade.d.ts +26 -0
- package/dist/plugins/events/facade.d.ts.map +1 -0
- package/dist/plugins/events/index.d.cts +10 -0
- package/dist/plugins/events/index.d.ts +10 -0
- package/dist/plugins/events/index.d.ts.map +1 -0
- package/dist/plugins/events.cjs +1 -0
- package/dist/plugins/events.d.cts +1 -0
- package/dist/plugins/events.d.ts +1 -0
- package/dist/plugins/events.development.cjs +1 -0
- package/dist/plugins/events.development.js +174 -0
- package/dist/plugins/events.js +159 -0
- package/dist/plugins/observers/index.d.cts +23 -0
- package/dist/plugins/observers/index.d.ts +23 -0
- package/dist/plugins/observers/index.d.ts.map +1 -0
- package/dist/plugins/observers/observer_registry.d.cts +101 -0
- package/dist/plugins/observers/observer_registry.d.ts +101 -0
- package/dist/plugins/observers/observer_registry.d.ts.map +1 -0
- package/dist/plugins/observers.cjs +1 -0
- package/dist/plugins/observers.d.cts +1 -0
- package/dist/plugins/observers.d.ts +1 -0
- package/dist/plugins/observers.development.cjs +1 -0
- package/dist/plugins/observers.development.js +431 -0
- package/dist/plugins/observers.js +403 -0
- package/dist/plugins/relation_store-BsoegrZh.js +313 -0
- package/dist/plugins/relation_store-DQKSnxsm.cjs +1 -0
- package/dist/plugins/relation_store-RBhpcE28.cjs +1 -0
- package/dist/plugins/relation_store-RqW5Snx6.js +328 -0
- package/dist/plugins/relations/builtin_relations.d.cts +48 -0
- package/dist/plugins/relations/builtin_relations.d.ts +48 -0
- package/dist/plugins/relations/builtin_relations.d.ts.map +1 -0
- package/dist/plugins/relations/facade.d.cts +73 -0
- package/dist/plugins/relations/facade.d.ts +73 -0
- package/dist/plugins/relations/facade.d.ts.map +1 -0
- package/dist/plugins/relations/index.d.cts +11 -0
- package/dist/plugins/relations/index.d.ts +11 -0
- package/dist/plugins/relations/index.d.ts.map +1 -0
- package/dist/{core/ecs → plugins/relations}/relation_service.d.cts +93 -105
- package/dist/{core/ecs → plugins/relations}/relation_service.d.ts +93 -105
- package/dist/plugins/relations/relation_service.d.ts.map +1 -0
- package/dist/plugins/relations/relation_store.d.cts +177 -0
- package/dist/plugins/relations/relation_store.d.ts +177 -0
- package/dist/plugins/relations/relation_store.d.ts.map +1 -0
- package/dist/plugins/relations.cjs +1 -0
- package/dist/plugins/relations.d.cts +1 -0
- package/dist/plugins/relations.d.ts +1 -0
- package/dist/plugins/relations.development.cjs +1 -0
- package/dist/plugins/relations.development.js +603 -0
- package/dist/plugins/relations.js +553 -0
- package/dist/plugins/snapshots/index.d.cts +33 -0
- package/dist/plugins/snapshots/index.d.ts +33 -0
- package/dist/plugins/snapshots/index.d.ts.map +1 -0
- package/dist/plugins/snapshots/resume.d.cts +57 -0
- package/dist/plugins/snapshots/resume.d.ts +57 -0
- package/dist/plugins/snapshots/resume.d.ts.map +1 -0
- package/dist/plugins/snapshots/snapshot_service.d.cts +59 -0
- package/dist/plugins/snapshots/snapshot_service.d.ts +59 -0
- package/dist/plugins/snapshots/snapshot_service.d.ts.map +1 -0
- package/dist/plugins/snapshots.cjs +1 -0
- package/dist/plugins/snapshots.d.cts +1 -0
- package/dist/plugins/snapshots.d.ts +1 -0
- package/dist/plugins/snapshots.development.cjs +1 -0
- package/dist/plugins/snapshots.development.js +737 -0
- package/dist/plugins/snapshots.js +737 -0
- package/dist/plugins/solid/index.d.cts +8 -0
- package/dist/plugins/solid/index.d.ts +8 -0
- package/dist/plugins/solid/index.d.ts.map +1 -0
- package/dist/plugins/solid/solid.d.cts +97 -0
- package/dist/plugins/solid/solid.d.ts +97 -0
- package/dist/plugins/solid/solid.d.ts.map +1 -0
- package/dist/plugins/solid.cjs +1 -0
- package/dist/plugins/solid.d.cts +1 -0
- package/dist/plugins/solid.d.ts +1 -0
- package/dist/plugins/solid.development.cjs +1 -0
- package/dist/plugins/solid.development.js +319 -0
- package/dist/plugins/solid.js +319 -0
- package/dist/plugins/workers/index.d.cts +75 -0
- package/dist/plugins/workers/index.d.ts +75 -0
- package/dist/plugins/workers/index.d.ts.map +1 -0
- package/dist/plugins/workers/node_threads.d.cts +25 -0
- package/dist/plugins/workers/node_threads.d.ts +25 -0
- package/dist/plugins/workers/node_threads.d.ts.map +1 -0
- package/dist/plugins/workers/plan.d.cts +61 -0
- package/dist/plugins/workers/plan.d.ts +61 -0
- package/dist/plugins/workers/plan.d.ts.map +1 -0
- package/dist/plugins/workers/pool.d.cts +144 -0
- package/dist/plugins/workers/pool.d.ts +144 -0
- package/dist/plugins/workers/pool.d.ts.map +1 -0
- package/dist/plugins/workers/protocol.d.cts +112 -0
- package/dist/plugins/workers/protocol.d.ts +112 -0
- package/dist/plugins/workers/protocol.d.ts.map +1 -0
- package/dist/plugins/workers/worker_bind.d.cts +64 -0
- package/dist/plugins/workers/worker_bind.d.ts +64 -0
- package/dist/plugins/workers/worker_bind.d.ts.map +1 -0
- package/dist/plugins/workers/worker_loop.d.cts +14 -0
- package/dist/plugins/workers/worker_loop.d.ts +14 -0
- package/dist/plugins/workers/worker_loop.d.ts.map +1 -0
- package/dist/plugins/workers.cjs +1 -0
- package/dist/plugins/workers.d.cts +1 -0
- package/dist/plugins/workers.d.ts +1 -0
- package/dist/plugins/workers.development.cjs +1 -0
- package/dist/plugins/workers.development.js +596 -0
- package/dist/plugins/workers.js +474 -0
- package/dist/primitives.cjs +1 -1
- package/dist/primitives.d.cts +4 -4
- package/dist/primitives.d.ts +4 -4
- package/dist/primitives.development.cjs +1 -1
- package/dist/primitives.development.js +66 -22
- package/dist/primitives.js +66 -22
- package/dist/shared-BKl12xF1.js +132 -0
- package/dist/shared-Dk-pACZT.cjs +1 -0
- package/dist/shared.cjs +1 -1
- package/dist/shared.d.cts +7 -7
- package/dist/shared.d.ts +7 -7
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.development.cjs +1 -1
- package/dist/shared.development.js +4 -3
- package/dist/shared.js +4 -3
- package/dist/topological_sort-Cc_yXqPT.js +346 -0
- package/dist/topological_sort-vp1imU6D.cjs +1 -0
- package/dist/type_primitives/assertions.d.cts +12 -16
- package/dist/type_primitives/assertions.d.ts +12 -16
- package/dist/type_primitives/assertions.d.ts.map +1 -1
- package/dist/type_primitives/binary_heap/binary_heap.d.cts +2 -6
- package/dist/type_primitives/binary_heap/binary_heap.d.ts +2 -6
- package/dist/type_primitives/binary_heap/binary_heap.d.ts.map +1 -1
- package/dist/type_primitives/bitset/bitset.d.cts +7 -11
- package/dist/type_primitives/bitset/bitset.d.ts +7 -11
- package/dist/type_primitives/bitset/bitset.d.ts.map +1 -1
- package/dist/type_primitives/brand.d.cts +2 -7
- package/dist/type_primitives/brand.d.ts +2 -7
- package/dist/type_primitives/brand.d.ts.map +1 -1
- package/dist/type_primitives/error.d.cts +1 -2
- package/dist/type_primitives/error.d.ts +1 -2
- package/dist/type_primitives/error.d.ts.map +1 -1
- package/dist/type_primitives/index.d.cts +1 -1
- package/dist/type_primitives/index.d.ts +1 -1
- package/dist/type_primitives/sparse_map/sparse_map.d.cts +3 -7
- package/dist/type_primitives/sparse_map/sparse_map.d.ts +3 -7
- package/dist/type_primitives/sparse_map/sparse_map.d.ts.map +1 -1
- package/dist/type_primitives/sparse_set/sparse_set.d.cts +2 -6
- package/dist/type_primitives/sparse_set/sparse_set.d.ts +2 -6
- package/dist/type_primitives/sparse_set/sparse_set.d.ts.map +1 -1
- package/dist/type_primitives/topological_sort/topological_sort.d.cts +1 -5
- package/dist/type_primitives/topological_sort/topological_sort.d.ts +1 -5
- package/dist/type_primitives/topological_sort/topological_sort.d.ts.map +1 -1
- package/dist/type_primitives/typed_arrays/typed_arrays.d.cts +18 -17
- package/dist/type_primitives/typed_arrays/typed_arrays.d.ts +18 -17
- package/dist/type_primitives/typed_arrays/typed_arrays.d.ts.map +1 -1
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/version.d.cts +4 -4
- package/dist/version.d.ts +4 -4
- package/dist/worker.cjs +1 -0
- package/dist/worker.d.cts +17 -0
- package/dist/worker.d.ts +17 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.development.cjs +1 -0
- package/dist/worker.development.js +253 -0
- package/dist/worker.js +253 -0
- package/package.json +363 -191
- package/dist/core/ecs/builtin_relations.d.cts +0 -43
- package/dist/core/ecs/builtin_relations.d.ts +0 -43
- package/dist/core/ecs/builtin_relations.d.ts.map +0 -1
- package/dist/core/ecs/event_registry.d.cts +0 -22
- package/dist/core/ecs/event_registry.d.ts +0 -22
- package/dist/core/ecs/event_registry.d.ts.map +0 -1
- package/dist/core/ecs/relation_service.d.ts.map +0 -1
- package/dist/core/ecs/resume.d.cts +0 -85
- package/dist/core/ecs/resume.d.ts +0 -85
- package/dist/core/ecs/resume.d.ts.map +0 -1
- package/dist/core/ecs/snapshot_service.d.cts +0 -94
- package/dist/core/ecs/snapshot_service.d.ts +0 -94
- package/dist/core/ecs/snapshot_service.d.ts.map +0 -1
- package/dist/extensions/editor/editor.d.ts.map +0 -1
- package/dist/extensions/editor/field_handle.d.ts.map +0 -1
- package/dist/extensions/editor/index.cjs +0 -1
- package/dist/extensions/editor/index.d.cts +0 -21
- package/dist/extensions/editor/index.d.ts +0 -21
- package/dist/extensions/editor/index.d.ts.map +0 -1
- package/dist/extensions/editor/index.development.cjs +0 -1
- package/dist/extensions/reactive/ecs_sync.d.cts +0 -214
- package/dist/extensions/reactive/ecs_sync.d.ts +0 -214
- package/dist/extensions/reactive/ecs_sync.d.ts.map +0 -1
- package/dist/extensions/reactive/index.cjs +0 -1
- package/dist/extensions/reactive/index.d.cts +0 -23
- package/dist/extensions/reactive/index.d.ts +0 -23
- package/dist/extensions/reactive/index.d.ts.map +0 -1
- package/dist/extensions/reactive/index.development.cjs +0 -1
- package/dist/extensions/reactive/index.development.js +0 -215
- package/dist/extensions/reactive/index.js +0 -215
- package/dist/extensions/solid/index.cjs +0 -1
- package/dist/extensions/solid/index.d.cts +0 -6
- package/dist/extensions/solid/index.d.ts +0 -6
- package/dist/extensions/solid/index.d.ts.map +0 -1
- package/dist/extensions/solid/index.development.cjs +0 -1
- package/dist/extensions/solid/index.development.js +0 -40
- package/dist/extensions/solid/index.js +0 -36
- package/dist/extensions/solid/kernel_solid.d.cts +0 -45
- package/dist/extensions/solid/kernel_solid.d.ts +0 -45
- package/dist/extensions/solid/kernel_solid.d.ts.map +0 -1
- package/dist/host_commands-3jyFfWNg.js +0 -2326
- package/dist/host_commands-DNf0f6ko.cjs +0 -1
- package/dist/internal-C9jjL90H.js +0 -2485
- package/dist/internal-RZN14uMw.cjs +0 -2
- package/dist/interop-CT-REx0W.cjs +0 -1
- package/dist/interop-CcY6ASQc.js +0 -18
- package/dist/interop-DqxleBo7.js +0 -18
- package/dist/interop-T1HZ-Dpa.cjs +0 -1
- package/dist/kernel-Cz2Kxlwl.js +0 -240
- package/dist/kernel-DgyrLFjW.js +0 -227
- package/dist/kernel-sw7ScKWu.cjs +0 -1
- package/dist/kernel-yWV3XnAb.cjs +0 -1
- package/dist/reactive/array.d.cts +0 -24
- package/dist/reactive/array.d.ts +0 -24
- package/dist/reactive/array.d.ts.map +0 -1
- package/dist/reactive/index.cjs +0 -1
- package/dist/reactive/index.d.cts +0 -11
- package/dist/reactive/index.d.ts +0 -11
- package/dist/reactive/index.d.ts.map +0 -1
- package/dist/reactive/index.development.cjs +0 -1
- package/dist/reactive/index.development.js +0 -18
- package/dist/reactive/index.js +0 -18
- package/dist/reactive/interop.d.cts +0 -19
- package/dist/reactive/interop.d.ts +0 -19
- package/dist/reactive/interop.d.ts.map +0 -1
- package/dist/reactive/kernel.d.cts +0 -73
- package/dist/reactive/kernel.d.ts +0 -73
- package/dist/reactive/kernel.d.ts.map +0 -1
- package/dist/reactive/map.d.cts +0 -16
- package/dist/reactive/map.d.ts +0 -16
- package/dist/reactive/map.d.ts.map +0 -1
- package/dist/reactive/shallow.d.cts +0 -11
- package/dist/reactive/shallow.d.ts +0 -11
- package/dist/reactive/shallow.d.ts.map +0 -1
- package/dist/reactive/struct.d.cts +0 -10
- package/dist/reactive/struct.d.ts +0 -10
- package/dist/reactive/struct.d.ts.map +0 -1
- package/dist/shallow-9S1pY_Iw.js +0 -159
- package/dist/shallow-C5YmTbtb.cjs +0 -1
- package/dist/shallow-DQ8aG51_.cjs +0 -1
- package/dist/shallow-DfnAm9vG.js +0 -150
- package/dist/shared-BMXh9hxm.cjs +0 -1
- package/dist/shared-DQKK0i-E.js +0 -109
- package/dist/topological_sort-BDvEyb9W.cjs +0 -1
- package/dist/topological_sort-DK6EjpWa.js +0 -135
- package/dist/typed_arrays-BcXcnzB4.js +0 -258
- package/dist/typed_arrays-D3NmwtCG.cjs +0 -1
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { SparseRestoreError as u } from "../index.js";
|
|
2
|
+
import { u as c } from "./assertions-gtDVfbnQ.js";
|
|
3
|
+
const z = -1;
|
|
4
|
+
Object.freeze(/* @__PURE__ */ Object.create(null));
|
|
5
|
+
const F = 31, E = 20, p = (1 << E) - 1, R = p, $ = F - E, y = (1 << $) - 1, S = y << E | R, B = (a, r) => c(r << E | a), f = (a) => a & p, G = "orphan", C = "target", O = Object.freeze({});
|
|
6
|
+
class U {
|
|
7
|
+
/** `true` → one target per source, held in the sparse field. `false` →
|
|
8
|
+
* a set of targets per source. The cardinality discriminant survives as a
|
|
9
|
+
* field because the snapshot header and the traversal and `targetOf`
|
|
10
|
+
* mode guards carry it. The forward mechanics stay virtual, never branched
|
|
11
|
+
* on it. */
|
|
12
|
+
exclusive;
|
|
13
|
+
/** Backing sparse component def: `{ target: f64 }` when exclusive, a tag when
|
|
14
|
+
* multi. Carries membership (and the target, when exclusive). */
|
|
15
|
+
sparse;
|
|
16
|
+
/** Cleanup policy applied to this relation's sources when a target is
|
|
17
|
+
* destroyed. `orphan` (the default) is a no-op, the link dangles
|
|
18
|
+
* safely. `Store` reads this at destroy-flush off `sourcesOf`. */
|
|
19
|
+
onDeleteTarget;
|
|
20
|
+
/** The backing sparse store instance. Owned for registration and liveness by
|
|
21
|
+
* `Store`, but the relation drives the forward and membership rows on it directly.
|
|
22
|
+
* That is the cardinality interaction this class now encapsulates. */
|
|
23
|
+
_store;
|
|
24
|
+
/** target `EntityID` → set of source `EntityID`s. Keyed by the full id, not
|
|
25
|
+
* the index, so a recycled target slot can't alias a dead target's sources.
|
|
26
|
+
* An entry is dropped the moment its set empties (`_unlinkReverse`). */
|
|
27
|
+
_reverse = /* @__PURE__ */ new Map();
|
|
28
|
+
constructor(r, t, e, s) {
|
|
29
|
+
this.exclusive = r, this.sparse = t, this._store = e, this.onDeleteTarget = s;
|
|
30
|
+
}
|
|
31
|
+
// --- shared reverse index (cardinality-agnostic) ---
|
|
32
|
+
/** Record that `src` points at `tgt` in the reverse index. */
|
|
33
|
+
_linkReverse(r, t) {
|
|
34
|
+
let e = this._reverse.get(r);
|
|
35
|
+
e === void 0 && (e = /* @__PURE__ */ new Set(), this._reverse.set(r, e)), e.add(t);
|
|
36
|
+
}
|
|
37
|
+
/** Drop the `src → tgt` edge from the reverse index, removing the target's
|
|
38
|
+
* entry entirely once its last source is gone (so a dead-target key doesn't
|
|
39
|
+
* linger with an empty set). */
|
|
40
|
+
_unlinkReverse(r, t) {
|
|
41
|
+
const e = this._reverse.get(r);
|
|
42
|
+
e !== void 0 && (e.delete(t), e.size === 0 && this._reverse.delete(r));
|
|
43
|
+
}
|
|
44
|
+
/** Drop every reverse-index entry whose **target** is no longer alive,
|
|
45
|
+
* returning the count dropped. The `orphan` policy intentionally
|
|
46
|
+
* leaves a destroyed target's reverse entry intact (the link dangles
|
|
47
|
+
* safely), so a long-lived source that orphan-points at a stream of
|
|
48
|
+
* short-lived targets and never re-targets or dies accumulates dead-target keys
|
|
49
|
+
* without bound. This is the reclaim primitive behind `ecs.relations.compact`,
|
|
50
|
+
* a cold path the host calls at scene and snapshot boundaries. It is
|
|
51
|
+
* cardinality-free (reverse-index only), so it lives on the base unchanged.
|
|
52
|
+
*
|
|
53
|
+
* Pure index reclaim: the **forward** links (the exclusive sparse target
|
|
54
|
+
* field, the multi forward set) are left untouched, so `targetOf` and
|
|
55
|
+
* `targetsOf` still return the dangling dead handle exactly as `orphan`
|
|
56
|
+
* promises. The reverse index is derived, so dropping a dead-target entry
|
|
57
|
+
* changes nothing observable except `sourcesOf` on that dead handle (which
|
|
58
|
+
* goes from the dangling sources to `[]`, meaningless either way, the target
|
|
59
|
+
* is gone) and is faithfully rebuilt by snapshot and restore from the surviving
|
|
60
|
+
* forward links. Only the **target** role can leak here: a destroyed *source*
|
|
61
|
+
* is already unlinked from every reverse set by `purgeSource`, so a live
|
|
62
|
+
* target's set never holds a dead source. `isAlive` is supplied by `Store`,
|
|
63
|
+
* which owns entity liveness. Deleting during `Map` key iteration is
|
|
64
|
+
* well-defined, already-visited and not-yet-reached keys are unaffected. */
|
|
65
|
+
pruneDeadReverse(r) {
|
|
66
|
+
let t = 0;
|
|
67
|
+
for (const e of this._reverse.keys())
|
|
68
|
+
r(c(e)) || (this._reverse.delete(e), t++);
|
|
69
|
+
return t;
|
|
70
|
+
}
|
|
71
|
+
/** Sources that point at `tgt`, ascending by id (deterministic, cold-path
|
|
72
|
+
* sort), empty when none. */
|
|
73
|
+
sourcesOf(r) {
|
|
74
|
+
const t = this._reverse.get(r);
|
|
75
|
+
if (t === void 0 || t.size === 0) return [];
|
|
76
|
+
const e = new Array(t.size);
|
|
77
|
+
let s = 0;
|
|
78
|
+
return t.forEach((n) => {
|
|
79
|
+
e[s++] = c(n);
|
|
80
|
+
}), e.sort((n, o) => n - o), e;
|
|
81
|
+
}
|
|
82
|
+
/** Drop every derived side index, the reverse index and (for multi) the
|
|
83
|
+
* forward target sets. Restore path only (`restoreRelations`): the side
|
|
84
|
+
* indices are rebuilt from scratch, so they're cleared first to stay
|
|
85
|
+
* idempotent when restoring into a dirty world. The backing sparse store is
|
|
86
|
+
* cleared separately by `restoreSparseStores`. */
|
|
87
|
+
resetIndices() {
|
|
88
|
+
this._reverse.clear(), this._resetForward();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
class M extends U {
|
|
92
|
+
constructor(r, t, e) {
|
|
93
|
+
super(!0, r, t, e);
|
|
94
|
+
}
|
|
95
|
+
_resetForward() {
|
|
96
|
+
}
|
|
97
|
+
link(r, t) {
|
|
98
|
+
const e = f(r), s = this._store.getField(e, 0);
|
|
99
|
+
if (s !== void 0) {
|
|
100
|
+
if (s === t) return;
|
|
101
|
+
this._unlinkReverse(c(s), r);
|
|
102
|
+
}
|
|
103
|
+
this._store.setRow(e, { [C]: t }), this._linkReverse(t, r);
|
|
104
|
+
}
|
|
105
|
+
unlink(r, t) {
|
|
106
|
+
const e = f(r), s = this._store.getField(e, 0);
|
|
107
|
+
s !== void 0 && (t !== void 0 && s !== t || (this._unlinkReverse(c(s), r), this._store.remove(e)));
|
|
108
|
+
}
|
|
109
|
+
purgeSource(r) {
|
|
110
|
+
const t = f(r), e = this._store.getField(t, 0);
|
|
111
|
+
e !== void 0 && this._unlinkReverse(c(e), r);
|
|
112
|
+
}
|
|
113
|
+
singleTargetAt(r) {
|
|
114
|
+
const t = this._store.getField(r, 0);
|
|
115
|
+
return t === void 0 ? void 0 : c(t);
|
|
116
|
+
}
|
|
117
|
+
targetsAt(r) {
|
|
118
|
+
const t = this._store.getField(r, 0);
|
|
119
|
+
return t === void 0 ? [] : [c(t)];
|
|
120
|
+
}
|
|
121
|
+
hasIndex(r) {
|
|
122
|
+
return this._store.has(r);
|
|
123
|
+
}
|
|
124
|
+
forEachCanonicalTargetSet(r) {
|
|
125
|
+
}
|
|
126
|
+
forEachCanonicalPair(r, t) {
|
|
127
|
+
const e = this._store.canonicalIndices();
|
|
128
|
+
for (let s = 0; s < e.length; s++) {
|
|
129
|
+
const n = e[s];
|
|
130
|
+
t(r(n), c(this._store.getField(n, 0)));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
rebuildReverse(r) {
|
|
134
|
+
const t = this._store.indices;
|
|
135
|
+
for (let e = 0; e < t.length; e++) {
|
|
136
|
+
const s = t[e];
|
|
137
|
+
this._linkReverse(c(this._store.getField(s, 0)), r(s));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
restoreAddTarget() {
|
|
141
|
+
throw new u(
|
|
142
|
+
"exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)"
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
class b extends U {
|
|
147
|
+
/** source entity **index** → set of target `EntityID`s. Keyed by source index
|
|
148
|
+
* so destroy-purge, which has the freed index, can drop it in O(1). An
|
|
149
|
+
* entry is removed the moment its set empties. */
|
|
150
|
+
_forward = /* @__PURE__ */ new Map();
|
|
151
|
+
constructor(r, t, e) {
|
|
152
|
+
super(!1, r, t, e);
|
|
153
|
+
}
|
|
154
|
+
_resetForward() {
|
|
155
|
+
this._forward.clear();
|
|
156
|
+
}
|
|
157
|
+
link(r, t) {
|
|
158
|
+
const e = f(r);
|
|
159
|
+
let s = this._forward.get(e);
|
|
160
|
+
s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(e, s), this._store.setRow(e, O)), s.add(t), this._linkReverse(t, r);
|
|
161
|
+
}
|
|
162
|
+
unlink(r, t) {
|
|
163
|
+
const e = f(r), s = this._forward.get(e);
|
|
164
|
+
if (s !== void 0) {
|
|
165
|
+
if (t === void 0) {
|
|
166
|
+
this._forward.delete(e), s.forEach((n) => this._unlinkReverse(c(n), r)), this._store.remove(e);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
s.has(t) && (s.delete(t), this._unlinkReverse(t, r), s.size === 0 && (this._forward.delete(e), this._store.remove(e)));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
purgeSource(r) {
|
|
173
|
+
const t = f(r), e = this._forward.get(t);
|
|
174
|
+
e !== void 0 && (this._forward.delete(t), e.forEach((s) => this._unlinkReverse(c(s), r)));
|
|
175
|
+
}
|
|
176
|
+
singleTargetAt() {
|
|
177
|
+
}
|
|
178
|
+
targetsAt(r) {
|
|
179
|
+
const t = this._forward.get(r);
|
|
180
|
+
if (t === void 0 || t.size === 0) return [];
|
|
181
|
+
const e = new Array(t.size);
|
|
182
|
+
let s = 0;
|
|
183
|
+
return t.forEach((n) => {
|
|
184
|
+
e[s++] = c(n);
|
|
185
|
+
}), e.sort((n, o) => n - o), e;
|
|
186
|
+
}
|
|
187
|
+
hasIndex(r) {
|
|
188
|
+
return this._store.has(r);
|
|
189
|
+
}
|
|
190
|
+
forEachCanonicalTargetSet(r) {
|
|
191
|
+
const t = Array.from(this._forward.keys()).sort((e, s) => e - s);
|
|
192
|
+
for (let e = 0; e < t.length; e++) {
|
|
193
|
+
const s = this.targetsAt(t[e]);
|
|
194
|
+
s.length !== 0 && r(t[e], s);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
forEachCanonicalPair(r, t) {
|
|
198
|
+
this.forEachCanonicalTargetSet((e, s) => {
|
|
199
|
+
const n = r(e);
|
|
200
|
+
for (let o = 0; o < s.length; o++) t(n, s[o]);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
rebuildReverse() {
|
|
204
|
+
}
|
|
205
|
+
restoreAddTarget(r, t, e) {
|
|
206
|
+
let s = this._forward.get(r);
|
|
207
|
+
s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(r, s)), s.add(t), this._linkReverse(t, e);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function Y(a, r, t, e) {
|
|
211
|
+
return a ? new M(r, t, e) : new b(r, t, e);
|
|
212
|
+
}
|
|
213
|
+
const k = 4, m = 4, D = 8, w = 8;
|
|
214
|
+
function P(a) {
|
|
215
|
+
const r = new Array(a.length);
|
|
216
|
+
let t = 4;
|
|
217
|
+
for (let o = 0; o < a.length; o++) {
|
|
218
|
+
t += k;
|
|
219
|
+
const h = a[o];
|
|
220
|
+
if (h.exclusive) {
|
|
221
|
+
r[o] = null;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const i = [];
|
|
225
|
+
h.forEachCanonicalTargetSet((l, d) => i.push([l, d])), r[o] = i, t += m;
|
|
226
|
+
for (let l = 0; l < i.length; l++)
|
|
227
|
+
t += D + i[l][1].length * w;
|
|
228
|
+
}
|
|
229
|
+
const e = new Uint8Array(t), s = new DataView(e.buffer);
|
|
230
|
+
let n = 0;
|
|
231
|
+
s.setUint32(n, a.length, !0), n += 4;
|
|
232
|
+
for (let o = 0; o < a.length; o++) {
|
|
233
|
+
s.setUint32(n, a[o].exclusive ? 0 : 1, !0), n += 4;
|
|
234
|
+
const h = r[o];
|
|
235
|
+
if (h !== null) {
|
|
236
|
+
s.setUint32(n, h.length, !0), n += 4;
|
|
237
|
+
for (let i = 0; i < h.length; i++) {
|
|
238
|
+
const l = h[i][0], d = h[i][1];
|
|
239
|
+
s.setUint32(n, l, !0), n += 4, s.setUint32(n, d.length, !0), n += 4;
|
|
240
|
+
for (let _ = 0; _ < d.length; _++)
|
|
241
|
+
s.setFloat64(n, d[_], !0), n += w;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return e;
|
|
246
|
+
}
|
|
247
|
+
function j(a, r, t) {
|
|
248
|
+
const e = new DataView(r.buffer, r.byteOffset, r.byteLength), s = r.byteLength;
|
|
249
|
+
let n = 0;
|
|
250
|
+
const o = (i) => {
|
|
251
|
+
if (n + i > s)
|
|
252
|
+
throw new u(
|
|
253
|
+
`relation snapshot truncated: need ${i} more bytes at offset ${n}, have ${s - n}`
|
|
254
|
+
);
|
|
255
|
+
};
|
|
256
|
+
for (let i = 0; i < a.length; i++) a[i].resetIndices();
|
|
257
|
+
o(4);
|
|
258
|
+
const h = e.getUint32(n, !0);
|
|
259
|
+
if (n += 4, h !== a.length)
|
|
260
|
+
throw new u(
|
|
261
|
+
`relation count mismatch: snapshot=${h}, registered=${a.length}`
|
|
262
|
+
);
|
|
263
|
+
for (let i = 0; i < a.length; i++) {
|
|
264
|
+
const l = a[i];
|
|
265
|
+
o(k);
|
|
266
|
+
const d = e.getUint32(n, !0);
|
|
267
|
+
if (n += 4, d === 1 === l.exclusive)
|
|
268
|
+
throw new u(
|
|
269
|
+
`relation ${i} cardinality mismatch: snapshot ${d ? "multi" : "exclusive"}, registered ${l.exclusive ? "exclusive" : "multi"}`
|
|
270
|
+
);
|
|
271
|
+
if (l.exclusive) continue;
|
|
272
|
+
o(m);
|
|
273
|
+
const _ = e.getUint32(n, !0);
|
|
274
|
+
n += 4;
|
|
275
|
+
for (let T = 0; T < _; T++) {
|
|
276
|
+
o(D);
|
|
277
|
+
const g = e.getUint32(n, !0);
|
|
278
|
+
n += 4;
|
|
279
|
+
const x = e.getUint32(n, !0);
|
|
280
|
+
if (n += 4, g > R)
|
|
281
|
+
throw new u(
|
|
282
|
+
`relation ${i} source index ${g} exceeds MAX_INDEX (${R})`
|
|
283
|
+
);
|
|
284
|
+
o(x * w);
|
|
285
|
+
const N = t(g);
|
|
286
|
+
for (let A = 0; A < x; A++) {
|
|
287
|
+
const I = c(e.getFloat64(n, !0));
|
|
288
|
+
n += w;
|
|
289
|
+
const v = I;
|
|
290
|
+
if (!Number.isInteger(v) || v < 0 || v > S)
|
|
291
|
+
throw new u(
|
|
292
|
+
`relation ${i} target ${v} is not a well-formed packed EntityID (expected an integer in [0, ${S}])`
|
|
293
|
+
);
|
|
294
|
+
l.restoreAddTarget(g, I, N);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (n !== s)
|
|
299
|
+
throw new u(
|
|
300
|
+
`relation snapshot has ${s - n} trailing bytes after the last relation (not a canonical encoding)`
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
export {
|
|
304
|
+
G as D,
|
|
305
|
+
R as M,
|
|
306
|
+
C as R,
|
|
307
|
+
z as U,
|
|
308
|
+
Y as a,
|
|
309
|
+
B as c,
|
|
310
|
+
f as g,
|
|
311
|
+
j as r,
|
|
312
|
+
P as s
|
|
313
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const d=require("../index.cjs"),c=require("./assertions-z5GQd_bB.cjs"),y=-1;Object.freeze(Object.create(null));const O=31,R=20,p=(1<<R)-1,v=p,L=O-R,$=(1<<L)-1,x=$<<R|v,m=(a,r)=>c.unsafeCast(r<<R|a),f=a=>a&p,M="orphan",C="target",b=Object.freeze({});class N{exclusive;sparse;onDeleteTarget;_store;_reverse=new Map;constructor(r,t,e,s){this.exclusive=r,this.sparse=t,this._store=e,this.onDeleteTarget=s}_linkReverse(r,t){let e=this._reverse.get(r);e===void 0&&(e=new Set,this._reverse.set(r,e)),e.add(t)}_unlinkReverse(r,t){const e=this._reverse.get(r);e!==void 0&&(e.delete(t),e.size===0&&this._reverse.delete(r))}pruneDeadReverse(r){let t=0;for(const e of this._reverse.keys())r(c.unsafeCast(e))||(this._reverse.delete(e),t++);return t}sourcesOf(r){const t=this._reverse.get(r);if(t===void 0||t.size===0)return[];const e=new Array(t.size);let s=0;return t.forEach(n=>{e[s++]=c.unsafeCast(n)}),e.sort((n,o)=>n-o),e}resetIndices(){this._reverse.clear(),this._resetForward()}}class X extends N{constructor(r,t,e){super(!0,r,t,e)}_resetForward(){}link(r,t){const e=f(r),s=this._store.getField(e,0);if(s!==void 0){if(s===t)return;this._unlinkReverse(c.unsafeCast(s),r)}this._store.setRow(e,{[C]:t}),this._linkReverse(t,r)}unlink(r,t){const e=f(r),s=this._store.getField(e,0);s!==void 0&&(t!==void 0&&s!==t||(this._unlinkReverse(c.unsafeCast(s),r),this._store.remove(e)))}purgeSource(r){const t=f(r),e=this._store.getField(t,0);e!==void 0&&this._unlinkReverse(c.unsafeCast(e),r)}singleTargetAt(r){const t=this._store.getField(r,0);return t===void 0?void 0:c.unsafeCast(t)}targetsAt(r){const t=this._store.getField(r,0);return t===void 0?[]:[c.unsafeCast(t)]}hasIndex(r){return this._store.has(r)}forEachCanonicalTargetSet(r){}forEachCanonicalPair(r,t){const e=this._store.canonicalIndices();for(let s=0;s<e.length;s++){const n=e[s];t(r(n),c.unsafeCast(this._store.getField(n,0)))}}rebuildReverse(r){const t=this._store.indices;for(let e=0;e<t.length;e++){const s=t[e];this._linkReverse(c.unsafeCast(this._store.getField(s,0)),r(s))}}restoreAddTarget(){throw new d.SparseRestoreError("exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)")}}class G extends N{_forward=new Map;constructor(r,t,e){super(!1,r,t,e)}_resetForward(){this._forward.clear()}link(r,t){const e=f(r);let s=this._forward.get(e);s===void 0&&(s=new Set,this._forward.set(e,s),this._store.setRow(e,b)),s.add(t),this._linkReverse(t,r)}unlink(r,t){const e=f(r),s=this._forward.get(e);if(s!==void 0){if(t===void 0){this._forward.delete(e),s.forEach(n=>this._unlinkReverse(c.unsafeCast(n),r)),this._store.remove(e);return}s.has(t)&&(s.delete(t),this._unlinkReverse(t,r),s.size===0&&(this._forward.delete(e),this._store.remove(e)))}}purgeSource(r){const t=f(r),e=this._forward.get(t);e!==void 0&&(this._forward.delete(t),e.forEach(s=>this._unlinkReverse(c.unsafeCast(s),r)))}singleTargetAt(){}targetsAt(r){const t=this._forward.get(r);if(t===void 0||t.size===0)return[];const e=new Array(t.size);let s=0;return t.forEach(n=>{e[s++]=c.unsafeCast(n)}),e.sort((n,o)=>n-o),e}hasIndex(r){return this._store.has(r)}forEachCanonicalTargetSet(r){const t=Array.from(this._forward.keys()).sort((e,s)=>e-s);for(let e=0;e<t.length;e++){const s=this.targetsAt(t[e]);s.length!==0&&r(t[e],s)}}forEachCanonicalPair(r,t){this.forEachCanonicalTargetSet((e,s)=>{const n=r(e);for(let o=0;o<s.length;o++)t(n,s[o])})}rebuildReverse(){}restoreAddTarget(r,t,e){let s=this._forward.get(r);s===void 0&&(s=new Set,this._forward.set(r,s)),s.add(t),this._linkReverse(t,e)}}function z(a,r,t,e){return a?new X(r,t,e):new G(r,t,e)}const D=4,U=4,k=8,w=8;function B(a){const r=new Array(a.length);let t=4;for(let o=0;o<a.length;o++){t+=D;const u=a[o];if(u.exclusive){r[o]=null;continue}const i=[];u.forEachCanonicalTargetSet((l,h)=>i.push([l,h])),r[o]=i,t+=U;for(let l=0;l<i.length;l++)t+=k+i[l][1].length*w}const e=new Uint8Array(t),s=new DataView(e.buffer);let n=0;s.setUint32(n,a.length,!0),n+=4;for(let o=0;o<a.length;o++){s.setUint32(n,a[o].exclusive?0:1,!0),n+=4;const u=r[o];if(u!==null){s.setUint32(n,u.length,!0),n+=4;for(let i=0;i<u.length;i++){const l=u[i][0],h=u[i][1];s.setUint32(n,l,!0),n+=4,s.setUint32(n,h.length,!0),n+=4;for(let _=0;_<h.length;_++)s.setFloat64(n,h[_],!0),n+=w}}}return e}function Y(a,r,t){const e=new DataView(r.buffer,r.byteOffset,r.byteLength),s=r.byteLength;let n=0;const o=i=>{if(n+i>s)throw new d.SparseRestoreError(`relation snapshot truncated: need ${i} more bytes at offset ${n}, have ${s-n}`)};for(let i=0;i<a.length;i++)a[i].resetIndices();o(4);const u=e.getUint32(n,!0);if(n+=4,u!==a.length)throw new d.SparseRestoreError(`relation count mismatch: snapshot=${u}, registered=${a.length}`);for(let i=0;i<a.length;i++){const l=a[i];o(D);const h=e.getUint32(n,!0);if(n+=4,h===1===l.exclusive)throw new d.SparseRestoreError(`relation ${i} cardinality mismatch: snapshot ${h?"multi":"exclusive"}, registered ${l.exclusive?"exclusive":"multi"}`);if(l.exclusive)continue;o(U);const _=e.getUint32(n,!0);n+=4;for(let T=0;T<_;T++){o(k);const g=e.getUint32(n,!0);n+=4;const A=e.getUint32(n,!0);if(n+=4,g>v)throw new d.SparseRestoreError(`relation ${i} source index ${g} exceeds MAX_INDEX (${v})`);o(A*w);const F=t(g);for(let S=0;S<A;S++){const I=c.unsafeCast(e.getFloat64(n,!0));n+=w;const E=I;if(!Number.isInteger(E)||E<0||E>x)throw new d.SparseRestoreError(`relation ${i} target ${E} is not a well-formed packed EntityID (expected an integer in [0, ${x}])`);l.restoreAddTarget(g,I,F)}}}if(n!==s)throw new d.SparseRestoreError(`relation snapshot has ${s-n} trailing bytes after the last relation (not a canonical encoding)`)}exports.DEFAULT_ON_DELETE_TARGET=M;exports.MAX_INDEX=v;exports.RELATION_TARGET_FIELD=C;exports.UNASSIGNED=y;exports.createEntityId=m;exports.createRelationStore=z;exports.getEntityIndex=f;exports.restoreRelations=Y;exports.snapshotRelations=B;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const l=require("../index.development.cjs"),c=require("./assertions-z5GQd_bB.cjs"),k=-1;Object.freeze(Object.create(null));const L=31,g=20,p=(1<<g)-1,E=p,M=L-g,N=(1<<M)-1,x=N<<g|E,m=(o,e)=>{{if(o<0||o>E)throw new l.ECSError(l.ECS_ERROR.EID_MAX_INDEX_OVERFLOW);if(e<0||e>N)throw new l.ECSError(l.ECS_ERROR.EID_MAX_GEN_OVERFLOW)}return c.unsafeCast(e<<g|o)},d=o=>o&p,C=o=>o>>g,X=(o,e,r)=>new l.ECSError(l.ECS_ERROR.ENTITY_NOT_ALIVE,`${o}: entity ${e} (index ${d(e)}, generation ${C(e)}) is not alive${r?`, ${r}`:""}. It was destroyed, never created, or the handle is stale. Guard with isAlive() first`,{entity:e,index:d(e),generation:C(e),op:o}),b="orphan",D="target",G=Object.freeze({});class O{exclusive;sparse;onDeleteTarget;_store;_reverse=new Map;constructor(e,r,t,s){this.exclusive=e,this.sparse=r,this._store=t,this.onDeleteTarget=s}_linkReverse(e,r){let t=this._reverse.get(e);t===void 0&&(t=new Set,this._reverse.set(e,t)),t.add(r)}_unlinkReverse(e,r){const t=this._reverse.get(e);t!==void 0&&(t.delete(r),t.size===0&&this._reverse.delete(e))}pruneDeadReverse(e){let r=0;for(const t of this._reverse.keys())e(c.unsafeCast(t))||(this._reverse.delete(t),r++);return r}sourcesOf(e){const r=this._reverse.get(e);if(r===void 0||r.size===0)return[];const t=new Array(r.size);let s=0;return r.forEach(n=>{t[s++]=c.unsafeCast(n)}),t.sort((n,i)=>n-i),t}resetIndices(){this._reverse.clear(),this._resetForward()}}class z extends O{constructor(e,r,t){super(!0,e,r,t)}_resetForward(){}link(e,r){const t=d(e),s=this._store.getField(t,0);if(s!==void 0){if(s===r)return;this._unlinkReverse(c.unsafeCast(s),e)}this._store.setRow(t,{[D]:r}),this._linkReverse(r,e)}unlink(e,r){const t=d(e),s=this._store.getField(t,0);s!==void 0&&(r!==void 0&&s!==r||(this._unlinkReverse(c.unsafeCast(s),e),this._store.remove(t)))}purgeSource(e){const r=d(e),t=this._store.getField(r,0);t!==void 0&&this._unlinkReverse(c.unsafeCast(t),e)}singleTargetAt(e){const r=this._store.getField(e,0);return r===void 0?void 0:c.unsafeCast(r)}targetsAt(e){const r=this._store.getField(e,0);return r===void 0?[]:[c.unsafeCast(r)]}hasIndex(e){return this._store.has(e)}forEachCanonicalTargetSet(e){}forEachCanonicalPair(e,r){const t=this._store.canonicalIndices();for(let s=0;s<t.length;s++){const n=t[s];r(e(n),c.unsafeCast(this._store.getField(n,0)))}}rebuildReverse(e){const r=this._store.indices;for(let t=0;t<r.length;t++){const s=r[t];this._linkReverse(c.unsafeCast(this._store.getField(s,0)),e(s))}}restoreAddTarget(){throw new l.SparseRestoreError("exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)")}}class B extends O{_forward=new Map;constructor(e,r,t){super(!1,e,r,t)}_resetForward(){this._forward.clear()}link(e,r){const t=d(e);let s=this._forward.get(t);s===void 0&&(s=new Set,this._forward.set(t,s),this._store.setRow(t,G)),s.add(r),this._linkReverse(r,e)}unlink(e,r){const t=d(e),s=this._forward.get(t);if(s!==void 0){if(r===void 0){this._forward.delete(t),s.forEach(n=>this._unlinkReverse(c.unsafeCast(n),e)),this._store.remove(t);return}s.has(r)&&(s.delete(r),this._unlinkReverse(r,e),s.size===0&&(this._forward.delete(t),this._store.remove(t)))}}purgeSource(e){const r=d(e),t=this._forward.get(r);t!==void 0&&(this._forward.delete(r),t.forEach(s=>this._unlinkReverse(c.unsafeCast(s),e)))}singleTargetAt(){}targetsAt(e){const r=this._forward.get(e);if(r===void 0||r.size===0)return[];const t=new Array(r.size);let s=0;return r.forEach(n=>{t[s++]=c.unsafeCast(n)}),t.sort((n,i)=>n-i),t}hasIndex(e){return this._store.has(e)}forEachCanonicalTargetSet(e){const r=Array.from(this._forward.keys()).sort((t,s)=>t-s);for(let t=0;t<r.length;t++){const s=this.targetsAt(r[t]);s.length!==0&&e(r[t],s)}}forEachCanonicalPair(e,r){this.forEachCanonicalTargetSet((t,s)=>{const n=e(t);for(let i=0;i<s.length;i++)r(n,s[i])})}rebuildReverse(){}restoreAddTarget(e,r,t){let s=this._forward.get(e);s===void 0&&(s=new Set,this._forward.set(e,s)),s.add(r),this._linkReverse(r,t)}}function Y(o,e,r,t){return o?new z(e,r,t):new B(e,r,t)}const y=4,U=4,$=8,R=8;function V(o){const e=new Array(o.length);let r=4;for(let i=0;i<o.length;i++){r+=y;const u=o[i];if(u.exclusive){e[i]=null;continue}const a=[];u.forEachCanonicalTargetSet((h,f)=>a.push([h,f])),e[i]=a,r+=U;for(let h=0;h<a.length;h++)r+=$+a[h][1].length*R}const t=new Uint8Array(r),s=new DataView(t.buffer);let n=0;s.setUint32(n,o.length,!0),n+=4;for(let i=0;i<o.length;i++){s.setUint32(n,o[i].exclusive?0:1,!0),n+=4;const u=e[i];if(u!==null){s.setUint32(n,u.length,!0),n+=4;for(let a=0;a<u.length;a++){const h=u[a][0],f=u[a][1];s.setUint32(n,h,!0),n+=4,s.setUint32(n,f.length,!0),n+=4;for(let _=0;_<f.length;_++)s.setFloat64(n,f[_],!0),n+=R}}}return t}function P(o,e,r){const t=new DataView(e.buffer,e.byteOffset,e.byteLength),s=e.byteLength;let n=0;const i=a=>{if(n+a>s)throw new l.SparseRestoreError(`relation snapshot truncated: need ${a} more bytes at offset ${n}, have ${s-n}`)};for(let a=0;a<o.length;a++)o[a].resetIndices();i(4);const u=t.getUint32(n,!0);if(n+=4,u!==o.length)throw new l.SparseRestoreError(`relation count mismatch: snapshot=${u}, registered=${o.length}`);for(let a=0;a<o.length;a++){const h=o[a];i(y);const f=t.getUint32(n,!0);if(n+=4,f===1===h.exclusive)throw new l.SparseRestoreError(`relation ${a} cardinality mismatch: snapshot ${f?"multi":"exclusive"}, registered ${h.exclusive?"exclusive":"multi"}`);if(h.exclusive)continue;i(U);const _=t.getUint32(n,!0);n+=4;for(let T=0;T<_;T++){i($);const v=t.getUint32(n,!0);n+=4;const A=t.getUint32(n,!0);if(n+=4,v>E)throw new l.SparseRestoreError(`relation ${a} source index ${v} exceeds MAX_INDEX (${E})`);i(A*R);const F=r(v);for(let S=0;S<A;S++){const I=c.unsafeCast(t.getFloat64(n,!0));n+=R;const w=I;if(!Number.isInteger(w)||w<0||w>x)throw new l.SparseRestoreError(`relation ${a} target ${w} is not a well-formed packed EntityID (expected an integer in [0, ${x}])`);h.restoreAddTarget(v,I,F)}}}if(n!==s)throw new l.SparseRestoreError(`relation snapshot has ${s-n} trailing bytes after the last relation (not a canonical encoding)`)}exports.DEFAULT_ON_DELETE_TARGET=b;exports.MAX_INDEX=E;exports.RELATION_TARGET_FIELD=D;exports.UNASSIGNED=k;exports.createEntityId=m;exports.createRelationStore=Y;exports.entityNotAliveError=X;exports.getEntityIndex=d;exports.restoreRelations=P;exports.snapshotRelations=V;
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { ECSError as T, ECS_ERROR as A, SparseRestoreError as f } from "../index.development.js";
|
|
2
|
+
import { u as c } from "./assertions-gtDVfbnQ.js";
|
|
3
|
+
const Y = -1;
|
|
4
|
+
Object.freeze(/* @__PURE__ */ Object.create(null));
|
|
5
|
+
const C = 31, g = 20, D = (1 << g) - 1, w = D, M = C - g, O = (1 << M) - 1, N = O << g | w, V = (o, e) => {
|
|
6
|
+
{
|
|
7
|
+
if (o < 0 || o > w)
|
|
8
|
+
throw new T(A.EID_MAX_INDEX_OVERFLOW);
|
|
9
|
+
if (e < 0 || e > O)
|
|
10
|
+
throw new T(A.EID_MAX_GEN_OVERFLOW);
|
|
11
|
+
}
|
|
12
|
+
return c(e << g | o);
|
|
13
|
+
}, d = (o) => o & D, $ = (o) => o >> g, P = (o, e, r) => new T(
|
|
14
|
+
A.ENTITY_NOT_ALIVE,
|
|
15
|
+
`${o}: entity ${e} (index ${d(e)}, generation ${$(
|
|
16
|
+
e
|
|
17
|
+
)}) is not alive${r ? `, ${r}` : ""}. It was destroyed, never created, or the handle is stale. Guard with isAlive() first`,
|
|
18
|
+
{ entity: e, index: d(e), generation: $(e), op: o }
|
|
19
|
+
), j = "orphan", L = "target", b = Object.freeze({});
|
|
20
|
+
class U {
|
|
21
|
+
/** `true` → one target per source, held in the sparse field. `false` →
|
|
22
|
+
* a set of targets per source. The cardinality discriminant survives as a
|
|
23
|
+
* field because the snapshot header and the traversal and `targetOf`
|
|
24
|
+
* mode guards carry it. The forward mechanics stay virtual, never branched
|
|
25
|
+
* on it. */
|
|
26
|
+
exclusive;
|
|
27
|
+
/** Backing sparse component def: `{ target: f64 }` when exclusive, a tag when
|
|
28
|
+
* multi. Carries membership (and the target, when exclusive). */
|
|
29
|
+
sparse;
|
|
30
|
+
/** Cleanup policy applied to this relation's sources when a target is
|
|
31
|
+
* destroyed. `orphan` (the default) is a no-op, the link dangles
|
|
32
|
+
* safely. `Store` reads this at destroy-flush off `sourcesOf`. */
|
|
33
|
+
onDeleteTarget;
|
|
34
|
+
/** The backing sparse store instance. Owned for registration and liveness by
|
|
35
|
+
* `Store`, but the relation drives the forward and membership rows on it directly.
|
|
36
|
+
* That is the cardinality interaction this class now encapsulates. */
|
|
37
|
+
_store;
|
|
38
|
+
/** target `EntityID` → set of source `EntityID`s. Keyed by the full id, not
|
|
39
|
+
* the index, so a recycled target slot can't alias a dead target's sources.
|
|
40
|
+
* An entry is dropped the moment its set empties (`_unlinkReverse`). */
|
|
41
|
+
_reverse = /* @__PURE__ */ new Map();
|
|
42
|
+
constructor(e, r, t, s) {
|
|
43
|
+
this.exclusive = e, this.sparse = r, this._store = t, this.onDeleteTarget = s;
|
|
44
|
+
}
|
|
45
|
+
// --- shared reverse index (cardinality-agnostic) ---
|
|
46
|
+
/** Record that `src` points at `tgt` in the reverse index. */
|
|
47
|
+
_linkReverse(e, r) {
|
|
48
|
+
let t = this._reverse.get(e);
|
|
49
|
+
t === void 0 && (t = /* @__PURE__ */ new Set(), this._reverse.set(e, t)), t.add(r);
|
|
50
|
+
}
|
|
51
|
+
/** Drop the `src → tgt` edge from the reverse index, removing the target's
|
|
52
|
+
* entry entirely once its last source is gone (so a dead-target key doesn't
|
|
53
|
+
* linger with an empty set). */
|
|
54
|
+
_unlinkReverse(e, r) {
|
|
55
|
+
const t = this._reverse.get(e);
|
|
56
|
+
t !== void 0 && (t.delete(r), t.size === 0 && this._reverse.delete(e));
|
|
57
|
+
}
|
|
58
|
+
/** Drop every reverse-index entry whose **target** is no longer alive,
|
|
59
|
+
* returning the count dropped. The `orphan` policy intentionally
|
|
60
|
+
* leaves a destroyed target's reverse entry intact (the link dangles
|
|
61
|
+
* safely), so a long-lived source that orphan-points at a stream of
|
|
62
|
+
* short-lived targets and never re-targets or dies accumulates dead-target keys
|
|
63
|
+
* without bound. This is the reclaim primitive behind `ecs.relations.compact`,
|
|
64
|
+
* a cold path the host calls at scene and snapshot boundaries. It is
|
|
65
|
+
* cardinality-free (reverse-index only), so it lives on the base unchanged.
|
|
66
|
+
*
|
|
67
|
+
* Pure index reclaim: the **forward** links (the exclusive sparse target
|
|
68
|
+
* field, the multi forward set) are left untouched, so `targetOf` and
|
|
69
|
+
* `targetsOf` still return the dangling dead handle exactly as `orphan`
|
|
70
|
+
* promises. The reverse index is derived, so dropping a dead-target entry
|
|
71
|
+
* changes nothing observable except `sourcesOf` on that dead handle (which
|
|
72
|
+
* goes from the dangling sources to `[]`, meaningless either way, the target
|
|
73
|
+
* is gone) and is faithfully rebuilt by snapshot and restore from the surviving
|
|
74
|
+
* forward links. Only the **target** role can leak here: a destroyed *source*
|
|
75
|
+
* is already unlinked from every reverse set by `purgeSource`, so a live
|
|
76
|
+
* target's set never holds a dead source. `isAlive` is supplied by `Store`,
|
|
77
|
+
* which owns entity liveness. Deleting during `Map` key iteration is
|
|
78
|
+
* well-defined, already-visited and not-yet-reached keys are unaffected. */
|
|
79
|
+
pruneDeadReverse(e) {
|
|
80
|
+
let r = 0;
|
|
81
|
+
for (const t of this._reverse.keys())
|
|
82
|
+
e(c(t)) || (this._reverse.delete(t), r++);
|
|
83
|
+
return r;
|
|
84
|
+
}
|
|
85
|
+
/** Sources that point at `tgt`, ascending by id (deterministic, cold-path
|
|
86
|
+
* sort), empty when none. */
|
|
87
|
+
sourcesOf(e) {
|
|
88
|
+
const r = this._reverse.get(e);
|
|
89
|
+
if (r === void 0 || r.size === 0) return [];
|
|
90
|
+
const t = new Array(r.size);
|
|
91
|
+
let s = 0;
|
|
92
|
+
return r.forEach((n) => {
|
|
93
|
+
t[s++] = c(n);
|
|
94
|
+
}), t.sort((n, i) => n - i), t;
|
|
95
|
+
}
|
|
96
|
+
/** Drop every derived side index, the reverse index and (for multi) the
|
|
97
|
+
* forward target sets. Restore path only (`restoreRelations`): the side
|
|
98
|
+
* indices are rebuilt from scratch, so they're cleared first to stay
|
|
99
|
+
* idempotent when restoring into a dirty world. The backing sparse store is
|
|
100
|
+
* cleared separately by `restoreSparseStores`. */
|
|
101
|
+
resetIndices() {
|
|
102
|
+
this._reverse.clear(), this._resetForward();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
class X extends U {
|
|
106
|
+
constructor(e, r, t) {
|
|
107
|
+
super(!0, e, r, t);
|
|
108
|
+
}
|
|
109
|
+
_resetForward() {
|
|
110
|
+
}
|
|
111
|
+
link(e, r) {
|
|
112
|
+
const t = d(e), s = this._store.getField(t, 0);
|
|
113
|
+
if (s !== void 0) {
|
|
114
|
+
if (s === r) return;
|
|
115
|
+
this._unlinkReverse(c(s), e);
|
|
116
|
+
}
|
|
117
|
+
this._store.setRow(t, { [L]: r }), this._linkReverse(r, e);
|
|
118
|
+
}
|
|
119
|
+
unlink(e, r) {
|
|
120
|
+
const t = d(e), s = this._store.getField(t, 0);
|
|
121
|
+
s !== void 0 && (r !== void 0 && s !== r || (this._unlinkReverse(c(s), e), this._store.remove(t)));
|
|
122
|
+
}
|
|
123
|
+
purgeSource(e) {
|
|
124
|
+
const r = d(e), t = this._store.getField(r, 0);
|
|
125
|
+
t !== void 0 && this._unlinkReverse(c(t), e);
|
|
126
|
+
}
|
|
127
|
+
singleTargetAt(e) {
|
|
128
|
+
const r = this._store.getField(e, 0);
|
|
129
|
+
return r === void 0 ? void 0 : c(r);
|
|
130
|
+
}
|
|
131
|
+
targetsAt(e) {
|
|
132
|
+
const r = this._store.getField(e, 0);
|
|
133
|
+
return r === void 0 ? [] : [c(r)];
|
|
134
|
+
}
|
|
135
|
+
hasIndex(e) {
|
|
136
|
+
return this._store.has(e);
|
|
137
|
+
}
|
|
138
|
+
forEachCanonicalTargetSet(e) {
|
|
139
|
+
}
|
|
140
|
+
forEachCanonicalPair(e, r) {
|
|
141
|
+
const t = this._store.canonicalIndices();
|
|
142
|
+
for (let s = 0; s < t.length; s++) {
|
|
143
|
+
const n = t[s];
|
|
144
|
+
r(e(n), c(this._store.getField(n, 0)));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
rebuildReverse(e) {
|
|
148
|
+
const r = this._store.indices;
|
|
149
|
+
for (let t = 0; t < r.length; t++) {
|
|
150
|
+
const s = r[t];
|
|
151
|
+
this._linkReverse(c(this._store.getField(s, 0)), e(s));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
restoreAddTarget() {
|
|
155
|
+
throw new f(
|
|
156
|
+
"exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)"
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
class G extends U {
|
|
161
|
+
/** source entity **index** → set of target `EntityID`s. Keyed by source index
|
|
162
|
+
* so destroy-purge, which has the freed index, can drop it in O(1). An
|
|
163
|
+
* entry is removed the moment its set empties. */
|
|
164
|
+
_forward = /* @__PURE__ */ new Map();
|
|
165
|
+
constructor(e, r, t) {
|
|
166
|
+
super(!1, e, r, t);
|
|
167
|
+
}
|
|
168
|
+
_resetForward() {
|
|
169
|
+
this._forward.clear();
|
|
170
|
+
}
|
|
171
|
+
link(e, r) {
|
|
172
|
+
const t = d(e);
|
|
173
|
+
let s = this._forward.get(t);
|
|
174
|
+
s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(t, s), this._store.setRow(t, b)), s.add(r), this._linkReverse(r, e);
|
|
175
|
+
}
|
|
176
|
+
unlink(e, r) {
|
|
177
|
+
const t = d(e), s = this._forward.get(t);
|
|
178
|
+
if (s !== void 0) {
|
|
179
|
+
if (r === void 0) {
|
|
180
|
+
this._forward.delete(t), s.forEach((n) => this._unlinkReverse(c(n), e)), this._store.remove(t);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
s.has(r) && (s.delete(r), this._unlinkReverse(r, e), s.size === 0 && (this._forward.delete(t), this._store.remove(t)));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
purgeSource(e) {
|
|
187
|
+
const r = d(e), t = this._forward.get(r);
|
|
188
|
+
t !== void 0 && (this._forward.delete(r), t.forEach((s) => this._unlinkReverse(c(s), e)));
|
|
189
|
+
}
|
|
190
|
+
singleTargetAt() {
|
|
191
|
+
}
|
|
192
|
+
targetsAt(e) {
|
|
193
|
+
const r = this._forward.get(e);
|
|
194
|
+
if (r === void 0 || r.size === 0) return [];
|
|
195
|
+
const t = new Array(r.size);
|
|
196
|
+
let s = 0;
|
|
197
|
+
return r.forEach((n) => {
|
|
198
|
+
t[s++] = c(n);
|
|
199
|
+
}), t.sort((n, i) => n - i), t;
|
|
200
|
+
}
|
|
201
|
+
hasIndex(e) {
|
|
202
|
+
return this._store.has(e);
|
|
203
|
+
}
|
|
204
|
+
forEachCanonicalTargetSet(e) {
|
|
205
|
+
const r = Array.from(this._forward.keys()).sort((t, s) => t - s);
|
|
206
|
+
for (let t = 0; t < r.length; t++) {
|
|
207
|
+
const s = this.targetsAt(r[t]);
|
|
208
|
+
s.length !== 0 && e(r[t], s);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
forEachCanonicalPair(e, r) {
|
|
212
|
+
this.forEachCanonicalTargetSet((t, s) => {
|
|
213
|
+
const n = e(t);
|
|
214
|
+
for (let i = 0; i < s.length; i++) r(n, s[i]);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
rebuildReverse() {
|
|
218
|
+
}
|
|
219
|
+
restoreAddTarget(e, r, t) {
|
|
220
|
+
let s = this._forward.get(e);
|
|
221
|
+
s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(e, s)), s.add(r), this._linkReverse(r, t);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function K(o, e, r, t) {
|
|
225
|
+
return o ? new X(e, r, t) : new G(e, r, t);
|
|
226
|
+
}
|
|
227
|
+
const k = 4, y = 4, m = 8, R = 8;
|
|
228
|
+
function W(o) {
|
|
229
|
+
const e = new Array(o.length);
|
|
230
|
+
let r = 4;
|
|
231
|
+
for (let i = 0; i < o.length; i++) {
|
|
232
|
+
r += k;
|
|
233
|
+
const h = o[i];
|
|
234
|
+
if (h.exclusive) {
|
|
235
|
+
e[i] = null;
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
const a = [];
|
|
239
|
+
h.forEachCanonicalTargetSet((l, u) => a.push([l, u])), e[i] = a, r += y;
|
|
240
|
+
for (let l = 0; l < a.length; l++)
|
|
241
|
+
r += m + a[l][1].length * R;
|
|
242
|
+
}
|
|
243
|
+
const t = new Uint8Array(r), s = new DataView(t.buffer);
|
|
244
|
+
let n = 0;
|
|
245
|
+
s.setUint32(n, o.length, !0), n += 4;
|
|
246
|
+
for (let i = 0; i < o.length; i++) {
|
|
247
|
+
s.setUint32(n, o[i].exclusive ? 0 : 1, !0), n += 4;
|
|
248
|
+
const h = e[i];
|
|
249
|
+
if (h !== null) {
|
|
250
|
+
s.setUint32(n, h.length, !0), n += 4;
|
|
251
|
+
for (let a = 0; a < h.length; a++) {
|
|
252
|
+
const l = h[a][0], u = h[a][1];
|
|
253
|
+
s.setUint32(n, l, !0), n += 4, s.setUint32(n, u.length, !0), n += 4;
|
|
254
|
+
for (let _ = 0; _ < u.length; _++)
|
|
255
|
+
s.setFloat64(n, u[_], !0), n += R;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return t;
|
|
260
|
+
}
|
|
261
|
+
function H(o, e, r) {
|
|
262
|
+
const t = new DataView(e.buffer, e.byteOffset, e.byteLength), s = e.byteLength;
|
|
263
|
+
let n = 0;
|
|
264
|
+
const i = (a) => {
|
|
265
|
+
if (n + a > s)
|
|
266
|
+
throw new f(
|
|
267
|
+
`relation snapshot truncated: need ${a} more bytes at offset ${n}, have ${s - n}`
|
|
268
|
+
);
|
|
269
|
+
};
|
|
270
|
+
for (let a = 0; a < o.length; a++) o[a].resetIndices();
|
|
271
|
+
i(4);
|
|
272
|
+
const h = t.getUint32(n, !0);
|
|
273
|
+
if (n += 4, h !== o.length)
|
|
274
|
+
throw new f(
|
|
275
|
+
`relation count mismatch: snapshot=${h}, registered=${o.length}`
|
|
276
|
+
);
|
|
277
|
+
for (let a = 0; a < o.length; a++) {
|
|
278
|
+
const l = o[a];
|
|
279
|
+
i(k);
|
|
280
|
+
const u = t.getUint32(n, !0);
|
|
281
|
+
if (n += 4, u === 1 === l.exclusive)
|
|
282
|
+
throw new f(
|
|
283
|
+
`relation ${a} cardinality mismatch: snapshot ${u ? "multi" : "exclusive"}, registered ${l.exclusive ? "exclusive" : "multi"}`
|
|
284
|
+
);
|
|
285
|
+
if (l.exclusive) continue;
|
|
286
|
+
i(y);
|
|
287
|
+
const _ = t.getUint32(n, !0);
|
|
288
|
+
n += 4;
|
|
289
|
+
for (let I = 0; I < _; I++) {
|
|
290
|
+
i(m);
|
|
291
|
+
const v = t.getUint32(n, !0);
|
|
292
|
+
n += 4;
|
|
293
|
+
const x = t.getUint32(n, !0);
|
|
294
|
+
if (n += 4, v > w)
|
|
295
|
+
throw new f(
|
|
296
|
+
`relation ${a} source index ${v} exceeds MAX_INDEX (${w})`
|
|
297
|
+
);
|
|
298
|
+
i(x * R);
|
|
299
|
+
const F = r(v);
|
|
300
|
+
for (let S = 0; S < x; S++) {
|
|
301
|
+
const p = c(t.getFloat64(n, !0));
|
|
302
|
+
n += R;
|
|
303
|
+
const E = p;
|
|
304
|
+
if (!Number.isInteger(E) || E < 0 || E > N)
|
|
305
|
+
throw new f(
|
|
306
|
+
`relation ${a} target ${E} is not a well-formed packed EntityID (expected an integer in [0, ${N}])`
|
|
307
|
+
);
|
|
308
|
+
l.restoreAddTarget(v, p, F);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (n !== s)
|
|
313
|
+
throw new f(
|
|
314
|
+
`relation snapshot has ${s - n} trailing bytes after the last relation (not a canonical encoding)`
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
export {
|
|
318
|
+
j as D,
|
|
319
|
+
w as M,
|
|
320
|
+
L as R,
|
|
321
|
+
Y as U,
|
|
322
|
+
K as a,
|
|
323
|
+
V as c,
|
|
324
|
+
P as e,
|
|
325
|
+
d as g,
|
|
326
|
+
H as r,
|
|
327
|
+
W as s
|
|
328
|
+
};
|