Helios Engine
A modular ECS based data-oriented C++23 game engine framework
Loading...
Searching...
No Matches
param_traits.hpp
Go to the documentation of this file.
1#pragma once
2
15#include <helios/ecs/world.hpp>
17
18#include <optional>
19#include <tuple>
20
21namespace helios::ecs {
22
23namespace details {
24
25/// @brief Helper to register query component access from a component tuple.
26template <typename Tuple>
28
29template <typename... Cs>
30struct RegisterQueryAccess<std::tuple<Cs...>> {
31 static constexpr void Apply(AccessPolicyBuilder& builder) {
32 builder.Query<Cs...>();
33 }
34};
35
36} // namespace details
37
38// ---------------------------------------------------------------------------
39// Query
40// ---------------------------------------------------------------------------
41
42template <QueryArg... Args>
43struct SystemParamTraits<Query<Args...>> {
44 using ParamType = Query<Args...>;
45 using Split = details::QueryArgSplit<Args...>;
47
48 static ParamType Make(World& world, SystemLocalData& data,
49 const AccessPolicy& /*policy*/) {
50 auto alloc = Allocator{&data.allocator};
51 return ParamType(world.Components(), std::move(alloc));
52 }
53
57};
58
59// ---------------------------------------------------------------------------
60// Resources
61// ---------------------------------------------------------------------------
62
63template <ResourceTrait T>
64struct SystemParamTraits<Res<const T>> {
65 static auto Make(World& world, SystemLocalData& /*data*/,
66 const AccessPolicy& /*policy*/) noexcept -> Res<const T> {
67 return Res<const T>(world.ReadResource<T>());
68 }
69
70 static constexpr void RegisterAccess(AccessPolicyBuilder& builder) {
71 if constexpr (!AsyncResourceTrait<T>) {
72 builder.ReadResources<T>();
73 }
74 }
75};
76
77template <ResourceTrait T>
79 static auto Make(World& world, SystemLocalData& /*data*/,
80 const AccessPolicy& /*policy*/) noexcept -> Res<T> {
81 return Res<T>(world.WriteResource<T>());
82 }
83
84 static constexpr void RegisterAccess(AccessPolicyBuilder& builder) {
85 if constexpr (!AsyncResourceTrait<T>) {
86 builder.WriteResources<T>();
87 }
88 }
89};
90
91template <ResourceTrait T>
92struct SystemParamTraits<std::optional<Res<const T>>> {
93 static auto Make(World& world, SystemLocalData& /*data*/,
94 const AccessPolicy& /*policy*/) noexcept
95 -> std::optional<Res<const T>> {
96 if (const T* ptr = world.TryReadResource<T>()) {
97 return Res<const T>(*ptr);
98 }
99 return std::nullopt;
100 }
101
102 static constexpr void RegisterAccess(AccessPolicyBuilder& builder) {
103 if constexpr (!AsyncResourceTrait<T>) {
104 builder.ReadResources<T>();
105 }
106 }
107};
108
109template <ResourceTrait T>
110struct SystemParamTraits<std::optional<Res<T>>> {
111 static auto Make(World& world, SystemLocalData& /*data*/,
112 const AccessPolicy& /*policy*/) noexcept
113 -> std::optional<Res<T>> {
114 if (T* ptr = world.TryWriteResource<T>()) {
115 return Res<T>(*ptr);
116 }
117 return std::nullopt;
118 }
119
120 static constexpr void RegisterAccess(AccessPolicyBuilder& builder) {
121 if constexpr (!AsyncResourceTrait<T>) {
122 builder.WriteResources<T>();
123 }
124 }
125};
126
127// ---------------------------------------------------------------------------
128// Local resources
129// ---------------------------------------------------------------------------
130
131template <ResourceTrait T>
132struct SystemParamTraits<Local<const T>> {
133 static auto Make(World& /*world*/, SystemLocalData& data,
134 const AccessPolicy& /*policy*/) noexcept -> Local<const T> {
135 return Local<const T>(data.resource_manager.Get<T>());
136 }
137
138 static constexpr void RegisterAccess(
139 AccessPolicyBuilder& /*builder*/) noexcept {}
140};
141
142template <ResourceTrait T>
144 static auto Make(World& /*world*/, SystemLocalData& data,
145 const AccessPolicy& /*policy*/) noexcept -> Local<T> {
146 return Local<T>(data.resource_manager.Get<T>());
147 }
148
149 static constexpr void RegisterAccess(
150 AccessPolicyBuilder& /*builder*/) noexcept {}
151};
152
153template <ResourceTrait T>
154struct SystemParamTraits<std::optional<Local<const T>>> {
155 static auto Make(World& /*world*/, SystemLocalData& data,
156 const AccessPolicy& /*policy*/) noexcept
157 -> std::optional<Local<const T>> {
158 if (const T* ptr = data.resource_manager.TryGet<T>()) {
159 return Local<const T>(*ptr);
160 }
161 return std::nullopt;
162 }
163
164 static constexpr void RegisterAccess(
165 AccessPolicyBuilder& /*builder*/) noexcept {}
166};
167
168template <ResourceTrait T>
169struct SystemParamTraits<std::optional<Local<T>>> {
170 static auto Make(World& /*world*/, SystemLocalData& data,
171 const AccessPolicy& /*policy*/) noexcept
172 -> std::optional<Local<T>> {
173 if (T* ptr = data.resource_manager.TryGet<T>()) {
174 return Local<T>(*ptr);
175 }
176 return std::nullopt;
177 }
178
179 static constexpr void RegisterAccess(
180 AccessPolicyBuilder& /*builder*/) noexcept {}
181};
182
183// ---------------------------------------------------------------------------
184// Commands
185// ---------------------------------------------------------------------------
186
187template <>
189 static constexpr Commands Make(World& world, SystemLocalData& data,
190 const AccessPolicy& /*policy*/) {
191 return {data.cmd_queue, world, &data.allocator};
192 }
193
194 static constexpr void RegisterAccess(
195 AccessPolicyBuilder& /*builder*/) noexcept {}
196};
197
198// ---------------------------------------------------------------------------
199// WorldView
200// ---------------------------------------------------------------------------
201
202template <>
204 static constexpr WorldView Make(World& world, SystemLocalData& /*data*/,
205 const AccessPolicy& /*policy*/) noexcept {
206 return WorldView(world);
207 }
208
209 static constexpr void RegisterAccess(
210 AccessPolicyBuilder& /*builder*/) noexcept {}
211};
212
213// ---------------------------------------------------------------------------
214// Messages
215// ---------------------------------------------------------------------------
216
217template <MessageTrait T>
219 static auto Make(World& world, SystemLocalData& /*data*/,
220 const AccessPolicy& /*policy*/) noexcept
222 return world.ReadMessages<T>();
223 }
224
225 static constexpr void RegisterAccess(
226 AccessPolicyBuilder& /*builder*/) noexcept {}
227};
228
229template <ConsumableMessageTrait T>
231 static auto Make(World& world, SystemLocalData& data,
232 const AccessPolicy& /*policy*/) noexcept
234 return ConsumableMessageReader<T>(world.Messages(), data.consumed_messages);
235 }
236
237 static constexpr void RegisterAccess(
238 AccessPolicyBuilder& /*builder*/) noexcept {}
239};
240
241template <MessageTrait T>
243 static auto Make(World& /*world*/, SystemLocalData& data,
244 const AccessPolicy& /*policy*/) noexcept
246 if (!data.message_queue.IsRegistered<T>()) {
247 data.message_queue.Register<T>();
248 }
249 return MessageWriter<T>(data.message_queue);
250 }
251
252 static constexpr void RegisterAccess(
253 AccessPolicyBuilder& /*builder*/) noexcept {}
254};
255
256template <MessageTrait T, typename Allocator>
258 static auto Make(World& /*world*/, SystemLocalData& data,
259 const AccessPolicy& /*policy*/) noexcept
261 if (!data.message_queue.IsRegistered<T>()) {
262 data.message_queue.Register<T>();
263 }
264 return BasicMessageWriter<T, Allocator>(data.message_queue);
265 }
266
267 static constexpr void RegisterAccess(
268 AccessPolicyBuilder& /*builder*/) noexcept {}
269};
270
271template <AsyncMessageTrait T>
273 static auto Make(World& world, SystemLocalData& /*data*/,
274 const AccessPolicy& /*policy*/) noexcept
276 return world.ReadAsyncMessages<T>();
277 }
278
279 static constexpr void RegisterAccess(
280 AccessPolicyBuilder& /*builder*/) noexcept {}
281};
282
283template <AsyncMessageTrait T>
285 static auto Make(World& world, SystemLocalData& /*data*/,
286 const AccessPolicy& /*policy*/) noexcept
288 return world.WriteAsyncMessages<T>();
289 }
290
291 static constexpr void RegisterAccess(
292 AccessPolicyBuilder& /*builder*/) noexcept {}
293};
294
295} // namespace helios::ecs
Fluent builder for constructing an AccessPolicy.
constexpr auto ReadResources(this auto &&self) -> decltype(std::forward< decltype(self)>(self))
Declares read-only access to resource types.
constexpr auto Query(this auto &&self) -> decltype(std::forward< decltype(self)>(self))
Declares a query over component types.
constexpr auto WriteResources(this auto &&self) -> decltype(std::forward< decltype(self)>(self))
Declares write access to resource types.
Stores data access requirements for a system at compile time.
Type-safe, move-based reader for async messages.
Type-safe writer for async messages.
Type-safe writer for regular messages with a configurable queue allocator.
Definition writer.hpp:26
Thin wrapper over command queue and world for deferred ECS operations.
Definition commands.hpp:24
Type-safe, zero-copy reader for consumable messages with consume support.
Definition reader.hpp:877
Read-only or mutable access to a system-local resource.
Type-safe, zero-copy reader for regular messages.
Definition reader.hpp:771
Read-only or mutable access to resource.
Definition param.hpp:17
Thread-safe read-only view into the world.
The World class manages entities with their components and systems.
Definition world.hpp:39
ComponentManager & Components() noexcept
Gets the component manager.
Definition world.hpp:832
Concept for async resources.
Definition resource.hpp:59
PmrBasicMessageWriter< T > MessageWriter
Alias for BasicMessageWriter bound to a PMR allocator.
Definition writer.hpp:97
BasicQuery< World, std::pmr::polymorphic_allocator<>, Args... > Query
Alias for BasicQuery bound to World with a PMR allocator.
Definition query.hpp:2264
STL namespace.
Local data for a system.
mem::ArenaAllocator allocator
local arena allocator
PmrCmdQueue cmd_queue
local command queue
static auto Make(World &world, SystemLocalData &, const AccessPolicy &) noexcept -> AsyncMessageReader< T >
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static auto Make(World &world, SystemLocalData &, const AccessPolicy &) noexcept -> AsyncMessageWriter< T >
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static auto Make(World &, SystemLocalData &data, const AccessPolicy &) noexcept -> BasicMessageWriter< T, Allocator >
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static constexpr Commands Make(World &world, SystemLocalData &data, const AccessPolicy &)
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static auto Make(World &world, SystemLocalData &data, const AccessPolicy &) noexcept -> ConsumableMessageReader< T >
static auto Make(World &, SystemLocalData &data, const AccessPolicy &) noexcept -> Local< T >
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static auto Make(World &, SystemLocalData &data, const AccessPolicy &) noexcept -> Local< const T >
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static auto Make(World &world, SystemLocalData &, const AccessPolicy &) noexcept -> MessageReader< T >
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static auto Make(World &, SystemLocalData &data, const AccessPolicy &) noexcept -> MessageWriter< T >
static ParamType Make(World &world, SystemLocalData &data, const AccessPolicy &)
typename ParamType::allocator_type Allocator
static constexpr void RegisterAccess(AccessPolicyBuilder &builder)
static auto Make(World &world, SystemLocalData &, const AccessPolicy &) noexcept -> Res< T >
static constexpr void RegisterAccess(AccessPolicyBuilder &builder)
static auto Make(World &world, SystemLocalData &, const AccessPolicy &) noexcept -> Res< const T >
static constexpr void RegisterAccess(AccessPolicyBuilder &builder)
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static constexpr WorldView Make(World &world, SystemLocalData &, const AccessPolicy &) noexcept
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static auto Make(World &, SystemLocalData &data, const AccessPolicy &) noexcept -> std::optional< Local< T > >
static auto Make(World &, SystemLocalData &data, const AccessPolicy &) noexcept -> std::optional< Local< const T > >
static constexpr void RegisterAccess(AccessPolicyBuilder &) noexcept
static auto Make(World &world, SystemLocalData &, const AccessPolicy &) noexcept -> std::optional< Res< T > >
static constexpr void RegisterAccess(AccessPolicyBuilder &builder)
static auto Make(World &world, SystemLocalData &, const AccessPolicy &) noexcept -> std::optional< Res< const T > >
static constexpr void RegisterAccess(AccessPolicyBuilder &builder)
Primary template — deliberately incomplete.
static constexpr void Apply(AccessPolicyBuilder &builder)
Helper to register query component access from a component tuple.