فهرست منبع

storage: prepare to directly create the single entity upon hint

Michele Caini 2 سال پیش
والد
کامیت
bec1f60859
1فایلهای تغییر یافته به همراه16 افزوده شده و 16 حذف شده
  1. 16 16
      src/entt/entity/storage.hpp

+ 16 - 16
src/entt/entity/storage.hpp

@@ -951,16 +951,16 @@ class basic_storage<Entity, Entity, Allocator>
     using underlying_type = basic_sparse_set<Entity, typename alloc_traits::template rebind_alloc<Entity>>;
     using underlying_type = basic_sparse_set<Entity, typename alloc_traits::template rebind_alloc<Entity>>;
     using underlying_iterator = typename underlying_type::basic_iterator;
     using underlying_iterator = typename underlying_type::basic_iterator;
 
 
-    auto entity_at(const std::size_t pos) const noexcept {
-        ENTT_ASSERT(pos < underlying_type::traits_type::to_entity(null), "Invalid element");
-        return underlying_type::traits_type::combine(static_cast<typename underlying_type::traits_type::entity_type>(pos), {});
+    auto next() noexcept {
+        ENTT_ASSERT(placeholder < underlying_type::traits_type::to_entity(null), "Invalid element");
+        return underlying_type::traits_type::combine(static_cast<typename underlying_type::traits_type::entity_type>(placeholder++), {});
     }
     }
 
 
 protected:
 protected:
     /*! @brief Erases all entities of a storage. */
     /*! @brief Erases all entities of a storage. */
     void pop_all() override {
     void pop_all() override {
         base_type::pop_all();
         base_type::pop_all();
-        next = {};
+        placeholder = {};
     }
     }
 
 
     /**
     /**
@@ -1003,7 +1003,7 @@ public:
      */
      */
     explicit basic_storage(const allocator_type &allocator)
     explicit basic_storage(const allocator_type &allocator)
         : base_type{type_id<void>(), deletion_policy::swap_only, allocator},
         : base_type{type_id<void>(), deletion_policy::swap_only, allocator},
-          next{} {}
+          placeholder{} {}
 
 
     /**
     /**
      * @brief Move constructor.
      * @brief Move constructor.
@@ -1011,7 +1011,7 @@ public:
      */
      */
     basic_storage(basic_storage &&other) noexcept
     basic_storage(basic_storage &&other) noexcept
         : base_type{std::move(other)},
         : base_type{std::move(other)},
-          next{other.next} {}
+          placeholder{other.placeholder} {}
 
 
     /**
     /**
      * @brief Allocator-extended move constructor.
      * @brief Allocator-extended move constructor.
@@ -1020,7 +1020,7 @@ public:
      */
      */
     basic_storage(basic_storage &&other, const allocator_type &allocator) noexcept
     basic_storage(basic_storage &&other, const allocator_type &allocator) noexcept
         : base_type{std::move(other), allocator},
         : base_type{std::move(other), allocator},
-          next{other.next} {}
+          placeholder{other.placeholder} {}
 
 
     /**
     /**
      * @brief Move assignment operator.
      * @brief Move assignment operator.
@@ -1029,7 +1029,7 @@ public:
      */
      */
     basic_storage &operator=(basic_storage &&other) noexcept {
     basic_storage &operator=(basic_storage &&other) noexcept {
         base_type::operator=(std::move(other));
         base_type::operator=(std::move(other));
-        next = other.next;
+        placeholder = other.placeholder;
         return *this;
         return *this;
     }
     }
 
 
@@ -1062,7 +1062,7 @@ public:
      */
      */
     entity_type emplace() {
     entity_type emplace() {
         const auto len = base_type::free_list();
         const auto len = base_type::free_list();
-        const auto entt = (len == next) ? entity_at(next++) : base_type::data()[len];
+        const auto entt = (len == base_type::size()) ? next() : base_type::data()[len];
         return *base_type::try_emplace(entt, true);
         return *base_type::try_emplace(entt, true);
     }
     }
 
 
@@ -1082,11 +1082,11 @@ public:
             const auto pos = static_cast<size_type>(underlying_type::traits_type::to_entity(hint));
             const auto pos = static_cast<size_type>(underlying_type::traits_type::to_entity(hint));
             const auto entt = *base_type::try_emplace(hint, true);
             const auto entt = *base_type::try_emplace(hint, true);
 
 
-            for(; next != pos; ++next) {
-                base_type::try_emplace(entity_at(next), false);
+            for(; placeholder != pos;) {
+                base_type::try_emplace(next(), false);
             }
             }
 
 
-            next = pos + 1u;
+            placeholder = pos + 1u;
             return entt;
             return entt;
         } else if(const auto idx = base_type::index(curr); idx < base_type::free_list()) {
         } else if(const auto idx = base_type::index(curr); idx < base_type::free_list()) {
             return emplace();
             return emplace();
@@ -1115,12 +1115,12 @@ public:
      */
      */
     template<typename It>
     template<typename It>
     void insert(It first, It last) {
     void insert(It first, It last) {
-        for(; first != last && base_type::free_list() != next; ++first) {
+        for(const auto sz = base_type::size(); first != last && base_type::free_list() != sz; ++first) {
             *first = *base_type::try_emplace(base_type::data()[base_type::free_list()], true);
             *first = *base_type::try_emplace(base_type::data()[base_type::free_list()], true);
         }
         }
 
 
-        for(; first != last; ++first, ++next) {
-            *first = *base_type::try_emplace(entity_at(next), true);
+        for(; first != last; ++first) {
+            *first = *base_type::try_emplace(next(), true);
         }
         }
     }
     }
 
 
@@ -1157,7 +1157,7 @@ public:
     }
     }
 
 
 private:
 private:
-    size_type next;
+    size_type placeholder;
 };
 };
 
 
 } // namespace entt
 } // namespace entt