6#include <unordered_map>
14template <
typename... AllComponentTypes>
17 mutable std::tuple<SparseSet<Entity, AllComponentTypes>...> componentSets;
20 template <
typename ComponentType>
23 auto& componentSet = getComponentSet<ComponentType>();
24 componentSet.set(entity, std::move(component));
27 template <
typename T,
typename Func>
30 T& c = getComponent<T>(e);
37 getComponent<T>(e) = c;
40 template <
typename ComponentType>
43 auto& componentSet = getComponentSet<ComponentType>();
44 componentSet.remove(entity);
47 template <
typename... ComponentTypes>
50 (removeComponent<ComponentTypes>(entity), ...);
58 template <
typename ComponentType>
61 auto& componentSet = getComponentSet<ComponentType>();
63 return componentSet.get(entity);
66 template <
typename ComponentType>
69 const auto& componentSet = getComponentSet<ComponentType>();
71 return componentSet.get(entity);
74 template <
typename ComponentType>
77 return getComponentSet<ComponentType>().contains(entity);
80 template <
typename... ComponentTypes>
83 std::vector<Entity> entities;
84 bool isFirstComponentType =
true;
87 forEachComponentType<ComponentTypes...>(
88 [
this, &entities, &isFirstComponentType]<
typename T>()
90 if (isFirstComponentType)
92 entities = getComponentSet<T>().getKeys();
93 isFirstComponentType =
false;
98 std::vector<Easys::Entity> newEntities;
99 newEntities.reserve(entities.size());
101 for (
const auto& e : entities)
103 if (hasComponent<T>(e))
105 newEntities.push_back(e);
109 entities = std::move(newEntities);
123 template <
typename... ComponentTypes>
126 return (... + getComponentSet<ComponentTypes>().
size());
131 return size<AllComponentTypes...>();
134 template <
typename... ComponentTypes>
137 (getComponentSet<ComponentTypes>().clear(), ...);
142 clear<AllComponentTypes...>();
146 template <
typename T>
147 static constexpr bool isRegisteredComponent = (std::is_same_v<T, AllComponentTypes> || ...);
149 template <
typename... ComponentTypes,
typename Func>
150 inline void forEachComponentType(Func&& f)
const
153 auto staticAssertAndCall = [&f]<
typename T>()
155 static_assert(isRegisteredComponent<T>,
"Tried to access an unregistered component type in ECS.");
156 f.template operator()<T>();
159 (staticAssertAndCall.template operator()<ComponentTypes>(), ...);
162 template <
typename ComponentType>
163 inline SparseSet<Entity, ComponentType>& getComponentSet()
165 static_assert(isRegisteredComponent<ComponentType>,
"Tried to access an unregistered component type.");
166 return std::get<SparseSet<Entity, ComponentType>>(componentSets);
169 template <
typename ComponentType>
170 inline const SparseSet<Entity, ComponentType>& getComponentSet()
const
172 static_assert(isRegisteredComponent<ComponentType>,
"Tried to access an unregistered component type.");
173 return std::get<SparseSet<Entity, ComponentType>>(componentSets);
Definition registry.hpp:15
ComponentType & getComponent(const Entity entity)
Definition registry.hpp:59
size_t size() const
Definition registry.hpp:129
const ComponentType & getComponent(const Entity entity) const
Definition registry.hpp:67
void modifyComponent(const Entity e, Func &&fn)
Definition registry.hpp:28
void removeComponents(const Entity entity)
Definition registry.hpp:48
void clear()
Definition registry.hpp:135
void addComponent(const Entity entity, const ComponentType &component)
Definition registry.hpp:21
void modifyComponent(const Entity e, T c)
Definition registry.hpp:35
void clear()
Definition registry.hpp:140
bool hasComponent(const Entity entity) const
Definition registry.hpp:75
void removeComponents(const Entity entity)
Definition registry.hpp:53
void removeComponent(const Entity entity)
Definition registry.hpp:41
std::vector< Entity > getEntities() const
Definition registry.hpp:81
size_t size() const
Definition registry.hpp:124
EASYS_ENTITY_TYPE Entity
Definition entity.hpp:11