diff --git a/src/entt/entity/registry.hpp b/src/entt/entity/registry.hpp index beee2e1d5..430d32973 100644 --- a/src/entt/entity/registry.hpp +++ b/src/entt/entity/registry.hpp @@ -259,24 +259,23 @@ class basic_registry { template static void maybe_valid_if(group_handler &handler, basic_registry &owner, const Entity entt) { - const auto cpools = std::forward_as_tuple(owner.storage(), owner.storage()...); + if(auto &cpool = owner.storage(); (std::is_same_v || cpool.contains(entt)) && !(cpool.index(entt) < handler.current)) { + const auto other = std::forward_as_tuple(owner.storage()...); - const auto is_valid = ((std::is_same_v || std::get &>(cpools).contains(entt)) && ... && (std::is_same_v || std::get &>(cpools).contains(entt))) - && ((std::is_same_v || owner.storage().contains(entt)) && ...) - && ((std::is_same_v || !owner.storage().contains(entt)) && ...); - - if(is_valid && !(std::get<0>(cpools).index(entt) < handler.current)) { - const auto pos = handler.current++; - std::get &>(cpools).swap_elements(std::get &>(cpools).data()[pos], entt); - (std::get &>(cpools).swap_elements(std::get &>(cpools).data()[pos], entt), ...); + if(((std::is_same_v || std::get &>(other).contains(entt)) && ...) && ((std::is_same_v || owner.storage().contains(entt)) && ...) && ((std::is_same_v || !owner.storage().contains(entt)) && ...)) { + const auto pos = handler.current++; + cpool.swap_elements(cpool.data()[pos], entt); + (std::get &>(other).swap_elements(std::get &>(other).data()[pos], entt), ...); + } } } static void discard_if(group_handler &handler, basic_registry &owner, const Entity entt) { - if(const auto cpools = std::forward_as_tuple(owner.storage(), owner.storage()...); std::get<0>(cpools).contains(entt) && (std::get<0>(cpools).index(entt) < handler.current)) { + if(auto &cpool = owner.storage(); cpool.contains(entt) && (cpool.index(entt) < handler.current)) { const auto pos = --handler.current; - std::get &>(cpools).swap_elements(std::get &>(cpools).data()[pos], entt); - (std::get &>(cpools).swap_elements(std::get &>(cpools).data()[pos], entt), ...); + const auto other = std::forward_as_tuple(owner.storage()...); + cpool.swap_elements(cpool.data()[pos], entt); + (std::get &>(other).swap_elements(std::get &>(other).data()[pos], entt), ...); } } };