From 3fd0403cc9bb3e0d4fb736b7c6c9f669e02ac850 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Wed, 11 Jan 2023 09:55:47 +0100 Subject: [PATCH] registry: faster, better range-erase --- src/entt/entity/registry.hpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/entt/entity/registry.hpp b/src/entt/entity/registry.hpp index 4b7f63a8f..f69c6959c 100644 --- a/src/entt/entity/registry.hpp +++ b/src/entt/entity/registry.hpp @@ -998,11 +998,24 @@ public: */ template void erase(It first, It last) { - if constexpr(sizeof...(Other) == 0u) { - assure().erase(std::move(first), std::move(last)); + 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]); + } + + cpools[pos]->erase(first, last); + } } else { - for(auto cpools = std::forward_as_tuple(assure(), assure()...); first != last; ++first) { - std::apply([entt = *first](auto &...curr) { (curr.erase(entt), ...); }, cpools); + for(; first != last; ++first) { + const auto entt = *first; + + for(size_type pos{}; pos < len; ++pos) { + cpools[pos]->erase(entt); + } } } }