8template <
typename ... Components>
11template <
typename ... Components>
14template <
typename ... Components>
15struct worker_iterable;
17template <
typename ... Components>
29 template <
typename Func>
30 void each(Func&& func)
const {
32 ECS_BIT_SET(it.
flags, EcsIterIsInstanced);
44 template <
typename Func>
45 void run(Func&& func)
const {
50 template <
typename Func>
53 ECS_BIT_SET(it.
flags, EcsIterIsInstanced);
57 while (!result && next(&it)) {
104 return this->
iter().count();
109 return this->
iter().is_true();
117 iter_iterable<Components...> set_var(
int var_id, flecs::entity_t value) {
118 return this->
iter().set_var(var_id, value);
121 iter_iterable<Components...> set_var(
const char *name, flecs::entity_t value) {
122 return this->
iter().set_var(name, value);
125 iter_iterable<Components...> set_var(
const char *name, flecs::table_t *value) {
126 return this->
iter().set_var(name, value);
129 iter_iterable<Components...> set_var(
const char *name, ecs_table_range_t value) {
130 return this->
iter().set_var(name, value);
134 return this->
iter().set_var(name, value);
138 iter_iterable<Components...> set_group(uint64_t group_id) {
139 return this->
iter().set_group(group_id);
143 template <
typename Group>
144 iter_iterable<Components...> set_group() {
145 return this->
iter().template set_group<Group>();
148 virtual ~iterable() { }
150 friend iter_iterable<Components...>;
151 friend page_iterable<Components...>;
152 friend worker_iterable<Components...>;
154 virtual ecs_iter_t get_iter(flecs::world_t *stage)
const = 0;
159template <
typename ... Components>
161 template <
typename Iterable>
164 it_ = it->get_iter(
world);
165 next_ = it->next_action();
166 next_each_ = it->next_action();
167 ecs_assert(next_ !=
nullptr, ECS_INTERNAL_ERROR, NULL);
168 ecs_assert(next_each_ !=
nullptr, ECS_INTERNAL_ERROR, NULL);
171 iter_iterable<Components...>& set_var(
int var_id, flecs::entity_t value) {
172 ecs_assert(var_id != -1, ECS_INVALID_PARAMETER, 0);
177 iter_iterable<Components...>& set_var(
const char *name, flecs::entity_t value) {
178 ecs_query_iter_t *qit = &it_.
priv_.iter.query;
180 ecs_assert(var_id != -1, ECS_INVALID_PARAMETER, name);
185 iter_iterable<Components...>& set_var(
const char *name, flecs::table_t *value) {
186 ecs_query_iter_t *qit = &it_.
priv_.iter.query;
188 ecs_assert(var_id != -1, ECS_INVALID_PARAMETER, name);
193 iter_iterable<Components...>& set_var(
const char *name, ecs_table_range_t value) {
194 ecs_query_iter_t *qit = &it_.
priv_.iter.query;
196 ecs_assert(var_id != -1, ECS_INVALID_PARAMETER, name);
202 ecs_table_range_t range;
204 range.offset = value.offset();
205 range.count = value.count();
206 return set_var(name, range);
216 while (next_each_(&it_)) {
224 bool result = next_each_(&it_);
234 if (next_each_(&it_) && it_.
count) {
248 template <
typename Group>
278template <
typename ... Components>
284template <
typename ... Components>
290template <
typename ... Components>
296template <
typename ... Components>
298 template <
typename Iterable>
303 chain_it_ = it->get_iter(
nullptr);
325template <
typename ... Components>
333template <
typename ... Components>
339 chain_it_ = it->get_iter(
nullptr);
361template <
typename ... Components>
#define ecs_assert(condition, error_code,...)
Assert.
bool(* ecs_iter_next_action_t)(ecs_iter_t *it)
Function prototype for iterating an iterator.
ecs_iter_t ecs_worker_iter(const ecs_iter_t *it, int32_t index, int32_t count)
Create a worker iterator.
void ecs_iter_fini(ecs_iter_t *it)
Cleanup iterator resources.
ecs_iter_t ecs_page_iter(const ecs_iter_t *it, int32_t offset, int32_t limit)
Create a paged iterator.
void ecs_iter_set_var(ecs_iter_t *it, int32_t var_id, ecs_entity_t entity)
Set value for iterator variable.
bool ecs_worker_next(ecs_iter_t *it)
Progress a worker iterator.
void ecs_iter_set_var_as_table(ecs_iter_t *it, int32_t var_id, const ecs_table_t *table)
Same as ecs_iter_set_var(), but for a table.
bool ecs_page_next(ecs_iter_t *it)
Progress a paged iterator.
void ecs_iter_set_var_as_range(ecs_iter_t *it, int32_t var_id, const ecs_table_range_t *range)
Same as ecs_iter_set_var(), but for a range of entities This constrains the variable to a range of en...
void ecs_iter_set_group(ecs_iter_t *it, uint64_t group_id)
Set group to iterate for query iterator.
int32_t ecs_query_find_var(const ecs_query_t *query, const char *name)
Find variable index.
ecs_world_t * real_world
Actual world.
ecs_flags32_t flags
Iterator flags.
ecs_iter_private_t priv_
Private data.
ecs_world_t * world
The world.
ecs_entity_t * entities
Entity identifiers.
int32_t count
Number of entities to iterate.
flecs::entity first() const
Get first element from a pair.
Class for iterating over query results.
bool is_true() const
Return whether iterable has any matches.
void run(Func &&func) const
Run iterator.
flecs::entity first() const
Return first entity matched by iterable.
void each(Func &&func) const
Each iterator.
int32_t count() const
Return number of entities matched by iterable.
iter_iterable< Components... > iter(flecs::entity e) const
Create iterator.
page_iterable< Components... > page(int32_t offset, int32_t limit)
Page iterator.
iter_iterable< Components... > iter(flecs::iter &iter) const
Create iterator.
worker_iterable< Components... > worker(int32_t index, int32_t count)
Worker iterator.
iter_iterable< Components... > iter(flecs::world_t *world=nullptr) const
Create iterator.
table_t * get_table() const
Get table.