diff --git a/src/entt/entity/mixin.hpp b/src/entt/entity/mixin.hpp index 2f95d392c..91a0dbc89 100644 --- a/src/entt/entity/mixin.hpp +++ b/src/entt/entity/mixin.hpp @@ -51,13 +51,13 @@ class sigh_mixin final: public Type { void pop_all() final { if(auto ® = owner_or_assert(); !destruction.empty()) { - for(auto pos = underlying_type::each().begin().base().index(); !(pos < 0); --pos) { - if constexpr(underlying_type::traits_type::in_place_delete) { - if(const auto entt = underlying_type::operator[](static_cast(pos)); entt != tombstone) { + for(auto it = underlying_type::base_type::begin(0), last = underlying_type::base_type::end(0); it != last; ++it) { + if constexpr(std::is_same_v) { + destruction.publish(reg, *it); + } else { + if(const auto entt = *it; !underlying_type::traits_type::in_place_delete || entt != tombstone) { destruction.publish(reg, entt); } - } else { - destruction.publish(reg, underlying_type::operator[](static_cast(pos))); } } } diff --git a/test/entt/entity/sigh_mixin.cpp b/test/entt/entity/sigh_mixin.cpp index ef7fadaaf..047f075dd 100644 --- a/test/entt/entity/sigh_mixin.cpp +++ b/test/entt/entity/sigh_mixin.cpp @@ -33,15 +33,6 @@ void listener(counter &counter, Registry &, typename Registry::entity_type) { struct empty_each_tag final {}; -template<> -struct entt::basic_storage>: entt::basic_storage> { - basic_storage(const std::allocator &) {} - - [[nodiscard]] iterable each() noexcept { - return {internal::extended_storage_iterator{base_type::end()}, internal::extended_storage_iterator{base_type::end()}}; - } -}; - TEST(SighMixin, GenericType) { entt::entity entity[2u]{entt::entity{3}, entt::entity{42}}; entt::sigh_mixin> pool; @@ -434,35 +425,6 @@ TEST(SighMixin, Swap) { ASSERT_EQ(on_destroy.value, 3); } -TEST(SighMixin, EmptyEachStorage) { - entt::sigh_mixin> pool; - entt::registry registry; - - counter on_destroy{}; - - pool.bind(entt::forward_as_any(registry)); - pool.on_destroy().connect<&listener>(on_destroy); - - ASSERT_TRUE(pool.empty()); - ASSERT_EQ(on_destroy.value, 0); - - pool.push(entt::entity{42}); - - ASSERT_FALSE(pool.empty()); - ASSERT_EQ(on_destroy.value, 0); - - ASSERT_NE(pool.begin(), pool.end()); - ASSERT_EQ(pool.each().begin(), pool.each().end()); - ASSERT_EQ(on_destroy.value, 0); - - pool.clear(); - - ASSERT_EQ(pool.begin(), pool.end()); - ASSERT_EQ(pool.each().begin(), pool.each().end()); - // no signal at all because of the (fake) empty iterable - ASSERT_EQ(on_destroy.value, 0); -} - TEST(SighMixin, StorageEntity) { using traits_type = entt::entt_traits;