Browse Source

view: begin/end return scoped iterators as needed

Michele Caini 2 years ago
parent
commit
8fdc24097e
3 changed files with 12 additions and 29 deletions
  1. 3 8
      src/entt/entity/view.hpp
  2. 3 7
      test/entt/entity/registry.cpp
  3. 6 14
      test/entt/entity/view.cpp

+ 3 - 8
src/entt/entity/view.hpp

@@ -404,7 +404,7 @@ public:
      * @return An iterator to the first entity of the view.
      */
     [[nodiscard]] iterator begin() const noexcept {
-        return view ? iterator{view->begin(), view->end(), opaque_check_set(), filter} : iterator{};
+        return view ? iterator{view->begin(0), view->end(0), opaque_check_set(), filter} : iterator{};
     }
 
     /**
@@ -412,7 +412,7 @@ public:
      * @return An iterator to the entity following the last entity of the view.
      */
     [[nodiscard]] iterator end() const noexcept {
-        return view ? iterator{view->end(), view->end(), opaque_check_set(), filter} : iterator{};
+        return view ? iterator{view->end(0), view->end(0), opaque_check_set(), filter} : iterator{};
     }
 
     /**
@@ -535,12 +535,7 @@ public:
      * @return An iterable object to use to _visit_ the view.
      */
     [[nodiscard]] iterable each() const noexcept {
-        if(view) {
-            const auto check = opaque_check_set();
-            return iterable{internal::extended_view_iterator{iterator{view->begin(0), view->end(0), check, filter}, pools}, internal::extended_view_iterator{iterator{view->end(0), view->end(0), check, filter}, pools}};
-        }
-
-        return iterable{};
+        return {internal::extended_view_iterator{begin(), pools}, internal::extended_view_iterator{end(), pools}};
     }
 
     /**

+ 3 - 7
test/entt/entity/registry.cpp

@@ -907,22 +907,18 @@ TEST(Registry, ExcludeOnlyView) {
     registry.emplace<int>(entity[2u], 0);
     registry.emplace<int>(entity[3u], 0);
 
-    registry.destroy(entity[3u], entt::to_version(entity[3u]));
+    registry.destroy(entity[3u]);
 
     ASSERT_EQ(view.size_hint(), 4u);
     ASSERT_NE(view.begin(), view.end());
 
-    // returns all matching identifiers, both in-use and available ones
-    ASSERT_EQ(std::distance(view.begin(), view.end()), 2);
-    ASSERT_EQ(*view.begin(), entity[3u]);
-    ASSERT_EQ(*(++view.begin()), entity[1u]);
+    ASSERT_EQ(std::distance(view.begin(), view.end()), 1);
+    ASSERT_EQ(*view.begin(), entity[1u]);
 
-    // skips available identifiers automatically, only returns in-use elements
     for(auto [entt]: view.each()) {
         ASSERT_EQ(entt, entity[1u]);
     }
 
-    // skips available identifiers automatically, only returns in-use elements
     view.each([&entity](auto entt) {
         ASSERT_EQ(entt, entity[1u]);
     });

+ 6 - 14
test/entt/entity/view.cpp

@@ -578,22 +578,18 @@ TEST(SingleComponentView, StorageEntity) {
     const auto entity = registry.create();
     const auto other = registry.create();
 
-    registry.destroy(entity, entt::to_version(entity));
+    registry.destroy(entity);
 
     ASSERT_EQ(view.size_hint(), 2u);
     ASSERT_NE(view.begin(), view.end());
 
-    // returns all matching identifiers, both in-use and available ones
-    ASSERT_EQ(std::distance(view.begin(), view.end()), 2);
-    ASSERT_EQ(*view.begin(), entity);
-    ASSERT_EQ(*(++view.begin()), other);
+    ASSERT_EQ(std::distance(view.begin(), view.end()), 1);
+    ASSERT_EQ(*view.begin(), other);
 
-    // skips available identifiers automatically, only returns in-use elements
     for(auto elem: view.each()) {
         ASSERT_EQ(std::get<0>(elem), other);
     }
 
-    // skips available identifiers automatically, only returns in-use elements
     view.each([other](auto entt) {
         ASSERT_EQ(entt, other);
     });
@@ -1604,22 +1600,18 @@ TEST(MultiComponentView, StorageEntityExcludeOnly) {
 
     registry.emplace<int>(excluded);
 
-    registry.destroy(entity, entt::to_version(entity));
+    registry.destroy(entity);
 
     ASSERT_EQ(view.size_hint(), 3u);
     ASSERT_NE(view.begin(), view.end());
 
-    // returns all matching identifiers, both in-use and available ones
-    ASSERT_EQ(std::distance(view.begin(), view.end()), 2);
-    ASSERT_EQ(*view.begin(), entity);
-    ASSERT_EQ(*(++view.begin()), other);
+    ASSERT_EQ(std::distance(view.begin(), view.end()), 1);
+    ASSERT_EQ(*view.begin(), other);
 
-    // skips available identifiers automatically, only returns in-use elements
     for(auto [entt]: view.each()) {
         ASSERT_EQ(entt, other);
     }
 
-    // skips available identifiers automatically, only returns in-use elements
     view.each([other](auto entt) {
         ASSERT_EQ(entt, other);
     });