Support non-default-constructible per-species component types in util::ecs

This commit is contained in:
Nikita Lisitsa 2021-07-23 23:28:44 +03:00
parent a944f8c4f4
commit 4f53537d27

View file

@ -53,7 +53,7 @@ namespace psemek::util
template <typename Behavior>
void apply(Behavior & behavior)
{
apply_impl(behavior, typename Behavior::component_types{});
apply_impl(behavior, static_cast<typename Behavior::component_types *>(nullptr), std::make_index_sequence<std::tuple_size_v<typename Behavior::component_types>>{});
}
virtual ~species_base() {}
@ -65,12 +65,12 @@ namespace psemek::util
private:
template <typename Behavior, typename ... Components>
void apply_impl(Behavior & behavior, std::tuple<Components...>)
template <typename Behavior, typename ... Components, std::size_t ... Is>
void apply_impl(Behavior & behavior, std::tuple<Components...> *, std::index_sequence<Is...>)
{
std::tuple<typename Components::data * ...> cptrs;
((std::get<typename Components::data *>(cptrs) = get_entity_component<Components>()), ...);
((std::get<Is>(cptrs) = get_entity_component<Components>()), ...);
auto all_nonzero = [](auto * ... ptrs)
{