diff --git a/src/entt/entity/registry.hpp b/src/entt/entity/registry.hpp index 3f70a3359..6a254bfc5 100644 --- a/src/entt/entity/registry.hpp +++ b/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); diff --git a/test/entt/entity/registry.cpp b/test/entt/entity/registry.cpp index 8715975c2..d4009ed33 100644 --- a/test/entt/entity/registry.cpp +++ b/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().connect<&entt::registry::remove>(); + registry.emplace(entity); + registry.emplace(entity); + + ASSERT_NE(registry.storage(entt::type_id().hash()), registry.storage().end()); + ASSERT_NE(registry.storage(entt::type_id().hash()), registry.storage().end()); + ASSERT_EQ(registry.storage(entt::type_id().hash()), registry.storage().end()); + ASSERT_TRUE(registry.valid(entity)); + + registry.destroy(entity); + + ASSERT_NE(registry.storage(entt::type_id().hash()), registry.storage().end()); + ASSERT_FALSE(registry.valid(entity)); +} + TEST(Registry, Insert) { entt::registry registry; entt::entity entities[3u];