view: begin/end return scoped iterators as needed

This commit is contained in:
Michele Caini
2023-09-26 08:45:52 +02:00
parent 4e7368f79a
commit 8fdc24097e
3 changed files with 12 additions and 29 deletions

View File

@@ -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}};
}
/**

View File

@@ -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]);
});

View File

@@ -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);
});