Explorar o código

pool/storage/sparse_set: pushed range-erase at the bottom of the hierarchy

Michele Caini %!s(int64=5) %!d(string=hai) anos
pai
achega
9a0650c703
Modificáronse 3 ficheiros con 28 adicións e 16 borrados
  1. 6 12
      src/entt/entity/pool.hpp
  2. 20 2
      src/entt/entity/sparse_set.hpp
  3. 2 2
      src/entt/entity/storage.hpp

+ 6 - 12
src/entt/entity/pool.hpp

@@ -168,7 +168,7 @@ struct default_pool final: basic_storage<Entity, Type> {
     /**
      * @brief Removes multiple entities from a pool.
      *
-     * @see remove
+     * @see erase
      *
      * @tparam It Type of input iterator.
      * @param owner The registry that issued the request.
@@ -177,19 +177,13 @@ struct default_pool final: basic_storage<Entity, Type> {
      */
     template<typename It>
     void erase(basic_registry<entity_type> &owner, It first, It last) {
-        if(std::distance(first, last) == std::distance(this->begin(), this->end())) {
-            if(!destruction.empty()) {
-                for(; first != last; ++first) {
-                    destruction.publish(owner, *first);
-                }
-            }
-
-            this->clear();
-        } else {
-            for(; first != last; ++first) {
-                this->erase(owner, *first);
+        if(!destruction.empty()) {
+            for(auto it = first; it != last; ++it) {
+                destruction.publish(owner, *it);
             }
         }
+
+        basic_sparse_set<entity_type>::erase(first, last);
     }
 
     /**

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

@@ -425,7 +425,7 @@ public:
      *
      * @param entt A valid entity identifier.
      */
-    void erase(const entity_type entt) {
+    virtual void erase(const entity_type entt) {
         ENTT_ASSERT(contains(entt));
         const auto curr = page(entt);
         const auto pos = offset(entt);
@@ -435,6 +435,24 @@ public:
         packed.pop_back();
     }
 
+    /**
+     * @brief Removes multiple entities from a pool.
+     * @tparam It Type of input iterator.
+     * @param first An iterator to the first element of the range of entities.
+     * @param last An iterator past the last element of the range of entities.
+     */
+    template<typename It>
+    void erase(It first, It last) {
+        if(std::distance(first, last) == packed.size()) {
+            // no validity check, let it be misused
+            clear();
+        } else {
+            for(; first != last; ++first) {
+                erase(*first);
+            }
+        }
+    }
+
     /**
      * @brief Swaps two entities in the internal packed array.
      *
@@ -598,7 +616,7 @@ public:
     /**
      * @brief Clears a sparse set.
      */
-    void clear() ENTT_NOEXCEPT {
+    virtual void clear() ENTT_NOEXCEPT {
         sparse.clear();
         packed.clear();
     }

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

@@ -424,7 +424,7 @@ public:
      *
      * @param entt A valid entity identifier.
      */
-    void erase(const entity_type entt) {
+    void erase(const entity_type entt) override {
         auto other = std::move(instances.back());
         instances[underlying_type::index(entt)] = std::move(other);
         instances.pop_back();
@@ -510,7 +510,7 @@ public:
     }
 
     /*! @brief Clears a storage. */
-    void clear() ENTT_NOEXCEPT {
+    void clear() ENTT_NOEXCEPT override {
         underlying_type::clear();
         instances.clear();
     }