diff --git a/headers/ecs.hpp/ecs.hpp b/headers/ecs.hpp/ecs.hpp index 48835fb..faa1969 100644 --- a/headers/ecs.hpp/ecs.hpp +++ b/headers/ecs.hpp/ecs.hpp @@ -679,6 +679,12 @@ namespace ecs_hpp return components_.unordered_erase(id); } + std::size_t remove_all() noexcept { + const std::size_t count = components_.size(); + components_.clear(); + return count; + } + T* find(entity_id id) noexcept { return components_.find(id); } @@ -744,6 +750,12 @@ namespace ecs_hpp return components_.unordered_erase(id); } + std::size_t remove_all() noexcept { + const std::size_t count = components_.size(); + components_.clear(); + return count; + } + T* find(entity_id id) noexcept { return components_.has(id) ? &empty_value_ @@ -1260,6 +1272,9 @@ namespace ecs_hpp std::size_t remove_all_components(const uentity& ent) noexcept; + template < typename T > + std::size_t remove_all_components() noexcept; + template < typename T > T& get_component(const uentity& ent); template < typename T > @@ -2190,6 +2205,14 @@ namespace ecs_hpp return removed_count; } + template < typename T > + std::size_t registry::remove_all_components() noexcept { + detail::component_storage* storage = find_storage_(); + return storage + ? storage->remove_all() + : 0u; + } + template < typename T > T& registry::get_component(const uentity& ent) { assert(valid_entity(ent)); diff --git a/untests/ecs_tests.cpp b/untests/ecs_tests.cpp index dbc87eb..4f9e68b 100644 --- a/untests/ecs_tests.cpp +++ b/untests/ecs_tests.cpp @@ -565,6 +565,33 @@ TEST_CASE("registry") { REQUIRE_FALSE(c2); REQUIRE_FALSE(as_const(c2)); } + { + ecs::registry w; + + ecs::entity e1 = w.create_entity(); + e1.assign_component(); + + ecs::entity e2 = w.create_entity(); + e2.assign_component(); + e2.assign_component(); + + ecs::entity e3 = w.create_entity(); + e3.assign_component(); + e3.assign_component(); + + REQUIRE(w.component_count() == 3u); + REQUIRE(w.component_count() == 2u); + + REQUIRE(w.remove_all_components() == 3u); + REQUIRE(w.component_count() == 0u); + REQUIRE(w.component_count() == 2u); + + REQUIRE(w.remove_all_components() == 2u); + REQUIRE(w.component_count() == 0u); + REQUIRE(w.component_count() == 0u); + + REQUIRE(w.remove_all_components() == 0u); + } } SECTION("prototypes") { {