소스 검색

storage: refine ::release_memory

Michele Caini 4 년 전
부모
커밋
d7b0fc09d7
2개의 변경된 파일8개의 추가작업 그리고 3개의 파일을 삭제
  1. 0 1
      TODO
  2. 8 2
      src/entt/entity/storage.hpp

+ 0 - 1
TODO

@@ -10,7 +10,6 @@ WIP:
 * make pools available (registry/view/group), review operator| for views, make views accept registry to ctor
 * make view.lead() or similar available to return leading pool (useful for mt)
 * dedicated entity storage, in-place O(1) release/destroy for non-orphaned entities, out-of-sync model
-* review storage::release_memory (we can't really call ::clear now that it honors the mode)
 * custom allocators all over
 
 WIP:

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

@@ -257,8 +257,14 @@ class basic_storage: public basic_sparse_set<Entity, typename std::allocator_tra
 
     void release_memory() {
         if(packed) {
-            // no-throw stable erase iteration
-            base_type::clear();
+            if constexpr(comp_traits::in_place_delete::value) {
+                // no-throw stable erase iteration
+                base_type::clear();
+            } else {
+                for(size_type pos{}, last = base_type::size(); pos < last; ++pos) {
+                    destroy(element_at(pos));
+                }
+            }
 
             auto &allocator = bucket.first();
             auto &len = bucket.second();