view: begin/end return scoped iterators as needed
This commit is contained in:
@@ -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}};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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]);
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user