Browse Source

sparse_set/storage:
* removed basic_sparse_set<...>::emplace_back
* general cleanup

Michele Caini 4 years ago
parent
commit
de6b660b12
3 changed files with 17 additions and 35 deletions
  1. 11 20
      src/entt/entity/sparse_set.hpp
  2. 1 9
      src/entt/entity/storage.hpp
  3. 5 6
      test/entt/entity/sparse_set.cpp

+ 11 - 20
src/entt/entity/sparse_set.hpp

@@ -243,11 +243,7 @@ class basic_sparse_set {
     }
 
     std::size_t append(const Entity entt) {
-        if(const auto len = reserved.second(); count == len) {
-            const size_type sz = static_cast<size_type>(len * growth_factor_v);
-            resize_packed_array(sz + !(sz > len));
-        }
-
+        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<typename entity_traits::entity_type>(count), entity_traits::to_integral(entt));
         packed_array[count] = entt;
@@ -647,20 +643,6 @@ public:
         return packed_array[pos];
     }
 
-    /**
-     * @brief Appends an entity to a sparse set.
-     *
-     * @warning
-     * Attempting to assign an entity that already belongs to the sparse set
-     * results in undefined behavior.
-     *
-     * @param entt A valid identifier.
-     * @return The slot used for insertion.
-     */
-    size_type emplace_back(const entity_type entt) {
-        return append(entt);
-    }
-
     /**
      * @brief Assigns an entity to a sparse set.
      *
@@ -672,7 +654,16 @@ public:
      * @return The slot used for insertion.
      */
     size_type emplace(const entity_type entt) {
-        return (free_list == null) ? append(entt) : recycle(entt);
+        if(free_list == null) {
+            if(const auto len = reserved.second(); count == len) {
+                const size_type sz = static_cast<size_type>(len * growth_factor_v);
+                resize_packed_array(sz + !(sz > len));
+            }
+
+            return append(entt);
+        } else {
+            return recycle(entt);
+        }
     }
 
     /**

+ 1 - 9
src/entt/entity/storage.hpp

@@ -283,15 +283,7 @@ class basic_storage: public basic_sparse_set<Entity, typename std::allocator_tra
         reserve(req);
 
         for(; first != last; ++first) {
-            const auto pos = base_type::size();
-            construct(packed[page(pos)] + offset(pos), generator());
-
-            ENTT_TRY {
-                base_type::emplace_back(*first);
-            } ENTT_CATCH {
-                destroy(packed[page(pos)][offset(pos)]);
-                ENTT_THROW;
-            }
+            emplace(*first, generator());
         }
     }
 

+ 5 - 6
test/entt/entity/sparse_set.cpp

@@ -254,11 +254,11 @@ TEST(SparseSet, Emplace) {
     set.emplace(entities[0u]);
     set.erase(entities[0u]);
 
-    set.emplace_back(entities[0u]);
     set.emplace(entities[1u]);
+    set.emplace(entities[0u]);
 
     ASSERT_DEATH(set.emplace(traits_type::combine(3, 1)), "");
-    ASSERT_DEATH(set.emplace_back(entities[1u]), "");
+    ASSERT_DEATH(set.emplace(entities[1u]), "");
     
     ASSERT_EQ(set.at(0u), entities[1u]);
     ASSERT_EQ(set.at(1u), entities[0u]);
@@ -267,12 +267,11 @@ TEST(SparseSet, Emplace) {
 
     set.erase(std::begin(entities), std::end(entities));
     set.emplace(entities[1u]);
-    set.emplace_back(entities[0u]);
+    set.emplace(entities[0u]);
 
     ASSERT_EQ(set.at(0u), entities[1u]);
-    ASSERT_EQ(set.at(1u), static_cast<entt::entity>(entt::null));
-    ASSERT_EQ(set.at(2u), entities[0u]);
-    ASSERT_EQ(set.index(entities[0u]), 2u);
+    ASSERT_EQ(set.at(1u), entities[0u]);
+    ASSERT_EQ(set.index(entities[0u]), 1u);
     ASSERT_EQ(set.index(entities[1u]), 0u);
 }