From a6fea6727bf1a2af618844504ec9e6a9301ce7fb Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Tue, 12 Sep 2023 08:54:38 +0200 Subject: [PATCH] sparse_set/storage: improve emplace(N) with non-sequential entities --- src/entt/entity/sparse_set.hpp | 8 ++++++-- src/entt/entity/storage.hpp | 9 +++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/entt/entity/sparse_set.hpp b/src/entt/entity/sparse_set.hpp index b3fc0b95e..083edfd55 100644 --- a/src/entt/entity/sparse_set.hpp +++ b/src/entt/entity/sparse_set.hpp @@ -363,7 +363,11 @@ protected: bump(entt); } - swap_at(static_cast(traits_type::to_entity(elem)), (pos = static_cast(head++))); + if(force_back) { + pos = static_cast(head++); + swap_at(static_cast(traits_type::to_entity(elem)), pos); + } + break; } @@ -760,7 +764,7 @@ public: * `end()` iterator otherwise. */ iterator push(const entity_type entt, const void *elem = nullptr) { - return try_emplace(entt, false, elem); + return try_emplace(entt, (mode == deletion_policy::swap_only), elem); } /** diff --git a/src/entt/entity/storage.hpp b/src/entt/entity/storage.hpp index 4886d6b82..9e5beff32 100644 --- a/src/entt/entity/storage.hpp +++ b/src/entt/entity/storage.hpp @@ -1091,16 +1091,13 @@ public: return emplace(); } else if(const auto curr = local_traits_type::construct(local_traits_type::to_entity(hint), base_type::current(hint)); curr == tombstone) { const auto pos = static_cast(local_traits_type::to_entity(hint)); + const auto entt = *base_type::try_emplace(hint, true); while(!(pos < base_type::size())) { - const auto it = base_type::try_emplace(entity_at(base_type::size()), true); - const auto entt = *it; - - base_type::swap_only(it); - base_type::bump(entt); + base_type::try_emplace(entity_at(base_type::size() - 1u), false); } - return *base_type::try_emplace(hint, true); + return entt; } else if(const auto idx = base_type::index(curr); idx < base_type::free_list()) { return emplace(); } else {