YOrch 1.0.0
Loading...
Searching...
No Matches
node_binder.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <type_traits>
5#include <utility>
6
7#include "../../bind/builders.hpp"
8
9namespace yorch::detail {
10
12
13template <typename BuilderStorage, std::size_t Level, typename FanoutPolicy>
17
18protected:
19 template <typename Self>
20 [[nodiscard]] static constexpr decltype(auto) builder_ref(Self&& self) {
21 auto&& forwarded_self = std::forward<Self>(self);
22 using builder_storage_t = std::remove_cvref_t<decltype(forwarded_self.builder)>;
23
24 if constexpr (std::is_pointer_v<builder_storage_t>) {
25 return *forwarded_self.builder;
26 } else {
28 }
29 }
30
31};
32
33template <typename BuilderStorage, std::size_t Level, typename F, typename FanoutPolicy, typename AdapterChain>
34struct tree_node_binder : tree_node_binder_base<BuilderStorage, Level, FanoutPolicy> {
37
48
49private:
50 template <typename Self, typename Task>
51 static constexpr auto append_task(Self&& self, Task&& task) {
52 if constexpr (std::is_same_v<FanoutPolicy, no_fanout_policy_tag>) {
54 .template node<Level>(std::forward<Task>(task));
55 } else {
57 .template node<Level>(
58 std::forward<Task>(task),
59 forward_member<Self>(self.fanout_policy));
60 }
61 }
62
63public:
64
65 template <typename... Specs>
66 requires bind_signature_matches<F, Specs...>
67 constexpr auto operator()(Specs&&... specs) const& {
68 return this->append_task(
69 *this,
70 yorch::task(func, adapter_specs)(std::forward<Specs>(specs)...));
71 }
72
73 template <typename... Specs>
74 requires bind_signature_matches<F, Specs...>
75 constexpr auto operator()(Specs&&... specs) && {
76 return this->append_task(
77 std::move(*this),
78 yorch::task(std::move(func), std::move(adapter_specs))(std::forward<Specs>(specs)...));
79 }
80};
81
82template <typename BuilderStorage, std::size_t Level, typename F, typename FanoutPolicy, typename AdapterChain>
83struct tree_node_into_binder : tree_node_binder_base<BuilderStorage, Level, FanoutPolicy> {
86
97
98private:
99 template <typename Self, typename Task>
100 static constexpr auto append_task(Self&& self, Task&& task) {
101 if constexpr (std::is_same_v<FanoutPolicy, no_fanout_policy_tag>) {
103 .template node_into<Level>(std::forward<Task>(task));
104 } else {
106 .template node_into<Level>(
107 std::forward<Task>(task),
108 forward_member<Self>(self.fanout_policy));
109 }
110 }
111
112public:
113
114 template <typename... Specs>
115 requires inferred_bind_into_signature_matches<F, Specs...>
116 constexpr auto operator()(Specs&&... specs) const& {
117 return this->append_task(
118 *this,
119 yorch::task_into(func, adapter_specs)(std::forward<Specs>(specs)...));
120 }
121
122 template <typename... Specs>
124 constexpr auto operator()(Specs&&... specs) && {
125 return this->append_task(
126 std::move(*this),
127 yorch::task_into(std::move(func), std::move(adapter_specs))(std::forward<Specs>(specs)...));
128 }
129};
130
131template <typename BuilderStorage, std::size_t Level, typename F, typename FanoutPolicy, typename AdapterChain>
132struct tree_node_forward_prev_binder : tree_node_binder_base<BuilderStorage, Level, FanoutPolicy> {
135
146
147private:
148 template <typename Self, typename Task>
149 static constexpr auto append_task(Self&& self, Task&& task) {
150 if constexpr (std::is_same_v<FanoutPolicy, no_fanout_policy_tag>) {
152 .template node<Level>(std::forward<Task>(task));
153 } else {
155 .template node<Level>(
156 std::forward<Task>(task),
157 forward_member<Self>(self.fanout_policy));
158 }
159 }
160
161public:
162 template <typename... Specs>
163 requires inferred_forward_prev_signature_matches<F, Specs...>
164 constexpr auto operator()(Specs&&... specs) const& {
165 return append_task(
166 *this,
168 std::forward<Specs>(specs)...));
169 }
170
171 template <typename... Specs>
173 constexpr auto operator()(Specs&&... specs) && {
174 return append_task(
175 std::move(*this),
176 yorch::task_forward_prev(std::move(func), std::move(adapter_specs))(
177 std::forward<Specs>(specs)...));
178 }
179};
180
181template <typename BuilderStorage, std::size_t Level, typename F, typename ReceiverSpec, typename FanoutPolicy, typename AdapterChain>
182struct tree_node_member_receiver_binder : tree_node_binder_base<BuilderStorage, Level, FanoutPolicy> {
186
199
200private:
201 template <typename Self, typename Task>
202 static constexpr auto append_task(Self&& self, Task&& task) {
203 if constexpr (std::is_same_v<FanoutPolicy, no_fanout_policy_tag>) {
205 .template node<Level>(std::forward<Task>(task));
206 } else {
208 .template node<Level>(
209 std::forward<Task>(task),
210 forward_member<Self>(self.fanout_policy));
211 }
212 }
213
214public:
215 template <typename... Specs>
216 requires member_bound_signature_matches<F, Specs...>
217 constexpr auto operator()(Specs&&... specs) const& {
218 return append_task(
219 *this,
221 std::forward<Specs>(specs)...));
222 }
223
224 template <typename... Specs>
226 constexpr auto operator()(Specs&&... specs) && {
227 return append_task(
228 std::move(*this),
229 yorch::task_member(std::move(func), std::move(receiver_spec), std::move(adapter_specs))(
230 std::forward<Specs>(specs)...));
231 }
232};
233
234template <typename BuilderStorage, std::size_t Level, typename F, typename ReceiverSpec, typename FanoutPolicy, typename AdapterChain>
235struct tree_node_forward_prev_member_receiver_binder : tree_node_binder_base<BuilderStorage, Level, FanoutPolicy> {
239
252
253private:
254 template <typename Self, typename Task>
255 static constexpr auto append_task(Self&& self, Task&& task) {
256 if constexpr (std::is_same_v<FanoutPolicy, no_fanout_policy_tag>) {
258 .template node<Level>(std::forward<Task>(task));
259 } else {
261 .template node<Level>(
262 std::forward<Task>(task),
263 forward_member<Self>(self.fanout_policy));
264 }
265 }
266
267public:
268 template <typename... Specs>
269 requires member_bound_signature_matches<F, Specs...>
270 constexpr auto operator()(Specs&&... specs) const& {
271 return append_task(
272 *this,
274 std::forward<Specs>(specs)...));
275 }
276
277 template <typename... Specs>
279 constexpr auto operator()(Specs&&... specs) && {
280 return append_task(
281 std::move(*this),
283 std::move(func),
284 std::move(receiver_spec),
285 std::move(adapter_specs))(
286 std::forward<Specs>(specs)...));
287 }
288};
289
290template <typename BuilderStorage, std::size_t Level, typename F, typename ReceiverSpec, typename FanoutPolicy, typename AdapterChain>
291struct tree_node_into_member_receiver_binder : tree_node_binder_base<BuilderStorage, Level, FanoutPolicy> {
295
308
309private:
310 template <typename Self, typename Task>
311 static constexpr auto append_task(Self&& self, Task&& task) {
312 if constexpr (std::is_same_v<FanoutPolicy, no_fanout_policy_tag>) {
314 .template node_into<Level>(std::forward<Task>(task));
315 } else {
317 .template node_into<Level>(
318 std::forward<Task>(task),
319 forward_member<Self>(self.fanout_policy));
320 }
321 }
322
323public:
324 template <typename... Specs>
325 requires inferred_member_bound_into_signature_matches<F, Specs...>
326 constexpr auto operator()(Specs&&... specs) const& {
327 return append_task(
328 *this,
330 std::forward<Specs>(specs)...));
331 }
332
333 template <typename... Specs>
335 constexpr auto operator()(Specs&&... specs) && {
336 return append_task(
337 std::move(*this),
338 yorch::task_into_member(std::move(func), std::move(receiver_spec), std::move(adapter_specs))(
339 std::forward<Specs>(specs)...));
340 }
341};
342
343} // namespace yorch::detail
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
constexpr auto task_member(F &&f, ReceiverSpec &&receiver_spec)
Definition core.hpp:229
constexpr auto task_forward_prev_member(F &&f, ReceiverSpec &&receiver_spec)
Definition core.hpp:306
constexpr auto task_forward_prev(F &&f)
Definition core.hpp:284
constexpr auto task_into_member(F &&f, ReceiverSpec &&receiver_spec)
Definition core.hpp:339
constexpr auto task(F &&f)
Definition core.hpp:207
constexpr auto task_into(F &&f)
Definition core.hpp:262
static constexpr decltype(auto) builder_ref(Self &&self)
constexpr auto operator()(Specs &&... specs) &&
constexpr auto operator()(Specs &&... specs) const &
constexpr tree_node_binder(BuilderStorage builder, F func, FanoutPolicy fanout_policy, AdapterChain adapter_specs)
constexpr auto operator()(Specs &&... specs) &&
constexpr auto operator()(Specs &&... specs) const &
constexpr tree_node_forward_prev_binder(BuilderStorage builder, F func, FanoutPolicy fanout_policy, AdapterChain adapter_specs)
constexpr tree_node_forward_prev_member_receiver_binder(BuilderStorage builder, F func, ReceiverSpec receiver_spec, FanoutPolicy fanout_policy, AdapterChain adapter_specs)
constexpr auto operator()(Specs &&... specs) const &
constexpr auto operator()(Specs &&... specs) &&
constexpr tree_node_into_binder(BuilderStorage builder, F func, FanoutPolicy fanout_policy, AdapterChain adapter_specs)
constexpr auto operator()(Specs &&... specs) const &
constexpr auto operator()(Specs &&... specs) const &
constexpr tree_node_into_member_receiver_binder(BuilderStorage builder, F func, ReceiverSpec receiver_spec, FanoutPolicy fanout_policy, AdapterChain adapter_specs)
constexpr auto operator()(Specs &&... specs) &&
constexpr auto operator()(Specs &&... specs) &&
constexpr tree_node_member_receiver_binder(BuilderStorage builder, F func, ReceiverSpec receiver_spec, FanoutPolicy fanout_policy, AdapterChain adapter_specs)
constexpr auto operator()(Specs &&... specs) const &