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
30 if (!m_rule) {
31 ecs_abort(ECS_INVALID_PARAMETER, NULL);
32 }
33
34 if (desc->terms_buffer) {
35 ecs_os_free(desc->terms_buffer);
36 }
37 }
38
39 operator rule_t*() const {
40 return m_rule;
41 }
42
44 return flecs::entity(m_world, ecs_get_entity(m_rule));
45 }
46
49 void destruct() {
50 ecs_rule_fini(m_rule);
51 m_world = nullptr;
52 m_rule = nullptr;
53 }
54
55 flecs::string str() {
56 const ecs_filter_t *f = ecs_rule_get_filter(m_rule);
57 char *result = ecs_filter_str(m_world, f);
58 return flecs::string(result);
59 }
60
61 operator rule<>() const;
62
63protected:
64 world_t *m_world;
65 rule_t *m_rule;
66};
67
68template<typename ... Components>
69struct rule final : rule_base, iterable<Components...> {
70private:
71 using Terms = typename _::term_ptrs<Components...>::array;
72
73 ecs_iter_t get_iter(flecs::world_t *world) const override {
74 if (!world) {
75 world = m_world;
76 }
77 return ecs_rule_iter(m_world, m_rule);
78 }
79
80 ecs_iter_next_action_t next_action() const override {
81 return ecs_rule_next;
82 }
83
84 ecs_iter_next_action_t next_each_action() const override {
86 }
87
88public:
89 using rule_base::rule_base;
90
91 int32_t find_var(const char *name) {
92 return ecs_rule_find_var(m_rule, name);
93 }
94};
95
96// Mixin implementation
97template <typename... Comps, typename... Args>
98inline flecs::rule<Comps...> world::rule(Args &&... args) const {
99 return flecs::rule_builder<Comps...>(m_world, FLECS_FWD(args)...)
100 .build();
101}
102
103template <typename... Comps, typename... Args>
104inline flecs::rule_builder<Comps...> world::rule_builder(Args &&... args) const {
105 return flecs::rule_builder<Comps...>(m_world, FLECS_FWD(args)...);
106}
107
108// rule_base implementation
109inline rule_base::operator rule<>() const {
110 return flecs::rule<>(m_world, m_rule);
111}
112
113} // namespace flecs
#define ecs_abort(error_code,...)
Abort.
Definition: log.h:343
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:357
ecs_entity_t ecs_get_entity(const ecs_poly_t *poly)
Get entity from poly.
Used with ecs_filter_init.
Definition: flecs.h:770
ecs_term_t * terms_buffer
For filters with lots of terms an outside array can be provided.
Definition: flecs.h:778
Filters alllow for ad-hoc quick filtering of entity tables.
Definition: flecs.h:555
Entity.
Definition: entity.hpp:30
void destruct()
Free the rule.
Definition: impl.hpp:49
Rule builder.
Definition: builder.hpp:23
The world.
Definition: world.hpp:113
Builder base class.