Skip to main content

DelayedComponentEnabler.ixx File

Component for scheduling delayed activation of other components. More...

Included Headers

#include <cassert> #include <span> #include <typeindex> #include <memory> #include <vector> #include <ranges> #include <helios.engine.core.types> #include <helios.ecs.types.ComponentTypeId>

Namespaces Index

namespacehelios
namespaceengine
namespaceruntime
namespacelifecycle
namespacecomponents

Classes Index

classDelayedComponentEnabler<THandle>

Component that manages delayed activation of other components. More...

structDeferredComponent

Internal structure tracking a deferred component. More...

Description

Component for scheduling delayed activation of other components.

File Listing

The file content with the documentation metadata removed is:

1
5module;
6
7#include <cassert>
8#include <span>
9#include <typeindex>
10#include <memory>
11#include <vector>
12#include <ranges>
13export module helios.engine.runtime.lifecycle.components.DelayedComponentEnabler;
14
15
16import helios.ecs.types.ComponentTypeId;
17import helios.engine.core.types;
18
20
41 template<typename THandle>
43
47 struct DeferredComponent {
51 float delta;
52
56 helios::ecs::types::ComponentTypeId<THandle> componentTypeId;
57 };
58
62 std::vector<DeferredComponent> deferredComponents_;
63
64 public:
65
70
77 : deferredComponents_(other.deferredComponents_) {}
78
82
88 std::span<DeferredComponent> deferredComponents() noexcept {
89 return deferredComponents_;
90 }
91
100 void sync(std::span<helios::ecs::types::ComponentTypeId<THandle>> removeList) {
101 std::erase_if(deferredComponents_, [&](const DeferredComponent& dc) {
102 return std::ranges::find(removeList, dc.componentTypeId) != removeList.end();
103 });
104 }
105
118 template<typename TEntity>
119 void defer(
121 helios::ecs::types::ComponentTypeId<THandle> componentTypeId, const float delta) {
122 assert(delta > 0 && "delta must be greater than 0");
123
124 const bool hasCmp = entity.has(componentTypeId);
125 assert(hasCmp && "ComponentTypeId not part of Entity");
126
127 const auto it = std::ranges::find_if(deferredComponents_,
128 [componentTypeId](const auto& item) {
129 return item.componentTypeId == componentTypeId;
130 });
131
132 entity.disableComponent(componentTypeId);
133
134 if (it == deferredComponents_.end()) {
135 deferredComponents_.push_back({delta, componentTypeId});
136 } else {
137 it->delta = delta;
138 }
139 }
140
141
142 };
143
144}

Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.8.