1 #ifndef ENTT_ENTITY_RUNTIME_VIEW_HPP
2 #define ENTT_ENTITY_RUNTIME_VIEW_HPP
10 #include "../config/config.h"
11 #include "sparse_set.hpp"
57 template<
typename Entity>
58 class basic_runtime_view {
67 using direct_type = std::vector<const sparse_set<Entity> *>;
69 iterator(
const direct_type *all, underlying_iterator_type curr) ENTT_NOEXCEPT
73 if(it != (*pools)[0]->
end() && !valid()) {
79 return std::all_of(pools->begin()++, pools->end(), [
entt = *it](
const auto *curr) {
80 return curr->has(
entt);
85 using difference_type =
typename underlying_iterator_type::difference_type;
86 using value_type =
typename underlying_iterator_type::value_type;
87 using pointer =
typename underlying_iterator_type::pointer;
88 using reference =
typename underlying_iterator_type::reference;
89 using iterator_category = std::bidirectional_iterator_tag;
91 iterator() ENTT_NOEXCEPT = default;
93 iterator & operator++() {
94 while(++it != (*pools)[0]->
end() && !valid());
98 iterator operator++(
int) {
99 iterator orig = *
this;
100 return operator++(), orig;
103 iterator & operator--() ENTT_NOEXCEPT {
104 while(--it != (*pools)[0]->
begin() && !valid());
108 iterator operator--(
int) ENTT_NOEXCEPT {
109 iterator orig = *
this;
110 return operator--(), orig;
113 bool operator==(
const iterator &other)
const ENTT_NOEXCEPT {
114 return other.it == it;
117 bool operator!=(
const iterator &other)
const ENTT_NOEXCEPT {
118 return !(*
this == other);
121 pointer operator->()
const {
122 return it.operator->();
125 reference operator*()
const {
126 return *operator->();
130 const direct_type *pools;
131 underlying_iterator_type it;
134 basic_runtime_view(std::vector<
const sparse_set<Entity> *> others) ENTT_NOEXCEPT
135 : pools{std::move(others)}
137 const auto it = std::min_element(pools.begin(), pools.end(), [](
const auto *lhs,
const auto *rhs) {
138 return (!lhs && rhs) || (lhs && rhs && lhs->size() < rhs->size());
142 std::rotate(pools.begin(), it, pools.end());
146 return !pools.empty() && pools.front();
162 return valid() ? pools.front()->size() :
size_type{};
170 return !valid() || pools.front()->empty();
191 it = { &pools, pools[0]->begin() };
216 it = { &pools, pools[0]->end() };
228 return valid() && std::all_of(pools.cbegin(), pools.cend(), [
entt](
const auto *
view) {
248 template<
typename Func>
250 for(
const auto entity: *
this) {
256 std::vector<const sparse_set<Entity> *> pools;