1#include "gaia/config/config.h"
3#if !GAIA_SYSTEMS_ENABLED
14 #include "gaia/ecs/chunk_iterator.h"
15 #include "gaia/ecs/id.h"
16 #include "gaia/ecs/query.h"
17 #include "gaia/mt/jobhandle.h"
23 inline constexpr const char* sc_query_func_str =
"System_exec";
24 const char* entity_name(
const World& world, Entity entity);
28 using TSystemIterFunc = std::function<void(Iter&)>;
31 Entity entity = EntityBad;
33 TSystemIterFunc on_each_func;
37 QueryExecType execType = QueryExecType::Default;
39 mt::JobHandle jobHandle = mt::JobNull;
46 if (jobHandle != (mt::JobHandle)mt::JobNull_t{}) {
47 auto& tp = mt::ThreadPool::get();
55 auto& queryInfo = query.fetch();
58 const char* pName = entity_name(*queryInfo.world(), entity);
59 const char* pScopeName = pName !=
nullptr ? pName : sc_query_func_str;
60 GAIA_PROF_SCOPE2(pScopeName);
64 case QueryExecType::Parallel:
65 query.run_query_on_chunks<QueryExecType::Parallel, Iter>(queryInfo, on_each_func);
67 case QueryExecType::ParallelPerf:
68 query.run_query_on_chunks<QueryExecType::ParallelPerf, Iter>(queryInfo, on_each_func);
70 case QueryExecType::ParallelEff:
71 query.run_query_on_chunks<QueryExecType::ParallelEff, Iter>(queryInfo, on_each_func);
74 query.run_query_on_chunks<QueryExecType::Default, Iter>(queryInfo, on_each_func);
80 GAIA_NODISCARD mt::JobHandle job_handle() {
81 if (jobHandle == (mt::JobHandle)mt::JobNull_t{}) {
82 auto& tp = mt::ThreadPool::get();
84 syncJob.func = [&]() {
87 syncJob.flags = mt::JobCreationFlags::ManualDelete;
88 jobHandle = tp.add(syncJob);
94 template <
typename Serializer>
95 void save(Serializer& s)
const {
99 template <
typename Serializer>
100 void load(Serializer& s) {
120 class SystemBuilder {
125 GAIA_ASSERT(m_world.valid(m_entity));
129 auto ss = m_world.acc_mut(m_entity);
130 auto& sys = ss.smut<System_>();
134 const System_& data()
const {
135 auto ss = m_world.acc(m_entity);
136 const auto& sys = ss.get<System_>();
141 SystemBuilder(World& world, Entity entity): m_world(world), m_entity(entity) {}
145 SystemBuilder& add(QueryInput item) {
147 data().query.add(item);
153 SystemBuilder& all(Entity entity,
bool isReadWrite =
false) {
155 data().query.all(entity, isReadWrite);
159 SystemBuilder& all(Entity entity, Entity src,
bool isReadWrite =
false) {
161 data().query.all(entity, src, isReadWrite);
165 SystemBuilder& any(Entity entity,
bool isReadWrite =
false) {
167 data().query.any(entity, isReadWrite);
171 SystemBuilder& no(Entity entity) {
173 data().query.no(entity);
177 SystemBuilder& changed(Entity entity) {
179 data().query.changed(entity);
185 #if GAIA_USE_VARIADIC_API
186 template <
typename... T>
187 SystemBuilder& all() {
189 data().query.all<T...>();
192 template <
typename... T>
193 SystemBuilder& any() {
195 data().query.any<T...>();
198 template <
typename... T>
199 SystemBuilder& no() {
201 data().query.no<T...>();
204 template <
typename... T>
205 SystemBuilder& changed() {
207 data().query.changed<T...>();
211 template <
typename T>
212 SystemBuilder& all() {
214 data().query.all<T>();
217 template <
typename T>
218 SystemBuilder& any() {
220 data().query.any<T>();
223 template <
typename T>
224 SystemBuilder& no() {
226 data().query.no<T>();
229 template <
typename T>
230 SystemBuilder& changed() {
232 data().query.changed<T>();
239 SystemBuilder& group_by(Entity entity, TGroupByFunc func = group_by_func_default) {
240 data().query.group_by(entity, func);
244 template <
typename T>
245 SystemBuilder& group_by(TGroupByFunc func = group_by_func_default) {
246 data().query.group_by<T>(func);
250 template <
typename Rel,
typename Tgt>
251 SystemBuilder& group_by(TGroupByFunc func = group_by_func_default) {
252 data().query.group_by<Rel, Tgt>(func);
258 SystemBuilder& group_id(GroupId groupId) {
259 data().query.group_id(groupId);
263 SystemBuilder& group_id(Entity entity) {
264 GAIA_ASSERT(!entity.pair());
265 data().query.group_id(entity.id());
269 template <
typename T>
270 SystemBuilder& group_id() {
271 data().query.group_id<T>();
277 SystemBuilder& name(
const char* name, uint32_t len = 0) {
278 m_world.name(m_entity, name, len);
282 SystemBuilder& name_raw(
const char* name, uint32_t len = 0) {
283 m_world.name_raw(m_entity, name, len);
289 SystemBuilder& mode(QueryExecType type) {
295 template <
typename Func>
296 SystemBuilder& on_each(Func func) {
300 if constexpr (std::is_invocable_v<Func, Iter&>) {
301 ctx.on_each_func = [func](Iter& it) {
305 using InputArgs =
decltype(core::func_args(&Func::operator()));
307 #if GAIA_ASSERT_ENABLED
311 auto& queryInfo = ctx.query.fetch();
312 GAIA_ASSERT(ctx.query.unpack_args_into_query_has_all(queryInfo, InputArgs{}));
315 ctx.on_each_func = [e = m_entity, func](Iter& it) {
320 auto ss =
const_cast<World*
>(it.world())->acc_mut(e);
321 auto& sys = ss.smut<System_>();
322 sys.query.run_query_on_chunk(it, func, InputArgs{});
326 return (SystemBuilder&)*
this;
329 GAIA_NODISCARD Entity entity()
const {
338 GAIA_NODISCARD mt::JobHandle job_handle() {
340 return ctx.job_handle();
Checks if endianess was detected correctly at compile-time.
Definition bitset.h:9