Jelajahi Sumber

registry: allow creating pools during a destroy (close #853)

Michele Caini 4 tahun lalu
induk
melakukan
a431f5a674
2 mengubah file dengan 21 tambahan dan 2 penghapusan
  1. 2 2
      src/entt/entity/registry.hpp
  2. 19 0
      test/entt/entity/registry.cpp

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

@@ -701,8 +701,8 @@ public:
     version_type destroy(const entity_type entity, const version_type version) {
         ENTT_ASSERT(valid(entity), "Invalid entity");
 
-        for(auto &&curr: pools) {
-            curr.second->remove(entity);
+        for(size_type pos = pools.size(); pos; --pos) {
+            pools.begin()[pos - 1u].second->remove(entity);
         }
 
         return release_entity(entity, version);

+ 19 - 0
test/entt/entity/registry.cpp

@@ -1395,6 +1395,25 @@ TEST(Registry, Signals) {
     ASSERT_EQ(listener.last, entities[0u]);
 }
 
+TEST(Registry, SignalWhenDestroying) {
+    entt::registry registry;
+    const auto entity = registry.create();
+
+    registry.on_destroy<double>().connect<&entt::registry::remove<char>>();
+    registry.emplace<double>(entity);
+    registry.emplace<int>(entity);
+
+    ASSERT_NE(registry.storage(entt::type_id<double>().hash()), registry.storage().end());
+    ASSERT_NE(registry.storage(entt::type_id<int>().hash()), registry.storage().end());
+    ASSERT_EQ(registry.storage(entt::type_id<char>().hash()), registry.storage().end());
+    ASSERT_TRUE(registry.valid(entity));
+
+    registry.destroy(entity);
+
+    ASSERT_NE(registry.storage(entt::type_id<char>().hash()), registry.storage().end());
+    ASSERT_FALSE(registry.valid(entity));
+}
+
 TEST(Registry, Insert) {
     entt::registry registry;
     entt::entity entities[3u];