diff --git a/src/entt/entity/view.hpp b/src/entt/entity/view.hpp index 6a6a4c318..1f212fb47 100644 --- a/src/entt/entity/view.hpp +++ b/src/entt/entity/view.hpp @@ -61,10 +61,16 @@ class view_iterator final { using iterator_type = typename Type::const_iterator; using iterator_traits = std::iterator_traits; + static constexpr bool storage_view_iterator = (Get == 1u && Exclude == 0u); + [[nodiscard]] bool valid(const typename iterator_traits::value_type entt) const noexcept { - return ((Get != 1u) || (entt != tombstone)) - && internal::all_of(pools.begin(), pools.begin() + index, entt) && internal::all_of(pools.begin() + index + 1, pools.end(), entt) - && internal::none_of(filter.begin(), filter.end(), entt); + if constexpr(storage_view_iterator) { + return (entt != tombstone); + } else { + return ((Get != 1u) || (entt != tombstone)) + && internal::all_of(pools.begin(), pools.begin() + index, entt) && internal::all_of(pools.begin() + index + 1, pools.end(), entt) + && internal::none_of(filter.begin(), filter.end(), entt); + } } void seek_next() { @@ -89,6 +95,10 @@ public: pools{value}, filter{excl}, index{idx} { + if constexpr(storage_view_iterator) { + ENTT_ASSERT((pools[0u] == nullptr) || pools[0u]->policy() == deletion_policy::in_place, "Non in-place storage view iterator"); + } + seek_next(); }