diff --git a/src/entt/entity/sparse_set.hpp b/src/entt/entity/sparse_set.hpp index 2f439fda5..9e0c7b8fc 100644 --- a/src/entt/entity/sparse_set.hpp +++ b/src/entt/entity/sparse_set.hpp @@ -197,44 +197,38 @@ class basic_sparse_set { } void resize_packed(const std::size_t req) { - auto &allocator = reserved.first(); - auto &len = reserved.second(); - ENTT_ASSERT((req != len) && !(req < count), "Invalid request"); - const auto mem = alloc_traits::allocate(allocator, req); + ENTT_ASSERT((req != reserved.second()) && !(req < count), "Invalid request"); + const auto mem = alloc_traits::allocate(reserved.first(), req); std::uninitialized_fill(mem + count, mem + req, tombstone); if(packed) { std::uninitialized_copy(packed, packed + count, mem); - std::destroy(packed, packed + len); - alloc_traits::deallocate(allocator, packed, len); + std::destroy(packed, packed + reserved.second()); + alloc_traits::deallocate(reserved.first(), packed, reserved.second()); } packed = mem; - len = req; + reserved.second() = req; } void release_memory() { - auto &allocator = reserved.first(); - auto &len = reserved.second(); - if(packed) { - std::destroy(packed, packed + len); - alloc_traits::deallocate(allocator, packed, len); + std::destroy(packed, packed + reserved.second()); + alloc_traits::deallocate(reserved.first(), packed, reserved.second()); } if(sparse) { - alloc_ptr allocator_ptr{allocator}; - for(size_type pos{}; pos < bucket; ++pos) { if(sparse[pos]) { std::destroy(sparse[pos], sparse[pos] + sparse_page_v); - alloc_traits::deallocate(allocator, sparse[pos], sparse_page_v); + alloc_traits::deallocate(reserved.first(), sparse[pos], sparse_page_v); } - alloc_ptr_traits::destroy(allocator_ptr, std::addressof(sparse[pos])); + std::destroy_at(std::addressof(sparse[pos])); } + alloc_ptr allocator_ptr{reserved.first()}; alloc_ptr_traits::deallocate(allocator_ptr, sparse, bucket); } } @@ -316,9 +310,9 @@ protected: ENTT_ASSERT(entity_traits::to_version(elem) == entity_traits::to_version(tombstone), "Slot not available"); if(free_list == null) { - if(const auto len = reserved.second(); count == len) { - const size_type sz = static_cast(len * growth_factor_v); - resize_packed(sz + !(sz > len)); + if(count == reserved.second()) { + const size_type sz = static_cast(reserved.second() * growth_factor_v); + resize_packed(sz + !(sz > reserved.second())); } elem = entity_traits::combine(static_cast(count), entity_traits::to_integral(entt)); diff --git a/src/entt/entity/storage.hpp b/src/entt/entity/storage.hpp index 1778626d7..53878c1f9 100644 --- a/src/entt/entity/storage.hpp +++ b/src/entt/entity/storage.hpp @@ -199,36 +199,33 @@ class basic_storage: public basic_sparse_set(pos); @@ -236,22 +233,19 @@ class basic_storage: public basic_sparse_set void consume_range(It first, It last, Generator generator) { for(const auto sz = base_type::size(); first != last && base_type::slot() != sz; ++first) { @@ -337,7 +324,7 @@ protected: void move_and_pop(const std::size_t from, const std::size_t to) final { auto &elem = element_at(from); construct(assure_at_least(to), std::move(elem)); - destroy(elem); + std::destroy_at(std::addressof(elem)); } /** @@ -355,7 +342,7 @@ protected: // support for nosy destructors [[maybe_unused]] auto unused = std::move(target); target = std::move(elem); - destroy(elem); + std::destroy_at(std::addressof(elem)); base_type::swap_and_pop(entt, ud); } @@ -369,7 +356,7 @@ protected: const auto pos = base_type::index(entt); base_type::in_place_pop(entt, ud); // support for nosy destructors - destroy(element_at(pos)); + std::destroy_at(std::addressof(element_at(pos))); } /** @@ -386,7 +373,7 @@ protected: base_type::try_emplace(entt, nullptr); ENTT_ASSERT(pos == base_type::index(entt), "Misplaced component"); } ENTT_CATCH { - destroy(element_at(pos)); + std::destroy_at(std::addressof(element_at(pos))); ENTT_THROW; } } @@ -684,7 +671,7 @@ public: base_type::try_emplace(entt, nullptr); ENTT_ASSERT(pos == base_type::index(entt), "Misplaced component"); } ENTT_CATCH { - destroy(element_at(pos)); + std::destroy_at(std::addressof(element_at(pos))); ENTT_THROW; }