view: index-based view iterator (no check set required)

This commit is contained in:
Michele Caini
2023-12-15 08:54:18 +01:00
parent 09197a91a0
commit 2e264dffb3

View File

@@ -53,7 +53,9 @@ class view_iterator final {
using iterator_type = typename Type::const_iterator;
[[nodiscard]] bool valid(const typename iterator_type::value_type entt) const noexcept {
return ((Get != 0u) || (entt != tombstone)) && (all_of(pools.data(), Get, entt)) && none_of(filter.data(), Exclude, entt);
return ((Get != 1u) || (entt != tombstone))
&& all_of(pools.data(), index, entt) && all_of(pools.data() + index + 1u, Get - index - 1u, entt)
&& none_of(filter.data(), Exclude, entt);
}
public:
@@ -67,13 +69,15 @@ public:
: it{},
last{},
pools{},
filter{} {}
filter{},
index{} {}
view_iterator(iterator_type curr, iterator_type to, std::array<const Type *, Get> value, std::array<const Type *, Exclude> excl) noexcept
view_iterator(iterator_type curr, iterator_type to, std::array<const Type *, Get> value, std::array<const Type *, Exclude> excl, const std::size_t idx) noexcept
: it{curr},
last{to},
pools{value},
filter{excl} {
filter{excl},
index{idx} {
while(it != last && !valid(*it)) {
++it;
}
@@ -105,6 +109,7 @@ private:
iterator_type last;
std::array<const Type *, Get> pools;
std::array<const Type *, Exclude> filter;
std::size_t index;
};
template<typename LhsType, auto... LhsArgs, typename RhsType, auto... RhsArgs>
@@ -268,7 +273,7 @@ public:
/*! @brief Unsigned integer type. */
using size_type = std::size_t;
/*! @brief Bidirectional iterator type. */
using iterator = internal::view_iterator<common_type, Get - 1u, Exclude>;
using iterator = internal::view_iterator<common_type, Get, Exclude>;
/*! @brief Updates the internal leading view if required. */
void refresh() noexcept {
@@ -304,7 +309,7 @@ public:
* @return An iterator to the first entity of the view.
*/
[[nodiscard]] iterator begin() const noexcept {
return leading ? iterator{leading->begin(0), leading->end(0), check, filter} : iterator{};
return leading ? iterator{leading->begin(0), leading->end(0), pools, filter, index} : iterator{};
}
/**
@@ -312,7 +317,7 @@ public:
* @return An iterator to the entity following the last entity of the view.
*/
[[nodiscard]] iterator end() const noexcept {
return leading ? iterator{leading->end(0), leading->end(0), check, filter} : iterator{};
return leading ? iterator{leading->end(0), leading->end(0), pools, filter, index} : iterator{};
}
/**
@@ -348,7 +353,7 @@ public:
* iterator otherwise.
*/
[[nodiscard]] iterator find(const entity_type entt) const noexcept {
return contains(entt) ? iterator{leading->find(entt), leading->end(), check, filter} : end();
return contains(entt) ? iterator{leading->find(entt), leading->end(), pools, filter, index} : end();
}
/**