Flecs v3.1
A fast entity component system (ECS) for C & C++
Loading...
Searching...
No Matches
impl.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include "builder.hpp"
9
10namespace flecs {
11
15
16struct rule_base {
17 rule_base()
18 : m_world(nullptr)
19 , m_rule(nullptr) { }
20
21 rule_base(world_t *world, rule_t *rule = nullptr)
22 : m_world(world)
23 , m_rule(rule) { }
24
25 rule_base(world_t *world, ecs_filter_desc_t *desc)
26 : m_world(world)
27 {
28 m_rule = ecs_rule_init(world, desc);
29 if (desc->terms_buffer) {
30 ecs_os_free(desc->terms_buffer);
31 }
32 }
33
34 bool is_valid() const {
35 return m_rule != nullptr;
36 }
37
38 operator rule_t*() const {
39 return m_rule;
40 }
41
43 return flecs::entity(m_world, ecs_get_entity(m_rule));
44 }
45
47 void destruct() {
48 if (m_rule) {
49 ecs_rule_fini(m_rule);
50 m_world = nullptr;
51 m_rule = nullptr;
52 }
53 }
54
56 void move(flecs::rule_base&& obj) {
57 this->destruct();
58 this->m_world = obj.m_world;
59 this->m_rule = obj.m_rule;
60 obj.m_world = nullptr;
61 obj.m_rule = nullptr;
62 }
63
64 flecs::string str() {
65 const ecs_filter_t *f = ecs_rule_get_filter(m_rule);
66 char *result = ecs_filter_str(m_world, f);
67 return flecs::string(result);
68 }
69
70 operator rule<>() const;
71
72protected:
73 world_t *m_world;
74 rule_t *m_rule;
75};
76
77template<typename ... Components>
78struct rule final : rule_base, iterable<Components...> {
79private:
80 using Terms = typename _::term_ptrs<Components...>::array;
81
82 ecs_iter_t get_iter(flecs::world_t *world) const override {
83 if (!world) {
84 world = m_world;
85 }
86 return ecs_rule_iter(m_world, m_rule);
87 }
88
89 ecs_iter_next_action_t next_action() const override {
90 return ecs_rule_next;
91 }
92
93 ecs_iter_next_action_t next_each_action() const override {
95 }
96
97public:
98 using rule_base::rule_base;
99
100 int32_t find_var(const char *name) {
101 return ecs_rule_find_var(m_rule, name);
102 }
103};
104
105// Mixin implementation
106template <typename... Comps, typename... Args>
107inline flecs::rule<Comps...> world::rule(Args &&... args) const {
108 return flecs::rule_builder<Comps...>(m_world, FLECS_FWD(args)...)
109 .build();
110}
111
112template <typename... Comps, typename... Args>
113inline flecs::rule_builder<Comps...> world::rule_builder(Args &&... args) const {
114 return flecs::rule_builder<Comps...>(m_world, FLECS_FWD(args)...);
115}
116
117// rule_base implementation
118inline rule_base::operator rule<>() const {
119 return flecs::rule<>(m_world, m_rule);
120}
121
122} // namespace flecs
FLECS_API void ecs_rule_fini(ecs_rule_t *rule)
Delete a rule.
FLECS_API const ecs_filter_t * ecs_rule_get_filter(const ecs_rule_t *rule)
Obtain filter from rule.
FLECS_API bool ecs_rule_next(ecs_iter_t *it)
Progress rule iterator.
FLECS_API bool ecs_rule_next_instanced(ecs_iter_t *it)
Progress instanced iterator.
FLECS_API ecs_iter_t ecs_rule_iter(const ecs_world_t *world, const ecs_rule_t *rule)
Iterate a rule.
FLECS_API ecs_rule_t * ecs_rule_init(ecs_world_t *world, const ecs_filter_desc_t *desc)
Create a rule.
FLECS_API int32_t ecs_rule_find_var(const ecs_rule_t *rule, const char *name)
Find variable index.
flecs::rule< Comps... > rule(Args &&... args) const
Create a rule.
char * ecs_filter_str(const ecs_world_t *world, const ecs_filter_t *filter)
Convert filter to string expression.
bool(* ecs_iter_next_action_t)(ecs_iter_t *it)
Function prototype for iterating an iterator.
Definition: flecs.h:356
ecs_entity_t ecs_get_entity(const ecs_poly_t *poly)
Get entity from poly.
Used with ecs_filter_init.
Definition: flecs.h:781
ecs_term_t * terms_buffer
For filters with lots of terms an outside array can be provided.
Definition: flecs.h:789
Filters alllow for ad-hoc quick filtering of entity tables.
Definition: flecs.h:566
Entity.
Definition: entity.hpp:30
void destruct()
Free the rule.
Definition: impl.hpp:47
void move(flecs::rule_base &&obj)
Move the rule.
Definition: impl.hpp:56
Rule builder.
Definition: builder.hpp:23
The world.
Definition: world.hpp:113
Builder base class.