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