diff --git a/src/entt/entity/group.hpp b/src/entt/entity/group.hpp index 389287801..d4b82c8a4 100644 --- a/src/entt/entity/group.hpp +++ b/src/entt/entity/group.hpp @@ -109,27 +109,28 @@ class group_handler, get_t, exclude_t> fin using base_type = std::common_type_t; using entity_type = typename base_type::entity_type; - void swap_elements(const std::size_t pos, const entity_type entt) { - std::apply([pos, entt](auto *...cpool) { (cpool->swap_elements(cpool->data()[pos], entt), ...); }, pools); + template + void swap_elements(const std::size_t pos, const entity_type entt, std::index_sequence) { + (std::get(pools)->swap_elements(std::get(pools)->data()[pos], entt), ...); } void push_on_construct(const entity_type entt) { if(std::apply([entt, len = len](auto *cpool, auto *...other) { return cpool->contains(entt) && !(cpool->index(entt) < len) && (other->contains(entt) && ...); }, pools) && std::apply([entt](auto *...cpool) { return (!cpool->contains(entt) && ...); }, filter)) { - swap_elements(len++, entt); + swap_elements(len++, entt, std::index_sequence_for{}); } } void push_on_destroy(const entity_type entt) { if(std::apply([entt, len = len](auto *cpool, auto *...other) { return cpool->contains(entt) && !(cpool->index(entt) < len) && (other->contains(entt) && ...); }, pools) && std::apply([entt](auto *...cpool) { return (0u + ... + cpool->contains(entt)) == 1u; }, filter)) { - swap_elements(len++, entt); + swap_elements(len++, entt, std::index_sequence_for{}); } } void remove_if(const entity_type entt) { if(std::get<0>(pools)->contains(entt) && (std::get<0>(pools)->index(entt) < len)) { - swap_elements(--len, entt); + swap_elements(--len, entt, std::index_sequence_for{}); } } @@ -163,13 +164,11 @@ public: return len; } - template - Type pools_as() const noexcept { + auto pools_as_tuple() const noexcept { return pools; } - template - Type filter_as() const noexcept { + auto filter_as_tuple() const noexcept { return filter; } @@ -231,13 +230,11 @@ public: return elem; } - template - Type pools_as() const noexcept { + auto pools_as_tuple() const noexcept { return pools; } - template - Type filter_as() const noexcept { + auto filter_as_tuple() const noexcept { return filter; } @@ -291,12 +288,12 @@ class basic_group, get_t, exclude_t> { auto pools() const noexcept { using return_type = std::tuple; - return descriptor ? descriptor->template pools_as() : return_type{}; + return descriptor ? descriptor->pools_as_tuple() : return_type{}; } auto filter() const noexcept { using return_type = std::tuple; - return descriptor ? descriptor->template filter_as() : return_type{}; + return descriptor ? descriptor->filter_as_tuple() : return_type{}; } public: @@ -712,12 +709,12 @@ class basic_group, get_t, exclude_t> { auto pools() const noexcept { using return_type = std::tuple; - return descriptor ? descriptor->template pools_as() : return_type{}; + return descriptor ? descriptor->pools_as_tuple() : return_type{}; } auto filter() const noexcept { using return_type = std::tuple; - return descriptor ? descriptor->template filter_as() : return_type{}; + return descriptor ? descriptor->filter_as_tuple() : return_type{}; } public: diff --git a/test/entt/entity/group.cpp b/test/entt/entity/group.cpp index b366837c2..aea5878ca 100644 --- a/test/entt/entity/group.cpp +++ b/test/entt/entity/group.cpp @@ -1503,6 +1503,25 @@ TEST(OwningGroup, PreventEarlyOptOut) { }); } +TEST(OwningGroup, SwapElements) { + entt::registry registry; + std::array entity{registry.create(), registry.create(), registry.create()}; + + registry.emplace(entity[1u]); + registry.emplace(entity[0u]); + + registry.emplace(entity[2u]); + registry.emplace(entity[0u]); + + ASSERT_EQ(registry.storage().index(entity[0u]), 1u); + ASSERT_EQ(registry.storage().index(entity[0u]), 1u); + + const auto group = registry.group(entt::get); + + ASSERT_EQ(registry.storage().index(entity[0u]), 0u); + ASSERT_EQ(registry.storage().index(entity[0u]), 1u); +} + TEST(OwningGroup, SwappingValuesIsAllowed) { entt::registry registry; const auto group = registry.group(entt::get);