diff --git a/src/entt/entity/sparse_set.hpp b/src/entt/entity/sparse_set.hpp index f5a649751..277e2612e 100644 --- a/src/entt/entity/sparse_set.hpp +++ b/src/entt/entity/sparse_set.hpp @@ -242,20 +242,17 @@ class basic_sparse_set { } } - std::size_t append(const Entity entt) { + void append(const Entity entt) { ENTT_ASSERT(count != reserved.second(), "Not enough space left"); ENTT_ASSERT(current(entt) == entity_traits::to_version(tombstone), "Slot not available"); assure_page(page(entt))[offset(entt)] = entity_traits::combine(static_cast(count), entity_traits::to_integral(entt)); - packed_array[count] = entt; - return count++; + packed_array[count++] = entt; } - std::size_t recycle(const Entity entt) ENTT_NOEXCEPT { + void recycle(const Entity entt) { ENTT_ASSERT(current(entt) == entity_traits::to_version(tombstone), "Slot not available"); - const auto pos = static_cast(entity_traits::to_entity(free_list)); assure_page(page(entt))[offset(entt)] = entity_traits::combine(entity_traits::to_integral(free_list), entity_traits::to_integral(entt)); - free_list = std::exchange(packed_array[pos], entt); - return pos; + free_list = std::exchange(packed_array[static_cast(entity_traits::to_entity(free_list))], entt); } protected: @@ -651,18 +648,17 @@ public: * results in undefined behavior. * * @param entt A valid identifier. - * @return The slot used for insertion. */ - size_type emplace(const entity_type entt) { + void emplace(const entity_type entt) { if(free_list == null) { if(const auto len = reserved.second(); count == len) { const size_type sz = static_cast(len * growth_factor_v); resize_packed_array(sz + !(sz > len)); } - return append(entt); + append(entt); } else { - return recycle(entt); + recycle(entt); } } diff --git a/src/entt/entity/storage.hpp b/src/entt/entity/storage.hpp index 0cae6824d..37c6427ef 100644 --- a/src/entt/entity/storage.hpp +++ b/src/entt/entity/storage.hpp @@ -271,7 +271,7 @@ class basic_storage: public basic_sparse_set - void recycle_or_append(It first, It last, Generator generator) { + void consume_range(It first, It last, Generator generator) { if constexpr(comp_traits::in_place_delete::value) { for(const auto sz = base_type::size(); first != last && base_type::slot() != sz; ++first) { emplace(*first, generator()); @@ -642,8 +642,8 @@ public: construct(elem, std::forward(args)...); ENTT_TRY { - [[maybe_unused]] const auto curr = base_type::emplace(entt); - ENTT_ASSERT(pos == curr, "Misplaced component"); + base_type::emplace(entt); + ENTT_ASSERT(pos == base_type::index(entt), "Misplaced component"); } ENTT_CATCH { destroy(packed[page(pos)][offset(pos)]); ENTT_THROW; @@ -682,7 +682,7 @@ public: */ template void insert(It first, It last, const value_type &value = {}) { - recycle_or_append(std::move(first), std::move(last), [&value]() -> decltype(auto) { return value; }); + consume_range(std::move(first), std::move(last), [&value]() -> decltype(auto) { return value; }); } /** @@ -699,7 +699,7 @@ public: */ template::value_type>, value_type>>> void insert(EIt first, EIt last, CIt from) { - recycle_or_append(std::move(first), std::move(last), [&from]() -> decltype(auto) { return *(from++); }); + consume_range(std::move(first), std::move(last), [&from]() -> decltype(auto) { return *(from++); }); } private: diff --git a/test/entt/entity/sparse_set.cpp b/test/entt/entity/sparse_set.cpp index 9c7ebb417..dcd48587a 100644 --- a/test/entt/entity/sparse_set.cpp +++ b/test/entt/entity/sparse_set.cpp @@ -32,7 +32,7 @@ TEST(SparseSet, Functionalities) { ASSERT_EQ(set.capacity(), 42u); ASSERT_TRUE(set.empty()); - ASSERT_EQ(set.emplace(entt::entity{42}), 0u); + set.emplace(entt::entity{42}); ASSERT_FALSE(set.empty()); ASSERT_EQ(set.size(), 1u); @@ -56,7 +56,7 @@ TEST(SparseSet, Functionalities) { ASSERT_EQ(set.at(0u), static_cast(entt::null)); ASSERT_EQ(set.at(1u), static_cast(entt::null)); - ASSERT_EQ(set.emplace(entt::entity{42}), 0u); + set.emplace(entt::entity{42}); ASSERT_FALSE(set.empty()); ASSERT_EQ(set.index(entt::entity{42}), 0u); @@ -279,13 +279,14 @@ TEST(SparseSet, EmplaceOutOfBounds) { entt::sparse_set set{entt::deletion_policy::in_place}; entt::entity entities[2u]{entt::entity{0}, entt::entity{ENTT_SPARSE_PAGE}}; - ASSERT_EQ(set.emplace(entities[0u]), 0u); + set.emplace(entities[0u]); + ASSERT_EQ(set.extent(), ENTT_SPARSE_PAGE); ASSERT_EQ(set.index(entities[0u]), 0u); set.erase(entities[0u]); + set.emplace(entities[1u]); - ASSERT_EQ(set.emplace(entities[1u]), 0u); ASSERT_EQ(set.extent(), 2u * ENTT_SPARSE_PAGE); ASSERT_EQ(set.index(entities[1u]), 0u); } @@ -481,12 +482,13 @@ TEST(SparseSet, StableErase) { ASSERT_TRUE(*set.begin() == entt::tombstone); ASSERT_EQ(set.slot(), 1u); - ASSERT_EQ(set.emplace(entities[0u]), 1u); + set.emplace(entities[0u]); + ASSERT_EQ(*++set.begin(), entities[0u]); - ASSERT_EQ(set.emplace(entities[1u]), 0u); - ASSERT_EQ(set.emplace(entities[2u]), 2u); - ASSERT_EQ(set.emplace(entt::entity{0}), 3u); + set.emplace(entities[1u]); + set.emplace(entities[2u]); + set.emplace(entt::entity{0}); ASSERT_EQ(set.size(), 4u); ASSERT_EQ(*set.begin(), entt::entity{0}); @@ -671,12 +673,13 @@ TEST(SparseSet, StableRemove) { ASSERT_TRUE(*set.begin() == entt::tombstone); ASSERT_EQ(set.slot(), 1u); - ASSERT_EQ(set.emplace(entities[0u]), 1u); + set.emplace(entities[0u]); + ASSERT_EQ(*++set.begin(), entities[0u]); - ASSERT_EQ(set.emplace(entities[1u]), 0u); - ASSERT_EQ(set.emplace(entities[2u]), 2u); - ASSERT_EQ(set.emplace(entt::entity{0}), 3u); + set.emplace(entities[1u]); + set.emplace(entities[2u]); + set.emplace(entt::entity{0}); ASSERT_EQ(set.size(), 4u); ASSERT_EQ(*set.begin(), entt::entity{0});