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(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>());
}

View file

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