From be936438084ee1533c808e2c17eec34b3d769ac4 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Sun, 14 Jun 2020 23:42:15 +0200 Subject: [PATCH] view: non-const excluded types are always accepted (close #507) --- src/entt/entity/view.hpp | 19 +++++++++---------- test/entt/entity/view.cpp | 8 ++++---- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/entt/entity/view.hpp b/src/entt/entity/view.hpp index 2f2674f9a..f475d3db4 100644 --- a/src/entt/entity/view.hpp +++ b/src/entt/entity/view.hpp @@ -158,8 +158,9 @@ class basic_view, Component...> { underlying_iterator it; }; - basic_view(pool_type &... component, pool_type &... epool) ENTT_NOEXCEPT - : pools{&component..., &epool...} + basic_view(pool_type &... component, unpack_as_t, Exclude> &... epool) ENTT_NOEXCEPT + : pools{&component...}, + filter{&epool...} {} [[nodiscard]] const sparse_set & candidate() const ENTT_NOEXCEPT { @@ -315,8 +316,7 @@ public: */ [[nodiscard]] iterator begin() const { const auto &view = candidate(); - const filter_type ignore{std::get *>(pools)...}; - return iterator{view, unchecked(view), ignore, view.begin()}; + return iterator{view, unchecked(view), filter, view.begin()}; } /** @@ -336,8 +336,7 @@ public: */ [[nodiscard]] iterator end() const { const auto &view = candidate(); - const filter_type ignore{std::get *>(pools)...}; - return iterator{view, unchecked(view), ignore, view.end()}; + return iterator{view, unchecked(view), filter, view.end()}; } /** @@ -368,8 +367,7 @@ public: */ [[nodiscard]] iterator find(const entity_type entt) const { const auto &view = candidate(); - const filter_type ignore{std::get *>(pools)...}; - iterator it{view, unchecked(view), ignore, view.find(entt)}; + iterator it{view, unchecked(view), filter, view.find(entt)}; return (it != end() && *it == entt) ? it : end(); } @@ -380,7 +378,7 @@ public: */ [[nodiscard]] bool contains(const entity_type entt) const { return (std::get *>(pools)->contains(entt) && ...) - && (!std::get *>(pools)->contains(entt) && ...); + && std::none_of(filter.begin(), filter.end(), [entt](const auto *cpool) { return cpool->contains(entt); }); } /** @@ -465,7 +463,8 @@ public: } private: - const std::tuple *..., pool_type *...> pools; + const std::tuple *...> pools; + filter_type filter; }; diff --git a/test/entt/entity/view.cpp b/test/entt/entity/view.cpp index d0aaabf38..7271af0c4 100644 --- a/test/entt/entity/view.cpp +++ b/test/entt/entity/view.cpp @@ -510,8 +510,6 @@ TEST(MultiComponentView, ExcludedComponents) { registry.emplace(e1, 1); registry.emplace(e1); - const auto view = registry.view(entt::exclude); - const auto e2 = registry.create(); registry.emplace(e2, 2); @@ -519,11 +517,13 @@ TEST(MultiComponentView, ExcludedComponents) { registry.emplace(e3, 3); registry.emplace(e3); + const auto view = std::as_const(registry).view(entt::exclude); + for(const auto entity: view) { ASSERT_TRUE(entity == e0 || entity == e2); if(entity == e0) { - ASSERT_EQ(view.get(e0), 0); + ASSERT_EQ(view.get(e0), 0); } else if(entity == e2) { ASSERT_EQ(view.get(e2), 2); } @@ -540,7 +540,7 @@ TEST(MultiComponentView, ExcludedComponents) { if(entity == e1) { ASSERT_EQ(view.get(e1), 1); } else if(entity == e3) { - ASSERT_EQ(view.get(e3), 3); + ASSERT_EQ(view.get(e3), 3); } } }