template <typename... Types>
struct Storage
{
- using type = std::tuple<std::vector<Types>...>;
- using type = std::tuple<std::deque<Types>..., std::deque<char> >;
++ using type = std::tuple<std::deque<Types>...>;
};
using ComponentsStorage =
typename EC::Meta::Morph<ComponentsList, Storage<> >::type;
template <typename Component>
Component* getEntityData(const std::size_t& index)
{
- constexpr auto componentIndex = EC::Meta::IndexOf<
- Component, Components>::value;
- if(componentIndex < Components::size)
+ if constexpr (EC::Meta::Contains<Component, Components>::value)
{
- return &std::get<std::vector<Component> >(componentsStorage)
- // Cast required due to compiler thinking that an invalid
- // Component is needed even though the enclosing if statement
- // prevents this from ever happening.
- return (Component*) &std::get<componentIndex>(
- componentsStorage).at(index);
++ return &std::get<std::deque<Component> >(componentsStorage)
+ .at(index);
}
else
{
template <typename Component>
const Component* getEntityData(const std::size_t& index) const
{
- constexpr auto componentIndex = EC::Meta::IndexOf<
- Component, Components>::value;
- if(componentIndex < Components::size)
+ if constexpr (EC::Meta::Contains<Component, Components>::value)
{
- return &std::get<std::vector<Component> >(componentsStorage)
- // Cast required due to compiler thinking that an invalid
- // Component is needed even though the enclosing if statement
- // prevents this from ever happening.
- return (Component*) &std::get<componentIndex>(
- componentsStorage).at(index);
++ return &std::get<std::deque<Component> >(componentsStorage)
+ .at(index);
}
else
{
{
return;
}
+ else
+ {
+ if(!isAlive(entityID))
+ {
+ return;
+ }
+ Component component(std::forward<Args>(args)...);
- Component component(std::forward<Args>(args)...);
-
- std::get<BitsetType>(
- entities[entityID]
- ).template getComponentBit<Component>() = true;
-
- constexpr auto index =
- EC::Meta::IndexOf<Component, Components>::value;
+ std::get<BitsetType>(
+ entities[entityID]
+ ).template getComponentBit<Component>() = true;
- std::get<std::vector<Component> >(componentsStorage)[entityID]
- // Cast required due to compiler thinking that deque<char> at
- // index = Components::size is being used, even if the previous
- // if statement will prevent this from ever happening.
- (*((std::deque<Component>*)(&std::get<index>(
- componentsStorage
- ))))[entityID] = std::move(component);
++ std::get<std::deque<Component> >(componentsStorage)[entityID]
+ = std::move(component);
+ }
}
/*!
{
return;
}
-
- std::get<BitsetType>(
- entities[entityID]
- ).template getTagBit<Tag>() = false;
+ else
+ {
+ if(!isAlive(entityID))
+ {
+ return;
+ }
+ std::get<BitsetType>(
+ entities[entityID]
+ ).template getTagBit<Tag>() = false;
+ }
}
+ /*!
+ \brief Resets the Manager, removing all entities.
+
+ Some data may persist but will be overwritten when new entities
+ are added. Thus, do not depend on data to persist after a call to
+ reset().
+ */
+ void reset()
+ {
+ clearForMatchingFunctions();
+
+ currentSize = 0;
+ currentCapacity = 0;
+ deletedSet.clear();
+ resize(EC_INIT_ENTITIES_SIZE);
+ }
+
private:
template <typename... Types>
struct ForMatchingSignatureHelper