17 , m_filter_ptr(
nullptr) { }
26 , m_filter_ptr(&m_filter) {
43 m_filter_ptr = &m_filter;
47 this->m_world = obj.m_world;
48 if (obj.m_filter_ptr) {
49 this->m_filter_ptr = &this->m_filter;
51 this->m_filter_ptr =
nullptr;
57 this->m_world = obj.m_world;
58 if (obj.m_filter_ptr) {
59 this->m_filter_ptr = &this->m_filter;
61 this->m_filter_ptr =
nullptr;
68 this->m_world = obj.m_world;
69 if (obj.m_filter_ptr) {
70 this->m_filter_ptr = &this->m_filter;
72 this->m_filter_ptr =
nullptr;
78 this->m_world = obj.m_world;
79 if (obj.m_filter_ptr) {
80 this->m_filter_ptr = &this->m_filter;
82 this->m_filter_ptr =
nullptr;
99 if ((&m_filter == m_filter_ptr) && m_filter_ptr) {
104 template <
typename Func>
105 void each_term(
const Func& func) {
106 for (
int i = 0; i < m_filter_ptr->
term_count; i ++) {
116 int32_t field_count() {
125 operator filter<>()
const;
128 world_t *m_world =
nullptr;
130 const filter_t *m_filter_ptr;
133template<
typename ... Components>
136 using Terms =
typename _::term_ptrs<Components...>::array;
139 using filter_base::filter_base;
146 filter_base::operator=(obj);
153 filter_base::operator=(FLECS_FWD(obj));
158 ecs_iter_t get_iter(flecs::world_t *
world)
const override {
175template <
typename... Comps,
typename... Args>
181template <
typename... Comps,
typename... Args>
190template<
typename Func,
typename ... Args>
191struct filter_invoker_w_ent;
193template<
typename Func,
typename E,
typename ... Args>
194struct filter_invoker_w_ent<Func, arg_list<E, Args ...> >
196 filter_invoker_w_ent(
const flecs::world& world, Func&& func) {
197 auto f = world.
filter<Args ...>();
198 f.each(FLECS_MOV(func));
203template<
typename Func,
typename ... Args>
204struct filter_invoker_no_ent;
206template<
typename Func,
typename ... Args>
207struct filter_invoker_no_ent<Func, arg_list<Args ...> >
209 filter_invoker_no_ent(
const flecs::world& world, Func&& func) {
210 auto f = world.
filter<Args ...>();
211 f.each(FLECS_MOV(func));
216template<
typename Func,
typename T =
int>
217struct filter_invoker;
219template <
typename Func>
220struct filter_invoker<Func, if_t<is_same<first_arg_t<Func>, flecs::entity>::value> > {
221 filter_invoker(
const flecs::world& world, Func&& func) {
222 filter_invoker_w_ent<Func, arg_list_t<Func>>(world, FLECS_MOV(func));
226template <
typename Func>
227struct filter_invoker<Func, if_not_t<is_same<first_arg_t<Func>, flecs::entity>::value> > {
228 filter_invoker(
const flecs::world& world, Func&& func) {
229 filter_invoker_no_ent<Func, arg_list_t<Func>>(world, FLECS_MOV(func));
235template <
typename Func>
236inline void world::each(Func&& func)
const {
237 _::filter_invoker<Func> f_invoker(*
this, FLECS_MOV(func));
240template <
typename T,
typename Func>
241inline void world::each(Func&& func)
const {
243 t.
id = _::cpp_type<T>::id();
247 _::each_invoker<Func, T>(func).invoke(&it);
251template <
typename Func>
252inline void world::each(flecs::id_t term_id, Func&& func)
const {
258 _::each_invoker<Func>(func).invoke(&it);
266 f.m_filter_ptr = &f.m_filter;
267 f.m_world = this->m_world;
#define ecs_abort(error_code,...)
Abort.
flecs::filter< Comps... > filter(Args &&... args) const
Create a filter.
ecs_filter_t * ecs_filter_init(ecs_world_t *world, const ecs_filter_desc_t *desc)
Initialize filter A filter is a lightweight object that can be used to query for entities in a world.
bool ecs_filter_next(ecs_iter_t *it)
Iterate tables matched by filter.
ecs_iter_t ecs_filter_iter(const ecs_world_t *world, const ecs_filter_t *filter)
Return a filter iterator.
char * ecs_filter_str(const ecs_world_t *world, const ecs_filter_t *filter)
Convert filter to string expression.
void ecs_filter_fini(ecs_filter_t *filter)
Deinitialize filter.
bool ecs_filter_next_instanced(ecs_iter_t *it)
Same as ecs_filter_next, but always instanced.
bool ecs_term_next(ecs_iter_t *it)
Progress a term iterator.
void ecs_filter_move(ecs_filter_t *dst, ecs_filter_t *src)
Move resources of one filter to another.
void ecs_filter_copy(ecs_filter_t *dst, const ecs_filter_t *src)
Copy resources of one filter to another.
ecs_iter_t ecs_term_iter(const ecs_world_t *world, ecs_term_t *term)
Iterator for a single (component) id.
bool(* ecs_iter_next_action_t)(ecs_iter_t *it)
Function prototype for iterating an iterator.
ecs_filter_t ECS_FILTER_INIT
Use $this variable to initialize user-allocated filter object.
ecs_entity_t ecs_get_entity(const ecs_poly_t *poly)
Get entity from poly.
Used with ecs_filter_init.
ecs_term_t * terms_buffer
For filters with lots of terms an outside array can be provided.
ecs_filter_t * storage
External storage to prevent allocation of the filter object.
Filters alllow for ad-hoc quick filtering of entity tables.
ecs_term_t * terms
Array containing terms for filter.
int32_t term_count
Number of elements in terms array.
Type that describes a term (single element in a query)
ecs_id_t id
Component id to be matched by term.
~filter_base()
Free the filter.
Class that describes a term.