YOrch 1.0.0
Loading...
Searching...
No Matches
builder_node_core_ordinary.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <tuple>
4#include <utility>
5
6#include "concepts.hpp" // IWYU pragma: keep
7#include "metadata.hpp"
8#include "node_binder.hpp"
9
10namespace yorch {
11template <typename... Nodes>
12struct task_tree_builder;
13}
14
15namespace yorch::detail {
16
17template <typename Derived, typename... Nodes>
19 template <std::size_t Level, typename Task>
22 [[nodiscard]] constexpr auto node(Task&& task) const& {
25 std::tuple_cat(static_cast<const Derived&>(*this).nodes, std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
26 };
27 }
28
29 template <std::size_t Level, typename Task, typename FanoutPolicy>
33 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
34 [[nodiscard]] constexpr auto node(Task&& task, FanoutPolicy&&) const& {
37 std::tuple_cat(static_cast<const Derived&>(*this).nodes, std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
38 };
39 }
40
41 template <std::size_t Level, typename Task>
42 requires (detail::append_level_valid_v<Level, Nodes...>) &&
44 [[nodiscard]] constexpr auto node_into(Task&& task) const& {
45 using next_node_t = detail::task_tree_node_t<Level, Task>;
46 return task_tree_builder<Nodes..., next_node_t> {
47 std::tuple_cat(static_cast<const Derived&>(*this).nodes, std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
48 };
49 }
50
51 template <std::size_t Level, typename Task, typename FanoutPolicy>
52 requires (detail::append_level_valid_v<Level, Nodes...>) &&
55 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
56 [[nodiscard]] constexpr auto node_into(Task&& task, FanoutPolicy&&) const& {
58 return task_tree_builder<Nodes..., next_node_t> {
59 std::tuple_cat(static_cast<const Derived&>(*this).nodes, std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
60 };
61 }
62
63 template <std::size_t Level, typename F>
64 requires (detail::append_level_valid_v<Level, Nodes...>) &&
66 [[nodiscard]] constexpr auto node(F&& f) const& {
68 const Derived*,
69 Level,
70 std::decay_t<F>,
73 > {
74 static_cast<const Derived*>(this),
75 std::forward<F>(f),
76 {},
77 {}
78 };
79 }
80
81 template <std::size_t Level, typename F, typename FanoutPolicy>
82 requires (detail::append_level_valid_v<Level, Nodes...>) &&
85 [[nodiscard]] constexpr auto node(F&& f, FanoutPolicy&& fanout_policy) const& {
87 const Derived*,
88 Level,
89 std::decay_t<F>,
90 std::decay_t<FanoutPolicy>,
92 > {
93 static_cast<const Derived*>(this),
94 std::forward<F>(f),
95 std::forward<FanoutPolicy>(fanout_policy),
96 {}
97 };
98 }
99
100 template <std::size_t Level, typename F, typename AdapterChain>
101 requires (detail::append_level_valid_v<Level, Nodes...>) &&
104 [[nodiscard]] constexpr auto node(F&& f, AdapterChain&& adapter_specs) const& {
106 const Derived*,
107 Level,
108 std::decay_t<F>,
110 std::decay_t<AdapterChain>
111 > {
112 static_cast<const Derived*>(this),
113 std::forward<F>(f),
114 {},
115 std::forward<AdapterChain>(adapter_specs)
116 };
117 }
118
119 template <std::size_t Level, typename F, typename FanoutPolicy, typename AdapterChain>
120 requires (detail::append_level_valid_v<Level, Nodes...>) &&
124 [[nodiscard]] constexpr auto node(F&& f, FanoutPolicy&& fanout_policy, AdapterChain&& adapter_specs) const& {
126 const Derived*,
127 Level,
128 std::decay_t<F>,
129 std::decay_t<FanoutPolicy>,
130 std::decay_t<AdapterChain>
131 > {
132 static_cast<const Derived*>(this),
133 std::forward<F>(f),
134 std::forward<FanoutPolicy>(fanout_policy),
135 std::forward<AdapterChain>(adapter_specs)
136 };
137 }
138 template <std::size_t Level, typename F>
139 requires (detail::append_level_valid_v<Level, Nodes...>) &&
141 [[nodiscard]] constexpr auto node_into(F&& f) const& {
143 const Derived*,
144 Level,
145 std::decay_t<F>,
148 > {
149 static_cast<const Derived*>(this),
150 std::forward<F>(f),
151 {},
152 {}
153 };
154 }
155
156 template <std::size_t Level, typename F, typename FanoutPolicy>
157 requires (detail::append_level_valid_v<Level, Nodes...>) &&
160 [[nodiscard]] constexpr auto node_into(F&& f, FanoutPolicy&& fanout_policy) const& {
162 const Derived*,
163 Level,
164 std::decay_t<F>,
165 std::decay_t<FanoutPolicy>,
167 > {
168 static_cast<const Derived*>(this),
169 std::forward<F>(f),
170 std::forward<FanoutPolicy>(fanout_policy),
171 {}
172 };
173 }
174
175 template <std::size_t Level, typename F, typename AdapterChain>
176 requires (detail::append_level_valid_v<Level, Nodes...>) &&
179 [[nodiscard]] constexpr auto node_into(F&& f, AdapterChain&& adapter_specs) const& {
181 const Derived*,
182 Level,
183 std::decay_t<F>,
185 std::decay_t<AdapterChain>
186 > {
187 static_cast<const Derived*>(this),
188 std::forward<F>(f),
189 {},
190 std::forward<AdapterChain>(adapter_specs)
191 };
192 }
193
194 template <std::size_t Level, typename F, typename FanoutPolicy, typename AdapterChain>
195 requires (detail::append_level_valid_v<Level, Nodes...>) &&
199 [[nodiscard]] constexpr auto node_into(F&& f, FanoutPolicy&& fanout_policy, AdapterChain&& adapter_specs) const& {
201 const Derived*,
202 Level,
203 std::decay_t<F>,
204 std::decay_t<FanoutPolicy>,
205 std::decay_t<AdapterChain>
206 > {
207 static_cast<const Derived*>(this),
208 std::forward<F>(f),
209 std::forward<FanoutPolicy>(fanout_policy),
210 std::forward<AdapterChain>(adapter_specs)
211 };
212 }
213 template <std::size_t Level, typename Task>
214 requires (detail::append_level_valid_v<Level, Nodes...>) &&
216 [[nodiscard]] constexpr auto node(Task&& task) && {
217 using next_node_t = detail::task_tree_node_t<Level, Task>;
218 return task_tree_builder<Nodes..., next_node_t> {
219 std::tuple_cat(std::move(static_cast<Derived&>(*this).nodes), std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
220 };
221 }
222
223 template <std::size_t Level, typename Task, typename FanoutPolicy>
224 requires (detail::append_level_valid_v<Level, Nodes...>) &&
227 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
228 [[nodiscard]] constexpr auto node(Task&& task, FanoutPolicy&&) && {
230 return task_tree_builder<Nodes..., next_node_t> {
231 std::tuple_cat(std::move(static_cast<Derived&>(*this).nodes), std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
232 };
233 }
234
235 template <std::size_t Level, typename Task>
236 requires (detail::append_level_valid_v<Level, Nodes...>) &&
238 [[nodiscard]] constexpr auto node_into(Task&& task) && {
239 using next_node_t = detail::task_tree_node_t<Level, Task>;
240 return task_tree_builder<Nodes..., next_node_t> {
241 std::tuple_cat(std::move(static_cast<Derived&>(*this).nodes), std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
242 };
243 }
244
245 template <std::size_t Level, typename Task, typename FanoutPolicy>
246 requires (detail::append_level_valid_v<Level, Nodes...>) &&
249 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
250 [[nodiscard]] constexpr auto node_into(Task&& task, FanoutPolicy&&) && {
252 return task_tree_builder<Nodes..., next_node_t> {
253 std::tuple_cat(std::move(static_cast<Derived&>(*this).nodes), std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
254 };
255 }
256
257 template <std::size_t Level, typename F>
258 requires (detail::append_level_valid_v<Level, Nodes...>) &&
260 [[nodiscard]] constexpr auto node(F&& f) && {
262 Derived,
263 Level,
264 std::decay_t<F>,
267 > {
268 static_cast<Derived&&>(*this),
269 std::forward<F>(f),
270 {},
271 {}
272 };
273 }
274
275 template <std::size_t Level, typename F, typename FanoutPolicy>
276 requires (detail::append_level_valid_v<Level, Nodes...>) &&
279 [[nodiscard]] constexpr auto node(F&& f, FanoutPolicy&& fanout_policy) && {
281 Derived,
282 Level,
283 std::decay_t<F>,
284 std::decay_t<FanoutPolicy>,
286 > {
287 static_cast<Derived&&>(*this),
288 std::forward<F>(f),
289 std::forward<FanoutPolicy>(fanout_policy),
290 {}
291 };
292 }
293
294 template <std::size_t Level, typename F, typename AdapterChain>
295 requires (detail::append_level_valid_v<Level, Nodes...>) &&
298 [[nodiscard]] constexpr auto node(F&& f, AdapterChain&& adapter_specs) && {
300 Derived,
301 Level,
302 std::decay_t<F>,
304 std::decay_t<AdapterChain>
305 > {
306 static_cast<Derived&&>(*this),
307 std::forward<F>(f),
308 {},
309 std::forward<AdapterChain>(adapter_specs)
310 };
311 }
312
313 template <std::size_t Level, typename F, typename FanoutPolicy, typename AdapterChain>
314 requires (detail::append_level_valid_v<Level, Nodes...>) &&
318 [[nodiscard]] constexpr auto node(F&& f, FanoutPolicy&& fanout_policy, AdapterChain&& adapter_specs) && {
320 Derived,
321 Level,
322 std::decay_t<F>,
323 std::decay_t<FanoutPolicy>,
324 std::decay_t<AdapterChain>
325 > {
326 static_cast<Derived&&>(*this),
327 std::forward<F>(f),
328 std::forward<FanoutPolicy>(fanout_policy),
329 std::forward<AdapterChain>(adapter_specs)
330 };
331 }
332 template <std::size_t Level, typename F>
333 requires (detail::append_level_valid_v<Level, Nodes...>) &&
335 [[nodiscard]] constexpr auto node_into(F&& f) && {
337 Derived,
338 Level,
339 std::decay_t<F>,
342 > {
343 static_cast<Derived&&>(*this),
344 std::forward<F>(f),
345 {},
346 {}
347 };
348 }
349
350 template <std::size_t Level, typename F, typename FanoutPolicy>
351 requires (detail::append_level_valid_v<Level, Nodes...>) &&
354 [[nodiscard]] constexpr auto node_into(F&& f, FanoutPolicy&& fanout_policy) && {
356 Derived,
357 Level,
358 std::decay_t<F>,
359 std::decay_t<FanoutPolicy>,
361 > {
362 static_cast<Derived&&>(*this),
363 std::forward<F>(f),
364 std::forward<FanoutPolicy>(fanout_policy),
365 {}
366 };
367 }
368
369 template <std::size_t Level, typename F, typename AdapterChain>
370 requires (detail::append_level_valid_v<Level, Nodes...>) &&
373 [[nodiscard]] constexpr auto node_into(F&& f, AdapterChain&& adapter_specs) && {
375 Derived,
376 Level,
377 std::decay_t<F>,
379 std::decay_t<AdapterChain>
380 > {
381 static_cast<Derived&&>(*this),
382 std::forward<F>(f),
383 {},
384 std::forward<AdapterChain>(adapter_specs)
385 };
386 }
387
388 template <std::size_t Level, typename F, typename FanoutPolicy, typename AdapterChain>
389 requires (detail::append_level_valid_v<Level, Nodes...>) &&
393 [[nodiscard]] constexpr auto node_into(F&& f, FanoutPolicy&& fanout_policy, AdapterChain&& adapter_specs) && {
395 Derived,
396 Level,
397 std::decay_t<F>,
398 std::decay_t<FanoutPolicy>,
399 std::decay_t<AdapterChain>
400 > {
401 static_cast<Derived&&>(*this),
402 std::forward<F>(f),
403 std::forward<FanoutPolicy>(fanout_policy),
404 std::forward<AdapterChain>(adapter_specs)
405 };
406 }
407};
408
409} // namespace yorch::detail
constexpr bool append_level_valid_v
Definition metadata.hpp:45
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
constexpr auto task(F &&f)
Definition core.hpp:207
constexpr auto node(F &&f, AdapterChain &&adapter_specs) const &
constexpr auto node(F &&f, FanoutPolicy &&fanout_policy) const &
constexpr auto node_into(F &&f, FanoutPolicy &&fanout_policy, AdapterChain &&adapter_specs) const &
constexpr auto node_into(F &&f, FanoutPolicy &&fanout_policy, AdapterChain &&adapter_specs) &&
constexpr auto node_into(F &&f, AdapterChain &&adapter_specs) &&
constexpr auto node(F &&f, FanoutPolicy &&fanout_policy, AdapterChain &&adapter_specs) const &
constexpr auto node(F &&f, AdapterChain &&adapter_specs) &&
constexpr auto node_into(F &&f, AdapterChain &&adapter_specs) const &
constexpr auto node_into(F &&f, FanoutPolicy &&fanout_policy) &&
constexpr auto node_into(Task &&task, FanoutPolicy &&) const &
constexpr auto node_into(F &&f, FanoutPolicy &&fanout_policy) const &
constexpr auto node(Task &&task, FanoutPolicy &&) const &
constexpr auto node(F &&f, FanoutPolicy &&fanout_policy) &&
constexpr auto node(Task &&task, FanoutPolicy &&) &&
constexpr auto node(F &&f, FanoutPolicy &&fanout_policy, AdapterChain &&adapter_specs) &&
constexpr auto node_into(Task &&task, FanoutPolicy &&) &&