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) {
48 return this->
term(FLECS_FWD(args)...);
51 template <
typename T,
typename ... Args>
52 Base& with(Args&&... args) {
53 return this->
term<T>(FLECS_FWD(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>
123 ECS_INVALID_OPERATION,
124 "filter_builder::term() called without initializing term");
133 ecs_os_memset_n(m_desc->
terms, 0,
144 this->set_term(&m_desc->
terms[m_term_index]);
153 Base& term_at(int32_t term_index) {
154 ecs_assert(term_index > 0, ECS_INVALID_PARAMETER, NULL);
155 int32_t prev_index = m_term_index;
156 m_term_index = term_index - 1;
158 m_term_index = prev_index;
160 ECS_INVALID_PARAMETER, NULL);
164 Base& arg(int32_t term_index) {
165 return this->term_at(term_index);
173 _::type_to_inout<T>());
177 Base&
term(id_t
id) {
183 Base&
term(
const char *name) {
189 Base&
term(
const char *first,
const char *second) {
191 *this->m_term =
flecs::term().first(first).second(second).move();
195 Base&
term(entity_t r, entity_t o) {
201 Base&
term(entity_t r,
const char *o) {
207 template<
typename First>
212 template<
typename First>
213 Base&
term(
const char *second) {
217 template<
typename First,
typename Second>
222 template <typename E, if_t< is_enum<E>::value > = 0>
223 Base&
term(E value) {
225 auto o = enum_type<E>(this->world_v()).entity(value);
226 return this->
term(r, o);
231 *this->m_term =
term.move();
237 *this->m_term =
term.move();
242 virtual flecs::world_t* world_v() = 0;
243 int32_t m_term_index;
244 int32_t m_expr_count;
248 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.
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 & write()
Short for inout_stage(flecs::Out).
Class that describes a term.