Add non-throwing util::ecs::get_if

This commit is contained in:
Nikita Lisitsa 2021-07-22 10:51:32 +03:00
parent 1bdef9134d
commit 57fb1e8f1f

View file

@ -263,6 +263,18 @@ namespace psemek::util
template <typename Component>
typename Component::data const & get(handle species, handle entity) const;
template <typename Component>
Component * get_if(handle species);
template <typename Component>
Component const * get_if(handle species) const;
template <typename Component>
typename Component::data * get_if(handle species, handle entity);
template <typename Component>
typename Component::data const * get_if(handle species, handle entity) const;
template <typename Behavior>
void apply(Behavior && behavior) const;
@ -328,6 +340,33 @@ namespace psemek::util
return const_cast<typename Component::data const &>(const_cast<ecs *>(this)->get<Component>(species, entity));
}
template <typename Component>
Component * ecs::get_if(handle species)
{
return species_[species]->get_species_component<Component>();
}
template <typename Component>
Component const * ecs::get_if(handle species) const
{
return const_cast<typename Component::data const *>(const_cast<ecs *>(this)->get<Component>(species));
}
template <typename Component>
typename Component::data * ecs::get_if(handle species, handle entity)
{
auto p = species_[species]->get_entity_component<Component>();
if (p)
return p + entity;
return p;
}
template <typename Component>
typename Component::data const * ecs::get_if(handle species, handle entity) const
{
return const_cast<typename Component::data const *>(const_cast<ecs *>(this)->get<Component>(species, entity));
}
template <typename Behavior>
void ecs::apply(Behavior && behavior) const
{