Flecs v3.2
A fast entity component system (ECS) for C & C++
Loading...
Searching...
No Matches
builder_i.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include "../filter/builder_i.hpp"
9
10namespace flecs {
11
16template<typename Base, typename ... Components>
17struct query_builder_i : filter_builder_i<Base, Components ...> {
18private:
19 using BaseClass = filter_builder_i<Base, Components ...>;
20
21public:
23 : BaseClass(nullptr)
24 , m_desc(nullptr) { }
25
26 query_builder_i(ecs_query_desc_t *desc, int32_t term_index = 0)
27 : BaseClass(&desc->filter, term_index)
28 , m_desc(desc) { }
29
48 template <typename T>
49 Base& order_by(int(*compare)(flecs::entity_t, const T*, flecs::entity_t, const T*)) {
50 ecs_order_by_action_t cmp = reinterpret_cast<ecs_order_by_action_t>(compare);
51 return this->order_by(_::cpp_type<T>::id(this->world_v()), cmp);
52 }
53
60 Base& order_by(flecs::entity_t component, int(*compare)(flecs::entity_t, const void*, flecs::entity_t, const void*)) {
61 m_desc->order_by = reinterpret_cast<ecs_order_by_action_t>(compare);
63 return *this;
64 }
65
83 template <typename T>
84 Base& group_by(uint64_t(*group_by_action)(flecs::world_t*, flecs::table_t *table, flecs::id_t id, void* ctx)) {
85 ecs_group_by_action_t action = reinterpret_cast<ecs_group_by_action_t>(group_by_action);
86 return this->group_by(_::cpp_type<T>::id(this->world_v()), action);
87 }
88
95 Base& group_by(flecs::entity_t component, uint64_t(*group_by_action)(flecs::world_t*, flecs::table_t *table, flecs::id_t id, void* ctx)) {
96 m_desc->group_by = reinterpret_cast<ecs_group_by_action_t>(group_by_action);
97 m_desc->group_by_id = component;
98 return *this;
99 }
100
106 template <typename T>
107 Base& group_by() {
108 return this->group_by(_::cpp_type<T>::id(this->world_v()), nullptr);
109 }
110
116 Base& group_by(flecs::entity_t component) {
117 return this->group_by(component, nullptr);
118 }
119
125 Base& group_by_ctx(void *ctx, ecs_ctx_free_t ctx_free = nullptr) {
126 m_desc->group_by_ctx = ctx;
127 m_desc->group_by_ctx_free = ctx_free;
128 return *this;
129 }
130
133 Base& on_group_create(ecs_group_create_action_t action) {
134 m_desc->on_group_create = action;
135 return *this;
136 }
137
140 Base& on_group_delete(ecs_group_delete_action_t action) {
141 m_desc->on_group_delete = action;
142 return *this;
143 }
144
146 Base& observable(const query_base& parent);
147
148protected:
149 virtual flecs::world_t* world_v() = 0;
150
151private:
152 operator Base&() {
153 return *static_cast<Base*>(this);
154 }
155
156 ecs_query_desc_t *m_desc;
157};
158
159}
uint64_t(* ecs_group_by_action_t)(ecs_world_t *world, ecs_table_t *table, ecs_id_t group_id, void *ctx)
Callback used for grouping tables in a query.
Definition: flecs.h:563
void(* ecs_ctx_free_t)(void *ctx)
Function to cleanup context data.
Definition: flecs.h:592
int(* ecs_order_by_action_t)(ecs_entity_t e1, const void *ptr1, ecs_entity_t e2, const void *ptr2)
Callback used for comparing components.
Definition: flecs.h:545
Used with ecs_query_init.
Definition: flecs.h:1001
ecs_order_by_action_t order_by
Callback used for ordering query results.
Definition: flecs.h:1013
ecs_id_t group_by_id
Id to be used by group_by.
Definition: flecs.h:1022
ecs_group_by_action_t group_by
Callback used for grouping results.
Definition: flecs.h:1029
ecs_ctx_free_t group_by_ctx_free
Function to free group_by_ctx.
Definition: flecs.h:1043
void * group_by_ctx
Context to pass to group_by.
Definition: flecs.h:1040
ecs_group_create_action_t on_group_create
Callback that is invoked when a new group is created.
Definition: flecs.h:1033
ecs_entity_t order_by_component
Component to be used by order_by.
Definition: flecs.h:1008
ecs_filter_desc_t filter
Filter for the query.
Definition: flecs.h:1005
ecs_group_delete_action_t on_group_delete
Callback that is invoked when an existing group is deleted.
Definition: flecs.h:1037
Component class.
Definition: component.hpp:348
Filter builder interface.
Definition: builder_i.hpp:18
Query builder interface.
Definition: builder_i.hpp:17
Base & group_by()
Group and sort matched tables.
Definition: builder_i.hpp:107
Base & on_group_delete(ecs_group_delete_action_t action)
Specify on_group_delete action.
Definition: builder_i.hpp:140
Base & group_by(flecs::entity_t component, uint64_t(*group_by_action)(flecs::world_t *, flecs::table_t *table, flecs::id_t id, void *ctx))
Group and sort matched tables.
Definition: builder_i.hpp:95
Base & on_group_create(ecs_group_create_action_t action)
Specify on_group_create action.
Definition: builder_i.hpp:133
Base & group_by(flecs::entity_t component)
Group and sort matched tables.
Definition: builder_i.hpp:116
Base & observable(const query_base &parent)
Specify parent query (creates subquery)
Definition: impl.hpp:178
Base & group_by(uint64_t(*group_by_action)(flecs::world_t *, flecs::table_t *table, flecs::id_t id, void *ctx))
Group and sort matched tables.
Definition: builder_i.hpp:84
Base & order_by(int(*compare)(flecs::entity_t, const T *, flecs::entity_t, const T *))
Sort the output of a query.
Definition: builder_i.hpp:49
Base & group_by_ctx(void *ctx, ecs_ctx_free_t ctx_free=nullptr)
Specify context to be passed to group_by function.
Definition: builder_i.hpp:125
Base & order_by(flecs::entity_t component, int(*compare)(flecs::entity_t, const void *, flecs::entity_t, const void *))
Sort the output of a query.
Definition: builder_i.hpp:60