75 assert(m_EntityManager->IsAlive(e) &&
"Cannot Assign to Dead Entity");
78 auto& slot = SparseSlot(idx);
83 slot = m_Dense.size();
84 m_DenseEntities.push_back(e);
85 m_Dense.push_back(component);
90 m_Dense[slot] = component;
100 assert(m_EntityManager->IsAlive(e) &&
"Cannot Remove from Dead Entity");
103 auto& slot = SparseSlot(idx);
107 std::uint32_t last = m_Dense.size() - 1;
111 m_Dense[slot] = std::move(m_Dense[last]);
112 m_DenseEntities[slot] = m_DenseEntities[last];
118 m_DenseEntities.pop_back();
130 if (
auto* page = PageFor(idx))
132 return (*page)[GetPageOffset(idx)] != NPOS;
145 assert(m_EntityManager->IsAlive(e) &&
"Cannot Get on Dead Entity");
146 assert(
Has(e) &&
"Component not Present");
148 auto* page = PageFor(idx);
149 assert(page && (*page)[GetPageOffset(idx)] != NPOS);
150 return m_Dense[(*page)[GetPageOffset(idx)]];
160 assert(m_EntityManager->IsAlive(e) &&
"Cannot Get on Dead Entity");
161 assert(
Has(e) &&
"Component not Present");
163 auto* page = PageFor(idx);
164 assert(page && (*page)[GetPageOffset(idx)] != NPOS);
165 return m_Dense[(*page)[GetPageOffset(idx)]];
172 inline std::size_t
Size()
const
174 return m_Dense.size();
184 return m_DenseEntities[i];
193 std::uint32_t numPages = (amount + SPARSE_PAGE_SIZE - 1) / SPARSE_PAGE_SIZE;
195 if (m_Sparse.size() < numPages)
197 m_Sparse.resize(numPages,
nullptr);
200 for (std::size_t p = 0; p < numPages; ++p)
204 m_Sparse[p] =
new std::array<std::uint32_t, SPARSE_PAGE_SIZE>();
205 m_Sparse[p]->fill(NPOS);
209 m_Dense.reserve(amount);
210 m_DenseEntities.reserve(amount);
228 return m_EntityManager;
234 inline virtual void Clear()
override
236 for (
auto page : m_Sparse)
242 m_DenseEntities.clear();
247 std::uint32_t& SparseSlot(std::uint32_t idx)
249 std::uint32_t p = GetPageIndex(idx);
250 if (p >= m_Sparse.size())
252 m_Sparse.resize(p + 1,
nullptr);
257 m_Sparse[p] =
new std::array<std::uint32_t, SPARSE_PAGE_SIZE>();
258 m_Sparse[p]->fill(NPOS);
261 return (*m_Sparse[p])[GetPageOffset(idx)];
265 inline const std::uint32_t GetPageIndex(std::uint32_t idx)
const
267 return idx / SPARSE_PAGE_SIZE;
271 inline const std::uint32_t GetPageOffset(std::uint32_t idx)
const
273 return idx % SPARSE_PAGE_SIZE;
277 std::array<std::uint32_t, SPARSE_PAGE_SIZE>* PageFor(std::uint32_t idx)
279 std::uint32_t p = GetPageIndex(idx);
280 if (p >= m_Sparse.size())
286 const std::array<std::uint32_t, SPARSE_PAGE_SIZE>* PageFor(std::uint32_t idx)
const
288 std::uint32_t p = GetPageIndex(idx);
289 if (p >= m_Sparse.size())
294 std::vector<T> m_Dense;
295 std::vector<Entity> m_DenseEntities;
296 std::vector<std::array<std::uint32_t, SPARSE_PAGE_SIZE>*> m_Sparse;
297 Manager::EntityManager* m_EntityManager;
Interface for type-erased sparse sets.
Definition sparse_set.h:23
virtual Manager::EntityManager * GetEntityManager()=0
Gets the EntityManager associated with this pool.
virtual void Remove(Entity e)=0
Removes the component of a given entity.
virtual void SetEntityManager(Manager::EntityManager *m)=0
Sets the owning EntityManager for the pool.
virtual void Clear()=0
Clears all components in the pool.
virtual void SetEntityManager(Manager::EntityManager *m) override
Assigns the EntityManager used for liveness checks.
Definition sparse_set.h:217
bool Has(Entity e) const
Checks if the entity has a component.
Definition sparse_set.h:127
virtual void Remove(Entity e) override
Removes the component associated with an entity.
Definition sparse_set.h:98
void Reserve(std::size_t amount)
Pre-allocates memory for the given number of components.
Definition sparse_set.h:191
virtual Manager::EntityManager * GetEntityManager() override
Returns the EntityManager associated with this pool.
Definition sparse_set.h:226
Entity EntityAt(std::uint32_t i) const
Returns the entity as a specific index in the dense array.
Definition sparse_set.h:182
const T & Get(Entity e) const
Returns a const reference to the entity's components.
Definition sparse_set.h:158
void Insert(Entity e, const T &component)
Inserts or overrides a component for an entity,.
Definition sparse_set.h:73
virtual void Clear() override
Clears the sparse and dense storage completely.
Definition sparse_set.h:234
std::size_t Size() const
Returns the number of components currently stored.
Definition sparse_set.h:172
T & Get(Entity e)
Returns a mutable reference to the entity's components.
Definition sparse_set.h:143
Manages entity lifecycle, including creation, destruction, and version tracking.
Definition entity_manager.h:21
Defines the EntityManager, which handles creation and destruction of entities.
Defines core types and constants for the FECS ECS system.
std::uint32_t GetEntityIndex(Entity e)
Extracts the index portion from an entity ID.
Definition types.h:73
std::uint32_t Entity
Type alias for entity IDs (32-bit unsigned integer)
Definition types.h:28