Răsfoiți Sursa

sparse_set: remove the cursed ::slot function (finally)

Michele Caini 4 ani în urmă
părinte
comite
2f03b225f7

+ 0 - 8
src/entt/entity/sparse_set.hpp

@@ -407,14 +407,6 @@ public:
         return mode;
     }
 
-    /**
-     * @brief Returns the next slot available for insertion.
-     * @return The next slot available for insertion.
-     */
-    [[nodiscard]] size_type slot() const ENTT_NOEXCEPT {
-        return free_list == null ? packed.size() : static_cast<size_type>(entity_traits::to_entity(free_list));
-    }
-
     /**
      * @brief Increases the capacity of a sparse set.
      *

+ 4 - 6
src/entt/entity/storage.hpp

@@ -285,15 +285,13 @@ class basic_storage: public basic_sparse_set<Entity, typename std::allocator_tra
     }
 
     void shrink_to_size(const std::size_t sz) {
-        if(const auto length = base_type::size(); base_type::slot() == length) {
-            for(auto pos = sz; pos < length; ++pos) {
-                std::destroy_at(std::addressof(element_at(pos)));
-            }
-        } else {
-            for(auto pos = sz; pos < length; ++pos) {
+        for(auto pos = sz, length = base_type::size(); pos < length; ++pos) {
+            if constexpr(comp_traits::in_place_delete) {
                 if(base_type::at(pos) != tombstone) {
                     std::destroy_at(std::addressof(element_at(pos)));
                 }
+            } else {
+                std::destroy_at(std::addressof(element_at(pos)));
             }
         }
 

+ 0 - 16
test/entt/entity/sparse_set.cpp

@@ -423,7 +423,6 @@ TEST(SparseSet, StableErase) {
     ASSERT_TRUE(set.at(0u) == entt::tombstone);
     ASSERT_TRUE(set.at(1u) == entt::tombstone);
     ASSERT_TRUE(set.at(2u) == entt::tombstone);
-    ASSERT_EQ(set.slot(), 0u);
 
     set.emplace(entities[0u]);
     set.emplace(entities[1u]);
@@ -439,7 +438,6 @@ TEST(SparseSet, StableErase) {
     ASSERT_EQ(*set.begin(), entities[2u]);
     ASSERT_TRUE(set.at(0u) == entt::tombstone);
     ASSERT_TRUE(set.at(1u) == entt::tombstone);
-    ASSERT_EQ(set.slot(), 1u);
 
     set.erase(entities[2u]);
 
@@ -447,7 +445,6 @@ TEST(SparseSet, StableErase) {
     ASSERT_FALSE(set.empty());
     ASSERT_EQ(set.size(), 3u);
     ASSERT_EQ(set.current(entities[2u]), traits_type::to_version(entt::tombstone));
-    ASSERT_EQ(set.slot(), 2u);
 
     set.emplace(entities[0u]);
     set.emplace(entities[1u]);
@@ -463,7 +460,6 @@ TEST(SparseSet, StableErase) {
     ASSERT_EQ(set.at(1u), entities[2u]);
     ASSERT_TRUE(set.at(2u) == entt::tombstone);
     ASSERT_EQ(*++set.begin(), entities[2u]);
-    ASSERT_EQ(set.slot(), 0u);
 
     set.compact();
 
@@ -474,14 +470,12 @@ TEST(SparseSet, StableErase) {
     ASSERT_EQ(set.current(entities[2u]), traits_type::to_version(entities[2u]));
     ASSERT_TRUE(set.at(0u) == entities[2u]);
     ASSERT_EQ(*set.begin(), entities[2u]);
-    ASSERT_EQ(set.slot(), 1u);
 
     set.clear();
 
     ASSERT_EQ(set.size(), 1u);
     ASSERT_EQ(set.current(entities[2u]), traits_type::to_version(entt::tombstone));
     ASSERT_TRUE(set.at(0u) == entt::tombstone);
-    ASSERT_EQ(set.slot(), 0u);
 
     set.compact();
 
@@ -497,7 +491,6 @@ TEST(SparseSet, StableErase) {
     ASSERT_NE(set.current(entities[0u]), traits_type::to_version(entt::tombstone));
     ASSERT_NE(set.current(entities[1u]), traits_type::to_version(entt::tombstone));
     ASSERT_EQ(set.current(entities[2u]), traits_type::to_version(entt::tombstone));
-    ASSERT_EQ(set.slot(), 2u);
 
     set.erase(entities[0u]);
     set.erase(entities[1u]);
@@ -508,7 +501,6 @@ TEST(SparseSet, StableErase) {
     ASSERT_EQ(set.current(entities[1u]), traits_type::to_version(entt::tombstone));
     ASSERT_EQ(set.current(entities[2u]), traits_type::to_version(entt::tombstone));
     ASSERT_TRUE(*set.begin() == entt::tombstone);
-    ASSERT_EQ(set.slot(), 1u);
 
     set.emplace(entities[0u]);
 
@@ -620,7 +612,6 @@ TEST(SparseSet, StableRemove) {
     ASSERT_TRUE(set.at(0u) == entt::tombstone);
     ASSERT_TRUE(set.at(1u) == entt::tombstone);
     ASSERT_TRUE(set.at(2u) == entt::tombstone);
-    ASSERT_EQ(set.slot(), 0u);
 
     set.emplace(entities[0u]);
     set.emplace(entities[1u]);
@@ -637,7 +628,6 @@ TEST(SparseSet, StableRemove) {
     ASSERT_EQ(*set.begin(), entities[2u]);
     ASSERT_TRUE(set.at(0u) == entt::tombstone);
     ASSERT_TRUE(set.at(1u) == entt::tombstone);
-    ASSERT_EQ(set.slot(), 1u);
 
     ASSERT_EQ(set.remove(entities[2u]), 1u);
     ASSERT_EQ(set.remove(entities[2u]), 0u);
@@ -645,7 +635,6 @@ TEST(SparseSet, StableRemove) {
     ASSERT_FALSE(set.empty());
     ASSERT_EQ(set.size(), 3u);
     ASSERT_EQ(set.current(entities[2u]), traits_type::to_version(entt::tombstone));
-    ASSERT_EQ(set.slot(), 2u);
 
     set.emplace(entities[0u]);
     set.emplace(entities[1u]);
@@ -663,7 +652,6 @@ TEST(SparseSet, StableRemove) {
     ASSERT_EQ(set.at(1u), entities[2u]);
     ASSERT_TRUE(set.at(2u) == entt::tombstone);
     ASSERT_EQ(*++set.begin(), entities[2u]);
-    ASSERT_EQ(set.slot(), 0u);
 
     set.compact();
 
@@ -674,14 +662,12 @@ TEST(SparseSet, StableRemove) {
     ASSERT_EQ(set.current(entities[2u]), traits_type::to_version(entities[2u]));
     ASSERT_TRUE(set.at(0u) == entities[2u]);
     ASSERT_EQ(*set.begin(), entities[2u]);
-    ASSERT_EQ(set.slot(), 1u);
 
     set.clear();
 
     ASSERT_EQ(set.size(), 1u);
     ASSERT_EQ(set.current(entities[2u]), traits_type::to_version(entt::tombstone));
     ASSERT_TRUE(set.at(0u) == entt::tombstone);
-    ASSERT_EQ(set.slot(), 0u);
 
     set.compact();
 
@@ -697,7 +683,6 @@ TEST(SparseSet, StableRemove) {
     ASSERT_NE(set.current(entities[0u]), traits_type::to_version(entt::tombstone));
     ASSERT_NE(set.current(entities[1u]), traits_type::to_version(entt::tombstone));
     ASSERT_EQ(set.current(entities[2u]), traits_type::to_version(entt::tombstone));
-    ASSERT_EQ(set.slot(), 2u);
 
     ASSERT_EQ(set.remove(entities[0u]), 1u);
     ASSERT_EQ(set.remove(entities[1u]), 1u);
@@ -708,7 +693,6 @@ TEST(SparseSet, StableRemove) {
     ASSERT_EQ(set.current(entities[1u]), traits_type::to_version(entt::tombstone));
     ASSERT_EQ(set.current(entities[2u]), traits_type::to_version(entt::tombstone));
     ASSERT_TRUE(*set.begin() == entt::tombstone);
-    ASSERT_EQ(set.slot(), 1u);
 
     set.emplace(entities[0u]);