#pragma once #include #include #include #include #include #include class EntityManager; class Entity; using ComponentsContainer = std::tuple < container::Array, container::Array, container::Array >; class EntityMemoryPool { private: friend class EntityManager; friend class Entity; ComponentsContainer m_components; container::Array m_tags; container::Array m_aliveStates; container::Array m_ids; private: EntityMemoryPool(); EntityMemoryPool(const EntityMemoryPool&) = delete; static EntityMemoryPool& instance() { static EntityMemoryPool pool{}; return pool; } template bool hasComponent(EntityIndex index) const { return std::get>(m_components)[index].active; } template T& getComponent(EntityIndex index) { return std::get>(m_components)[index]; } Tag getTag(EntityIndex index) const { return m_tags[index]; } bool getAlive(EntityIndex index) const { return m_aliveStates[index]; } size_t& getId(EntityIndex index) { return m_ids[index]; } void removeEntity(EntityIndex index) { m_aliveStates[index] = false; return; } };