2d-platformer/include/Entities/EntityMemoryPool.h

74 lines
1.4 KiB
C++

#pragma once
#include <cstddef>
#include <tuple>
#include <vector>
#include <Entities/Components.h>
#include <Containers.h>
#include <utility.h>
class EntityManager;
class Entity;
using ComponentsContainer = std::tuple
<
container::Array<Transform, util::MAX_ENTITIES>,
container::Array<Texture, util::MAX_ENTITIES>,
container::Array<BoundingBox, util::MAX_ENTITIES>
>;
class EntityMemoryPool
{
private:
friend class EntityManager;
friend class Entity;
ComponentsContainer m_components;
container::Array<Tag, util::MAX_ENTITIES> m_tags;
container::Array<bool, util::MAX_ENTITIES> m_aliveStates;
container::Array<size_t, util::MAX_ENTITIES> m_ids;
private:
EntityMemoryPool();
EntityMemoryPool(const EntityMemoryPool&) = delete;
static EntityMemoryPool& instance()
{
static EntityMemoryPool pool{};
return pool;
}
template<typename T>
bool hasComponent(EntityIndex index) const
{ return std::get<container::Array<T, util::MAX_ENTITIES>>(m_components)[index].active; }
template<typename T>
T& getComponent(EntityIndex index)
{
return std::get<container::Array<T, util::MAX_ENTITIES>>(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;
}
};