From 8df572aadbb3f9afba3d4df070c837d5338f0be5 Mon Sep 17 00:00:00 2001 From: NukeBird <nukebird.dev@gmail.com> Date: Sat, 15 Feb 2025 01:55:05 +0300 Subject: [PATCH] Remove multiple components at once --- tests/zecsy.cpp | 4 +++- zecsy.hpp | 25 +++++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/tests/zecsy.cpp b/tests/zecsy.cpp index 89e9d89..f6135e8 100644 --- a/tests/zecsy.cpp +++ b/tests/zecsy.cpp @@ -177,8 +177,10 @@ TEST_CASE("Attach multiple components to an entity and verify all are correctly REQUIRE(e.has<ChoosenOne, Name>()); REQUIRE(w.has<ChoosenOne, Name>(e)); - e.remove<ChoosenOne>(); + e.remove<ChoosenOne, Name>(); REQUIRE_FALSE(e.has<ChoosenOne, Name>()); REQUIRE_FALSE(w.has<ChoosenOne, Name>(e)); + REQUIRE_FALSE(e.has<ChoosenOne>()); + REQUIRE_FALSE(e.has<Name>()); } diff --git a/zecsy.hpp b/zecsy.hpp index 3423ad4..4a6d621 100644 --- a/zecsy.hpp +++ b/zecsy.hpp @@ -39,7 +39,7 @@ namespace zecsy template<typename... T> void set(const T&... comps); - template<typename T> + template<typename... T> void remove(); private: entity_id id = 0; @@ -78,6 +78,10 @@ namespace zecsy template<typename T> void remove(entity_id e); + + template<typename First, typename Second, typename... Rest> + requires(sizeof...(Rest) >= 0) + void remove(entity_id e); private: using comp_index = std::type_index; using comp_to_bitset = std::unordered_map<comp_index, zecsy_bits>; @@ -117,7 +121,7 @@ namespace zecsy template<typename... T> void set(entity_id e, const T&... comps); - template<typename T> + template<typename... T> void remove(entity_id e); private: zecsy_bits entities_bitset; @@ -277,16 +281,16 @@ namespace zecsy entity_dict[typeid(T)].erase(e); } - template<typename T> + template<typename... T> inline void world::remove(entity_id e) { - storage.remove<T>(e); + storage.remove<T...>(e); } - template<typename T> + template<typename... T> inline void entity::remove() { - w->remove<T>(id); + w->remove<T...>(id); } template<typename... T> @@ -320,4 +324,13 @@ namespace zecsy set(e, comp1); (set(e, rest_comps), ...); } + + template<typename First, typename Second, typename... Rest> + requires(sizeof...(Rest) >= 0) + inline void component_storage::remove(entity_id e) + { + remove<First>(e); + remove<Second>(e); + (remove<Rest>(e), ...); + } };