Michele Caini 7 лет назад
Родитель
Сommit
7f1abab9ae
2 измененных файлов с 35 добавлено и 9 удалено
  1. 9 9
      src/entt/entity/view.hpp
  2. 26 0
      test/entt/entity/view.cpp

+ 9 - 9
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<Entity>::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<Entity>::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<pool_type<Component> *>(pools)->extent()... });
-        return ((sz < extent) && ... && (std::get<pool_type<Component> *>(pools)->has(entity) && (std::get<pool_type<Component> *>(pools)->data()[std::get<pool_type<Component> *>(pools)->sparse_set<Entity>::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<Entity>::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<Entity>::get(entity)] == entity);
+        return find(entity) != end();
     }
 
     /**

+ 26 - 0
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<int>(e5);
+    registry.assign<char>(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<int>(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<int>(e5);
+    registry.assign<char>(e5);
+
+    ASSERT_NE(view.find(e5), view.end());
+    ASSERT_EQ(view.find(e4), view.end());
 }
 
 TEST(RuntimeView, Functionalities) {