Remove multiple components at once

This commit is contained in:
NukeBird 2025-02-15 01:55:05 +03:00
parent 6861e87c61
commit 8df572aadb
2 changed files with 22 additions and 7 deletions

View file

@ -177,8 +177,10 @@ TEST_CASE("Attach multiple components to an entity and verify all are correctly
REQUIRE(e.has<ChoosenOne, Name>()); REQUIRE(e.has<ChoosenOne, Name>());
REQUIRE(w.has<ChoosenOne, Name>(e)); REQUIRE(w.has<ChoosenOne, Name>(e));
e.remove<ChoosenOne>(); e.remove<ChoosenOne, Name>();
REQUIRE_FALSE(e.has<ChoosenOne, Name>()); REQUIRE_FALSE(e.has<ChoosenOne, Name>());
REQUIRE_FALSE(w.has<ChoosenOne, Name>(e)); REQUIRE_FALSE(w.has<ChoosenOne, Name>(e));
REQUIRE_FALSE(e.has<ChoosenOne>());
REQUIRE_FALSE(e.has<Name>());
} }

View file

@ -39,7 +39,7 @@ namespace zecsy
template<typename... T> template<typename... T>
void set(const T&... comps); void set(const T&... comps);
template<typename T> template<typename... T>
void remove(); void remove();
private: private:
entity_id id = 0; entity_id id = 0;
@ -78,6 +78,10 @@ namespace zecsy
template<typename T> template<typename T>
void remove(entity_id e); void remove(entity_id e);
template<typename First, typename Second, typename... Rest>
requires(sizeof...(Rest) >= 0)
void remove(entity_id e);
private: private:
using comp_index = std::type_index; using comp_index = std::type_index;
using comp_to_bitset = std::unordered_map<comp_index, zecsy_bits>; using comp_to_bitset = std::unordered_map<comp_index, zecsy_bits>;
@ -117,7 +121,7 @@ namespace zecsy
template<typename... T> template<typename... T>
void set(entity_id e, const T&... comps); void set(entity_id e, const T&... comps);
template<typename T> template<typename... T>
void remove(entity_id e); void remove(entity_id e);
private: private:
zecsy_bits entities_bitset; zecsy_bits entities_bitset;
@ -277,16 +281,16 @@ namespace zecsy
entity_dict[typeid(T)].erase(e); entity_dict[typeid(T)].erase(e);
} }
template<typename T> template<typename... T>
inline void world::remove(entity_id e) 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() inline void entity::remove()
{ {
w->remove<T>(id); w->remove<T...>(id);
} }
template<typename... T> template<typename... T>
@ -320,4 +324,13 @@ namespace zecsy
set(e, comp1); set(e, comp1);
(set(e, rest_comps), ...); (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), ...);
}
}; };