diff --git a/src/entt/entity/view.hpp b/src/entt/entity/view.hpp index bb54e6c39..904d27c4f 100644 --- a/src/entt/entity/view.hpp +++ b/src/entt/entity/view.hpp @@ -26,9 +26,11 @@ template return std::make_tuple(static_cast(const_cast *>(std::get(filter)))...); } -template -[[nodiscard]] auto none_of(const std::array &filter, const typename Type::entity_type entt, std::index_sequence) noexcept { - return (!(filter[Index] && filter[Index]->contains(entt)) && ...); +template +[[nodiscard]] auto none_of(const std::array &filter, const typename Type::entity_type entt) noexcept { + std::size_t pos{}; + for(; pos < N && !(filter[pos] && filter[pos]->contains(entt)); ++pos) {} + return pos == N; } template @@ -53,7 +55,7 @@ class view_iterator final { [[nodiscard]] bool valid(const typename iterator_type::value_type entt) const noexcept { return ((Get != 0u) || (entt != tombstone)) && std::apply([entt](const auto *...curr) { return (curr->contains(entt) && ...); }, pools) - && none_of(filter, entt, std::make_index_sequence{}); + && none_of(filter, entt); } public: @@ -247,7 +249,7 @@ class basic_view, exclude_t> { template void each(Func &func, std::index_sequence) const { for(const auto curr: std::get(pools)->each()) { - if(const auto entt = std::get<0>(curr); ((sizeof...(Get) != 1u) || (entt != tombstone)) && ((Curr == Index || std::get(pools)->contains(entt)) && ...) && internal::none_of(filter, entt, std::index_sequence_for{})) { + if(const auto entt = std::get<0>(curr); ((sizeof...(Get) != 1u) || (entt != tombstone)) && ((Curr == Index || std::get(pools)->contains(entt)) && ...) && internal::none_of(filter, entt)) { if constexpr(is_applicable_v{}, std::declval().get({})))>) { std::apply(func, std::tuple_cat(std::make_tuple(entt), dispatch_get(curr)...)); } else { @@ -470,7 +472,7 @@ public: * @return True if the view contains the given entity, false otherwise. */ [[nodiscard]] bool contains(const entity_type entt) const noexcept { - return view && std::apply([entt](const auto *...curr) { return (curr->contains(entt) && ...); }, pools) && internal::none_of(filter, entt, std::index_sequence_for{}); + return view && std::apply([entt](const auto *...curr) { return (curr->contains(entt) && ...); }, pools) && internal::none_of(filter, entt); } /**