From 9f36dfc0e408ff9d4fc63b5a4815bee5d3c1ebb6 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Tue, 22 Aug 2023 23:24:49 +0300 Subject: [PATCH] Make compilation fail if ecs::entity_container::create is called with several equal component types --- .../psemek/ecs/detail/all_different_types.hpp | 24 +++++++++++++++++++ .../include/psemek/ecs/entity_container.hpp | 4 ++++ 2 files changed, 28 insertions(+) create mode 100644 libs/ecs/include/psemek/ecs/detail/all_different_types.hpp diff --git a/libs/ecs/include/psemek/ecs/detail/all_different_types.hpp b/libs/ecs/include/psemek/ecs/detail/all_different_types.hpp new file mode 100644 index 00000000..27c7a5a9 --- /dev/null +++ b/libs/ecs/include/psemek/ecs/detail/all_different_types.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +namespace psemek::ecs::detail +{ + + template + struct all_different_types; + + template <> + struct all_different_types<> + : std::true_type + {}; + + template + struct all_different_types + : std::bool_constant<(!std::is_same_v && ...) && all_different_types::value> + {}; + + template + constexpr bool all_different_types_v = all_different_types::value; + +} diff --git a/libs/ecs/include/psemek/ecs/entity_container.hpp b/libs/ecs/include/psemek/ecs/entity_container.hpp index a86c7a24..a3c32b1c 100644 --- a/libs/ecs/include/psemek/ecs/entity_container.hpp +++ b/libs/ecs/include/psemek/ecs/entity_container.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -18,6 +19,7 @@ namespace psemek::ecs // Create an entity with the specified components // NB: equivalent to create() followed by a // series of attach() calls, but faster + // All components must be unique template entity_handle create(Components && ... components); @@ -57,6 +59,8 @@ namespace psemek::ecs template entity_handle entity_container::create(Components && ... components) { + static_assert(detail::all_different_types_v, "all component types must be different"); + detail::component_uuid_holder uuids; detail::component_mask mask = component_index_.make_component_mask(uuids.get());