SparseSet Class Template
A generic sparse set providing O(1) insertion, lookup, and removal. More...
Declaration
Base class
| class | SparseSetBase |
|
Abstract base class for type-erased sparse set access. More... | |
Public Constructors Index
template <typename T> | |
| SparseSet ()=default | |
|
Default constructor creating an empty sparse set. More... | |
template <typename T> | |
| SparseSet (const size_t capacity) | |
|
Constructs a sparse set with pre-allocated capacity. More... | |
template <typename T> | |
| SparseSet (const SparseSet &)=delete | |
|
Copy operations are deleted to prevent accidental duplication. More... | |
template <typename T> | |
| SparseSet (SparseSet &&) noexcept=default | |
|
Move constructor. More... | |
Public Operators Index
template <typename T> | |
| SparseSet & | operator= (const SparseSet &)=delete |
|
Copy assignment is deleted. More... | |
template <typename T> | |
| SparseSet & | operator= (SparseSet &&) noexcept=default |
|
Move assignment operator. More... | |
Public Member Functions Index
template <typename... Args> | |
| T * | emplace (const EntityId idx, Args &&...args) |
|
Constructs and inserts an element at the given index. More... | |
template <typename T> | |
| T * | insert (const EntityId idx, T &&obj) |
|
Inserts an element at the given index. More... | |
template <typename T> | |
| bool | remove (const EntityId idx) override |
|
Removes the element at the given index using swap-and-pop. More... | |
template <typename T> | |
| T * | get (const EntityId idx) |
|
Retrieves the element at the given index. More... | |
template <typename T> | |
| const T * | get (const EntityId idx) const |
|
Retrieves the element at the given index. More... | |
template <typename T> | |
| bool | contains (const EntityId idx) const override |
|
Checks whether an element is registered for the specified EntityId. More... | |
template <typename T> | |
| void * | raw (const helios::engine::ecs::types::EntityId id) override |
|
Returns a raw void pointer to the element at the given index. More... | |
template <typename T> | |
| Iterator | begin () |
|
Returns an iterator to the beginning of the dense storage. More... | |
template <typename T> | |
| Iterator | end () |
|
Returns an iterator to the end of the dense storage. More... | |
template <typename T> | |
| ConstIterator | begin () const |
|
Returns a const iterator to the beginning of the dense storage. More... | |
template <typename T> | |
| ConstIterator | end () const |
|
Returns a const iterator to the end of the dense storage. More... | |
Private Member Attributes Index
template <typename T> | |
| std::vector< size_t > | sparse_ |
template <typename T> | |
| std::vector< EntityId > | denseToSparse_ |
template <typename T> | |
| std::vector< T > | storage_ |
|
Contiguous storage of elements. More... | |
Description
A generic sparse set providing O(1) insertion, lookup, and removal.
`SparseSet` implements the sparse set data structure pattern, commonly used in Entity Component Systems (ECS) for efficient component storage. It maps `EntityId` indices to densely packed data of type `T`.
## Data Structure
``` ┌─────────────────────────────────────────────────────────────┐ │ SPARSE SET LAYOUT │ ├─────────────────────────────────────────────────────────────┤ │ │ │ SPARSE ARRAY (indexed by EntityId) │ │ ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ │ │ 2 │ × │ 0 │ × │ 1 │ × │ × │ (dense idx) │ │ └──┬──┴─────┴──┬──┴─────┴──┬──┴─────┴─────┘ │ │ │ │ │ │ │ │ │ ┌────────┘ │ │ │ ┌───────┘ │ │ │ └───│──────────│────────┐ │ │ ▼ ▼ ▼ │ │ DENSE STORAGE (contiguous) │ │ ┌─────────┬─────────┬─────────┐ │ │ │ T[0] │ T[1] │ T[2] │ │ │ │ (id=2) │ (id=4) │ (id=0) │ │ │ └─────────┴─────────┴─────────┘ │ │ │ │ DENSE-TO-SPARSE (reverse mapping for swap-and-pop) │ │ ┌─────┬─────┬─────┐ │ │ │ 2 │ 4 │ 0 │ (EntityId) │ │ └─────┴─────┴─────┘ │ │ │ │ × = Tombstone (empty slot) │ └─────────────────────────────────────────────────────────────┘ ```
## Complexity
| Operation | Time | Space | |-----------|---------|--------------| | emplace | O(1)* | O(max_id) | | insert | O(1)* | O(max_id) | | get | O(1) | - | | remove | O(1) | - |
*Amortized due to potential sparse array resize.
## Usage
```cpp SparseSet<TransformComponent> transforms;
// In-place construction auto* transform = transforms.emplace(42, glm::vec3{0.0f}, glm::quat{}, glm::vec3{1.0f});
// Or insert a pre-constructed object auto* inserted = transforms.insert(43, TransformComponent{...});
// Mutable access if (auto* t = transforms.get(42)) { t->position = glm::vec3{10.0f, 0.0f, 0.0f}; }
// Const access const auto& constSet = transforms; if (const auto* t = constSet.get(42)) { }
// Remove component transforms.remove(42); ```
- Template Parameters
-
T The type of elements stored in the set. Must be move-assignable.
- See Also
- See Also
Definition at line 156 of file SparseSet.ixx.
Public Constructors
SparseSet()
| default |
Default constructor creating an empty sparse set.
Definition at line 183 of file SparseSet.ixx.
Referenced by helios::engine::ecs::SparseSet< T >::operator=, helios::engine::ecs::SparseSet< T >::operator=, helios::engine::ecs::SparseSet< T >::SparseSet and helios::engine::ecs::SparseSet< T >::SparseSet.
SparseSet()
| inline explicit |
Constructs a sparse set with pre-allocated capacity.
- Parameters
-
capacity The initial capacity to reserve for all internal vectors.
Definition at line 190 of file SparseSet.ixx.
SparseSet()
| delete |
Copy operations are deleted to prevent accidental duplication.
Definition at line 199 of file SparseSet.ixx.
SparseSet()
| noexcept default |
Move constructor.
Definition at line 209 of file SparseSet.ixx.
Public Operators
operator=()
| delete |
Copy assignment is deleted.
Definition at line 204 of file SparseSet.ixx.
operator=()
| noexcept default |
Move assignment operator.
Definition at line 214 of file SparseSet.ixx.
Public Member Functions
begin()
| inline nodiscard |
begin()
| inline nodiscard |
Returns a const iterator to the beginning of the dense storage.
- Returns
ConstIterator pointing to the first element.
Definition at line 493 of file SparseSet.ixx.
contains()
| inline nodiscard virtual |
Checks whether an element is registered for the specified EntityId.
- Parameters
-
idx The entityId to test.
- Returns
True if this sparse set contains the entityId, otherwise false.
Definition at line 363 of file SparseSet.ixx.
Reference helios::engine::ecs::Tombstone.
emplace()
| inline nodiscard |
Constructs and inserts an element at the given index.
Forwards arguments to construct `T` in-place.
- Template Parameters
-
Args Constructor argument types.
- Parameters
-
idx The EntityId to associate with the element.
args Arguments forwarded to the `T` constructor.
- Returns
Pointer to the inserted element, or `nullptr` if the index is already occupied.
Definition at line 230 of file SparseSet.ixx.
References helios::engine::ecs::SparseSet< T >::emplace and helios::engine::ecs::Tombstone.
Referenced by helios::engine::ecs::SparseSet< T >::emplace.
end()
| inline nodiscard |
end()
| inline nodiscard |
Returns a const iterator to the end of the dense storage.
- Returns
ConstIterator pointing past the last element.
Definition at line 502 of file SparseSet.ixx.
get()
| inline nodiscard |
Retrieves the element at the given index.
- Parameters
-
idx The EntityId to look up.
- Returns
Pointer to the element, or `nullptr` if not found.
Definition at line 330 of file SparseSet.ixx.
Reference helios::engine::ecs::Tombstone.
Referenced by helios::engine::ecs::SparseSet< T >::raw.
get()
| inline nodiscard |
Retrieves the element at the given index.
- Parameters
-
idx The EntityId to look up.
- Returns
Const Pointer to the element, or `nullptr` if not found.
Definition at line 346 of file SparseSet.ixx.
Reference helios::engine::ecs::Tombstone.
insert()
| inline nodiscard |
Inserts an element at the given index.
If the sparse array is too small, it is resized to accommodate the index. Empty slots are filled with `Tombstone`.
- Parameters
-
idx The EntityId to associate with the element.
obj The element to insert (moved).
- Returns
Pointer to the inserted element, or `nullptr` if the index is already occupied.
Definition at line 262 of file SparseSet.ixx.
Reference helios::engine::ecs::Tombstone.
raw()
| inline nodiscard virtual |
Returns a raw void pointer to the element at the given index.
- Parameters
-
id The EntityId to look up.
- Returns
Raw pointer to the element, or `nullptr` if not found.
Definition at line 370 of file SparseSet.ixx.
Reference helios::engine::ecs::SparseSet< T >::get.
remove()
| inline nodiscard virtual |
Removes the element at the given index using swap-and-pop.
Uses the swap-and-pop technique for O(1) removal: 1. Move the last element to the position of the removed element 2. Update the sparse array entry for the moved element 3. Pop the last element from dense storage 4. Mark the removed slot as Tombstone
- Parameters
-
idx The EntityId of the element to remove.
- Returns
`true` if the element was removed, `false` if not found.
Definition at line 297 of file SparseSet.ixx.
Reference helios::engine::ecs::Tombstone.
Private Member Attributes
denseToSparse_
|
Reverse mapping from dense index to EntityId.
Used during swap-and-pop removal to update the sparse array.
Definition at line 171 of file SparseSet.ixx.
sparse_
|
Maps EntityId to dense storage index.
Contains `Tombstone` for empty slots.
Definition at line 164 of file SparseSet.ixx.
storage_
|
Contiguous storage of elements.
Definition at line 176 of file SparseSet.ixx.
The documentation for this class was generated from the following file:
Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.15.0.