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), ...);
+    }
 };