From 7f1abab9ae9dc02e7cf895ffdbca08405a6a4729 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Tue, 29 Jan 2019 09:00:34 +0100 Subject: [PATCH] bug fixing (find on views) --- src/entt/entity/view.hpp | 18 +++++++++--------- test/entt/entity/view.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/entt/entity/view.hpp b/src/entt/entity/view.hpp index 4b86e2a7b..08f8f7ef9 100644 --- a/src/entt/entity/view.hpp +++ b/src/entt/entity/view.hpp @@ -208,7 +208,8 @@ public: * iterator otherwise. */ iterator_type find(const entity_type entity) const ENTT_NOEXCEPT { - return handler->find(entity); + const auto it = handler->find(entity); + return it != end() && *it == entity ? it : end(); } /** @@ -217,7 +218,7 @@ public: * @return The identifier that occupies the given position. */ entity_type operator[](const size_type pos) const ENTT_NOEXCEPT { - return handler->sparse_set::begin()[pos]; + return begin()[pos]; } /** @@ -226,7 +227,7 @@ public: * @return True if the view contains the given entity, false otherwise. */ bool contains(const entity_type entity) const ENTT_NOEXCEPT { - return handler->has(entity) && (handler->data()[handler->sparse_set::get(entity)] == entity); + return find(entity) != end(); } /** @@ -595,9 +596,7 @@ public: * @return True if the view contains the given entity, false otherwise. */ bool contains(const entity_type entity) const ENTT_NOEXCEPT { - const auto sz = size_type(entity & traits_type::entity_mask); - const auto extent = std::min({ std::get *>(pools)->extent()... }); - return ((sz < extent) && ... && (std::get *>(pools)->has(entity) && (std::get *>(pools)->data()[std::get *>(pools)->sparse_set::get(entity)] == entity))); + return find(entity) != end(); } /** @@ -823,7 +822,8 @@ public: * iterator otherwise. */ iterator_type find(const entity_type entity) const ENTT_NOEXCEPT { - return pool->find(entity); + const auto it = pool->find(entity); + return it != end() && *it == entity ? it : end(); } /** @@ -832,7 +832,7 @@ public: * @return The identifier that occupies the given position. */ entity_type operator[](const size_type pos) const ENTT_NOEXCEPT { - return pool->sparse_set::begin()[pos]; + return begin()[pos]; } /** @@ -841,7 +841,7 @@ public: * @return True if the view contains the given entity, false otherwise. */ bool contains(const entity_type entity) const ENTT_NOEXCEPT { - return pool->has(entity) && (pool->data()[pool->sparse_set::get(entity)] == entity); + return find(entity) != end(); } /** diff --git a/test/entt/entity/view.cpp b/test/entt/entity/view.cpp index dff6d7da1..bcd21372d 100644 --- a/test/entt/entity/view.cpp +++ b/test/entt/entity/view.cpp @@ -252,6 +252,15 @@ TEST(PersistentView, Find) { ASSERT_EQ(*(++it), e0); ASSERT_EQ(++it, view.end()); ASSERT_EQ(++view.find(e0), view.end()); + + const auto e4 = registry.create(); + registry.destroy(e4); + const auto e5 = registry.create(); + registry.assign(e5); + registry.assign(e5); + + ASSERT_NE(view.find(e5), view.end()); + ASSERT_EQ(view.find(e4), view.end()); } TEST(PersistentView, SingleComponent) { @@ -518,6 +527,14 @@ TEST(SingleComponentView, Find) { ASSERT_EQ(*(++it), e0); ASSERT_EQ(++it, view.end()); ASSERT_EQ(++view.find(e0), view.end()); + + const auto e4 = registry.create(); + registry.destroy(e4); + const auto e5 = registry.create(); + registry.assign(e5); + + ASSERT_NE(view.find(e5), view.end()); + ASSERT_EQ(view.find(e4), view.end()); } TEST(MultipleComponentView, Functionalities) { @@ -722,6 +739,15 @@ TEST(MultipleComponentView, Find) { ASSERT_EQ(*(++it), e0); ASSERT_EQ(++it, view.end()); ASSERT_EQ(++view.find(e0), view.end()); + + const auto e4 = registry.create(); + registry.destroy(e4); + const auto e5 = registry.create(); + registry.assign(e5); + registry.assign(e5); + + ASSERT_NE(view.find(e5), view.end()); + ASSERT_EQ(view.find(e4), view.end()); } TEST(RuntimeView, Functionalities) {