From 1e9c9fe5f8a2b74eeb3cb8bc69ba6d7a893e4c32 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Wed, 11 Jan 2023 10:15:19 +0100 Subject: [PATCH] registry: better, faster range-remove + refine range-erase --- src/entt/entity/registry.hpp | 39 ++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/entt/entity/registry.hpp b/src/entt/entity/registry.hpp index f69c6959c..38076049e 100644 --- a/src/entt/entity/registry.hpp +++ b/src/entt/entity/registry.hpp @@ -956,17 +956,28 @@ public: */ template size_type remove(It first, It last) { - if constexpr(sizeof...(Other) == 0u) { - return assure().remove(std::move(first), std::move(last)); - } else { - size_type count{}; + size_type count{}; + if constexpr(sizeof...(Other) == 0u) { + count += assure().remove(std::move(first), std::move(last)); + } else if constexpr(std::is_same_v) { + constexpr size_type len = sizeof...(Other) + 1u; + basic_common_type *cpools[len]{&assure(), &assure()...}; + + for(size_type pos{}; pos < len; ++pos) { + if(cpools[pos]->data() == first.data()) { + std::swap(cpools[pos], cpools[len - 1u]); + } + + count += cpools[pos]->remove(first, last); + } + } else { for(auto cpools = std::forward_as_tuple(assure(), assure()...); first != last; ++first) { count += std::apply([entt = *first](auto &...curr) { return (curr.remove(entt) + ... + 0u); }, cpools); } - - return count; } + + return count; } /** @@ -998,10 +1009,12 @@ public: */ template void erase(It first, It last) { - constexpr size_type len = sizeof...(Other) + 1u; - basic_common_type *cpools[len]{&assure(), &assure()...}; + if constexpr(sizeof...(Other) == 0u) { + assure().erase(std::move(first), std::move(last)); + } else if constexpr(std::is_same_v) { + constexpr size_type len = sizeof...(Other) + 1u; + basic_common_type *cpools[len]{&assure(), &assure()...}; - if constexpr(std::is_same_v) { for(size_type pos{}; pos < len; ++pos) { if(cpools[pos]->data() == first.data()) { std::swap(cpools[pos], cpools[len - 1u]); @@ -1010,12 +1023,8 @@ public: cpools[pos]->erase(first, last); } } else { - for(; first != last; ++first) { - const auto entt = *first; - - for(size_type pos{}; pos < len; ++pos) { - cpools[pos]->erase(entt); - } + for(auto cpools = std::forward_as_tuple(assure(), assure()...); first != last; ++first) { + std::apply([entt = *first](auto &...curr) { (curr.erase(entt), ...); }, cpools); } } }