From af8ec7b5dd275f8b6e0b1cd7dc03fd0e862f4289 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Tue, 18 Jan 2022 08:30:43 +0100 Subject: [PATCH] registry: remove/erase dispatch based on the iterator type --- src/entt/entity/registry.hpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/entt/entity/registry.hpp b/src/entt/entity/registry.hpp index 20cf6c31c..422e48914 100644 --- a/src/entt/entity/registry.hpp +++ b/src/entt/entity/registry.hpp @@ -663,6 +663,8 @@ public: */ template void destroy(It first, It last) { + ENTT_ASSERT(std::all_of(first, last, [this](const auto entity) { return valid(entity); }), "Invalid entity"); + if constexpr(is_iterator_type_v) { for(; first != last; ++first) { destroy(*first, entity_traits::to_version(*first) + 1u); @@ -836,12 +838,16 @@ public: */ template size_type remove(It first, It last) { + ENTT_ASSERT(std::all_of(first, last, [this](const auto entity) { return valid(entity); }), "Invalid entity"); size_type count{}; - for(const auto cpools = std::forward_as_tuple(assure(), assure()...); first != last; ++first) { - const auto entity = *first; - ENTT_ASSERT(valid(entity), "Invalid entity"); - count += (std::get &>(cpools).remove(entity) + ... + std::get &>(cpools).remove(entity)); + if constexpr(is_iterator_type_v && sizeof...(Other) != 0u) { + for(const auto cpools = std::forward_as_tuple(assure(), assure()...); first != last; ++first) { + const auto entity = *first; + count += (std::get &>(cpools).remove(entity) + ... + std::get &>(cpools).remove(entity)); + } + } else { + count = (assure().remove(first, last) + ... + assure().remove(first, last)); } return count; @@ -877,10 +883,15 @@ public: */ template void erase(It first, It last) { - for(const auto cpools = std::forward_as_tuple(assure(), assure()...); first != last; ++first) { - const auto entity = *first; - ENTT_ASSERT(valid(entity), "Invalid entity"); - (std::get &>(cpools).erase(entity), (std::get &>(cpools).erase(entity), ...)); + ENTT_ASSERT(std::all_of(first, last, [this](const auto entity) { return valid(entity); }), "Invalid entity"); + + if constexpr(is_iterator_type_v && sizeof...(Other) != 0u) { + for(const auto cpools = std::forward_as_tuple(assure(), assure()...); first != last; ++first) { + const auto entity = *first; + (std::get &>(cpools).erase(entity), (std::get &>(cpools).erase(entity), ...)); + } + } else { + (assure().erase(first, last), (assure().erase(first, last), ...)); } }