1 #ifndef ENTT_ENTITY_RUNTIME_VIEW_HPP
2 #define ENTT_ENTITY_RUNTIME_VIEW_HPP
10 #include "../config/config.h"
11 #include "sparse_set.hpp"
56 template<
typename Entity>
63 class view_iterator final {
71 if(it != (*pools)[0]->
end() && !valid()) {
76 [[nodiscard]]
bool valid()
const {
77 return std::all_of(pools->begin()++, pools->end(), [
entt = *it](
const auto *curr) { return curr->contains(entt); })
78 && std::none_of(filter->cbegin(), filter->cend(), [
entt = *it](
const auto *curr) { return curr && curr->contains(entt); });
82 using difference_type =
typename underlying_iterator::difference_type;
83 using value_type =
typename underlying_iterator::value_type;
84 using pointer =
typename underlying_iterator::pointer;
85 using reference =
typename underlying_iterator::reference;
86 using iterator_category = std::bidirectional_iterator_tag;
88 view_iterator() ENTT_NOEXCEPT =
default;
90 view_iterator & operator++() {
91 while(++it != (*pools)[0]->
end() && !valid());
95 view_iterator operator++(
int) {
96 view_iterator orig = *
this;
97 return ++(*this), orig;
100 view_iterator & operator--() ENTT_NOEXCEPT {
101 while(--it != (*pools)[0]->
begin() && !valid());
105 view_iterator operator--(
int) ENTT_NOEXCEPT {
106 view_iterator orig = *
this;
107 return operator--(), orig;
110 [[nodiscard]]
bool operator==(
const view_iterator &other)
const ENTT_NOEXCEPT {
111 return other.it == it;
114 [[nodiscard]]
bool operator!=(
const view_iterator &other)
const ENTT_NOEXCEPT {
115 return !(*
this == other);
118 [[nodiscard]] pointer operator->()
const {
119 return it.operator->();
122 [[nodiscard]] reference operator*()
const {
123 return *operator->();
127 const std::vector<const sparse_set<Entity> *> *pools;
128 const std::vector<const sparse_set<Entity> *> *filter;
129 underlying_iterator it;
133 : pools{std::move(cpools)},
134 filter{std::move(epools)}
136 const auto it = std::min_element(pools.begin(), pools.end(), [](
const auto *lhs,
const auto *rhs) {
137 return (!lhs && rhs) || (lhs && rhs && lhs->size() < rhs->size());
141 std::rotate(pools.begin(), it, pools.end());
144 [[nodiscard]]
bool valid()
const {
145 return !pools.empty() && pools.front();
161 return valid() ? pools.front()->size() :
size_type{};
169 return !valid() || pools.front()->empty();
215 return valid() && std::all_of(pools.cbegin(), pools.cend(), [
entt](
const auto *curr) { return curr->contains(entt); })
216 && std::none_of(filter.cbegin(), filter.cend(), [
entt](
const auto *curr) { return curr && curr->contains(entt); });
234 template<
typename Func>
236 for(
const auto entity: *
this) {
242 std::vector<const sparse_set<Entity> *> pools;
243 std::vector<const sparse_set<Entity> *> filter;