8#include "../term/builder_i.hpp"
17template<
typename Base,
typename ... Components>
20 : m_term_index(term_index)
29 Base& expr(
const char *expr) {
30 ecs_check(m_expr_count == 0, ECS_INVALID_OPERATION,
31 "filter_builder::expr() called more than once");
41 template <
typename ... Args>
42 Base& with(Args&&... args) {
43 return this->
term(FLECS_FWD(args)...);
46 template <
typename T,
typename ... Args>
47 Base& with(Args&&... args) {
48 return this->
term<T>(FLECS_FWD(args)...);
51 template <
typename First,
typename Second>
56 template <
typename ... Args>
57 Base& without(Args&&... args) {
58 return this->
term(FLECS_FWD(args)...).not_();
61 template <
typename T,
typename ... Args>
62 Base& without(Args&&... args) {
63 return this->
term<T>(FLECS_FWD(args)...).not_();
66 template <
typename First,
typename Second>
78 template <
typename ... Args>
79 Base& write(Args&&... args) {
80 return this->
term(FLECS_FWD(args)...).
write();
83 template <
typename T,
typename ... Args>
84 Base& write(Args&&... args) {
88 template <
typename First,
typename Second>
98 template <
typename ... Args>
99 Base& read(Args&&... args) {
100 return this->
term(FLECS_FWD(args)...).
read();
103 template <
typename T,
typename ... Args>
104 Base& read(Args&&... args) {
108 template <
typename First,
typename Second>
118 ECS_INVALID_OPERATION,
119 "filter_builder::term() called without initializing term");
128 ecs_os_memset_n(m_desc->
terms, 0,
139 this->set_term(&m_desc->
terms[m_term_index]);
148 Base& term_at(int32_t term_index) {
149 ecs_assert(term_index > 0, ECS_INVALID_PARAMETER, NULL);
150 int32_t prev_index = m_term_index;
151 m_term_index = term_index - 1;
153 m_term_index = prev_index;
155 ECS_INVALID_PARAMETER, NULL);
159 Base& arg(int32_t term_index) {
160 return this->term_at(term_index);
168 _::type_to_inout<T>());
172 Base&
term(id_t
id) {
178 Base&
term(
const char *name) {
184 Base&
term(
const char *first,
const char *second) {
186 *this->m_term =
flecs::term().first(first).second(second).move();
190 Base&
term(entity_t r, entity_t o) {
196 Base&
term(entity_t r,
const char *o) {
202 template<
typename First>
207 template<
typename First>
208 Base&
term(
const char *second) {
212 template<
typename First,
typename Second>
217 template <typename E, if_t< is_enum<E>::value > = 0>
218 Base&
term(E value) {
220 auto o = enum_type<E>(this->world_v()).entity(value);
221 return this->
term(r, o);
226 *this->m_term =
term.move();
232 *this->m_term =
term.move();
237 virtual flecs::world_t* world_v() = 0;
238 int32_t m_term_index;
239 int32_t m_expr_count;
243 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 ECS_TERM_DESC_CACHE_SIZE
Maximum number of terms in desc (larger, as these are temp objects)
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.
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 & write()
Short for inout_stage(flecs::Out).
Class that describes a term.