8#include "../term/builder_i.hpp"
17template<
typename Base,
typename ... Components>
20 : m_term_index(term_index)
29 Base& filter_flags(ecs_flags32_t flags) {
30 m_desc->
flags |= flags;
34 Base& expr(
const char *expr) {
35 ecs_check(m_expr_count == 0, ECS_INVALID_OPERATION,
36 "filter_builder::expr() called more than once");
46 template <
typename ... Args>
47 Base& with(Args&&... args) {
51 template <
typename T,
typename ... Args>
52 Base& with(Args&&... args) {
56 template <
typename First,
typename Second>
61 template <
typename ... Args>
62 Base& without(Args&&... args) {
63 return this->
term(FLECS_FWD(args)...).not_();
66 template <
typename T,
typename ... Args>
67 Base& without(Args&&... args) {
68 return this->
term<T>(FLECS_FWD(args)...).not_();
71 template <
typename First,
typename Second>
83 template <
typename ... Args>
84 Base& write(Args&&... args) {
85 return this->
term(FLECS_FWD(args)...).
write();
88 template <
typename T,
typename ... Args>
89 Base& write(Args&&... args) {
93 template <
typename First,
typename Second>
103 template <
typename ... Args>
104 Base& read(Args&&... args) {
105 return this->
term(FLECS_FWD(args)...).
read();
108 template <
typename T,
typename ... Args>
109 Base& read(Args&&... args) {
113 template <
typename First,
typename Second>
120 return this->with(flecs::ScopeOpen).entity(0);
123 Base& scope_close() {
124 return this->with(flecs::ScopeClose).entity(0);
132 ECS_INVALID_OPERATION,
133 "filter_builder::term() called without initializing term");
142 ecs_os_memset_n(m_desc->
terms, 0,
153 this->set_term(&m_desc->
terms[m_term_index]);
162 Base& term_at(int32_t term_index) {
163 ecs_assert(term_index > 0, ECS_INVALID_PARAMETER, NULL);
164 int32_t prev_index = m_term_index;
165 m_term_index = term_index - 1;
167 m_term_index = prev_index;
169 ECS_INVALID_PARAMETER, NULL);
173 Base& arg(int32_t term_index) {
174 return this->term_at(term_index);
182 _::type_to_inout<T>());
186 Base&
term(id_t
id) {
192 Base&
term(
const char *name) {
198 Base&
term(
const char *first,
const char *second) {
200 *this->m_term =
flecs::term().first(first).second(second).move();
204 Base&
term(entity_t r, entity_t o) {
210 Base&
term(entity_t r,
const char *o) {
216 template<
typename First>
221 template<
typename First>
222 Base&
term(
const char *second) {
226 template<
typename First,
typename Second>
231 template <typename E, if_t< is_enum<E>::value > = 0>
232 Base&
term(E value) {
234 auto o = enum_type<E>(this->world_v()).entity(value);
235 return this->
term(r, o);
240 *this->m_term =
term.move();
246 *this->m_term =
term.move();
251 virtual flecs::world_t* world_v() = 0;
252 int32_t m_term_index;
253 int32_t m_expr_count;
257 return *
static_cast<Base*
>(
this);
#define ecs_assert(condition, error_code,...)
Assert.
#define ecs_check(condition, error_code,...)
Check.
bool ecs_term_is_initialized(const ecs_term_t *term)
Test whether a term is set.
#define FLECS_TERM_DESC_MAX
Maximum number of terms in ecs_filter_desc_t.
ecs_inout_kind_t
Specify read/write access for term.
Used with ecs_filter_init.
ecs_term_t * terms_buffer
For filters with lots of terms an outside array can be provided.
bool instanced
When true, terms returned by an iterator may either contain 1 or N elements, where terms with N eleme...
ecs_term_t terms[(16)]
Terms of the filter.
int32_t terms_buffer_count
Number of terms in array provided in terms_buffer.
ecs_flags32_t flags
Flags for advanced usage.
const char * expr
Filter expression.
Type that describes a term (single element in a query)
ecs_inout_kind_t inout
Access to contents matched by term.
Filter builder interface.
Base & read()
Short for inout_stage(flecs::In).
Base & inout_none()
Short for inout(flecs::In)
Base & write()
Short for inout_stage(flecs::Out).
Class that describes a term.