YOrch 1.0.0
Loading...
Searching...
No Matches
builder_root_diagnostics.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <tuple>
4
5#include "concepts.hpp" // IWYU pragma: keep
6
7namespace yorch::detail {
8
9template <typename Derived, typename... Nodes>
11 template <typename Task>
12 requires (sizeof...(Nodes) == 0) &&
14 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
15 constexpr void root(Task&&) const& {
16 static_assert(
18 "yorch::task_tree.root(...) received a direct-output task; use root_into(...) instead.");
19 }
20
21 template <typename Task, typename FanoutPolicy>
22 requires (sizeof...(Nodes) == 0) &&
25 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
26 constexpr void root(Task&&, FanoutPolicy&&) const& {
27 static_assert(
29 "yorch::task_tree.root(...) received a direct-output task; use root_into(...) instead.");
30 }
31
32 template <typename F>
33 requires (sizeof...(Nodes) == 0) &&
35 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
36 constexpr void root(F&&) const& {
37 static_assert(
39 "yorch::task_tree.root(...) received a direct-output callable whose last parameter is yorch::direct_out<T>; use root_into(...) instead.");
40 }
41
42 template <typename F, typename FanoutPolicyOrChain>
43 requires (sizeof...(Nodes) == 0) &&
46 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
47 constexpr void root(F&&, FanoutPolicyOrChain&&) const& {
48 static_assert(
50 "yorch::task_tree.root(...) received a direct-output callable whose last parameter is yorch::direct_out<T>; use root_into(...) instead.");
51 }
52
53 template <typename F, typename FanoutPolicy, typename AdapterChain>
54 requires (sizeof...(Nodes) == 0) &&
58 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
59 constexpr void root(F&&, FanoutPolicy&&, AdapterChain&&) const& {
60 static_assert(
62 "yorch::task_tree.root(...) received a direct-output callable whose last parameter is yorch::direct_out<T>; use root_into(...) instead.");
63 }
64
65 template <typename Task>
66 requires (sizeof...(Nodes) == 0) &&
68 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
69 constexpr void root_into(Task&&) const& {
70 static_assert(
72 "yorch::task_tree.root_into(...) received a non-direct-output task; use root(...) instead.");
73 }
74
75 template <typename Task, typename FanoutPolicy>
76 requires (sizeof...(Nodes) == 0) &&
79 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
80 constexpr void root_into(Task&&, FanoutPolicy&&) const& {
81 static_assert(
83 "yorch::task_tree.root_into(...) received a non-direct-output task; use root(...) instead.");
84 }
85
86 template <typename F>
87 requires (sizeof...(Nodes) == 0) &&
89 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
90 constexpr void root_into(F&&) const& {
91 static_assert(
93 "yorch::task_tree.root_into(...) requires a callable whose last parameter is yorch::direct_out<T>; use root(...) for ordinary tasks.");
94 }
95
96 template <typename F, typename FanoutPolicyOrChain>
97 requires (sizeof...(Nodes) == 0) &&
100 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
101 constexpr void root_into(F&&, FanoutPolicyOrChain&&) const& {
102 static_assert(
104 "yorch::task_tree.root_into(...) requires a callable whose last parameter is yorch::direct_out<T>; use root(...) for ordinary tasks.");
105 }
106
107 template <typename F, typename FanoutPolicy, typename AdapterChain>
108 requires (sizeof...(Nodes) == 0) &&
112 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
113 constexpr void root_into(F&&, FanoutPolicy&&, AdapterChain&&) const& {
114 static_assert(
116 "yorch::task_tree.root_into(...) requires a callable whose last parameter is yorch::direct_out<T>; use root(...) for ordinary tasks.");
117 }
118
119 template <typename Task>
120 requires (sizeof...(Nodes) == 0) &&
122 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
123 constexpr void root_forward_prev(Task&&) const& {
124 static_assert(
126 "yorch::task_tree.root_forward_prev(...) only accepts a callable; pass prebuilt tasks directly to root/node instead.");
127 }
128
129 template <typename Task, typename FanoutPolicyOrChain>
130 requires (sizeof...(Nodes) == 0) &&
133 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
135 static_assert(
137 "yorch::task_tree.root_forward_prev(...) only accepts a callable; pass prebuilt tasks directly to root/node instead.");
138 }
139
140 template <typename F>
141 requires (sizeof...(Nodes) == 0) &&
143 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
144 constexpr void root_forward_prev(F&&) const& {
145 static_assert(
147 "yorch::task_tree.root_forward_prev(...) does not accept callables with yorch::direct_out<T>; use root_into(...) for direct-output materialization.");
148 }
149
150 template <typename F, typename FanoutPolicyOrChain>
151 requires (sizeof...(Nodes) == 0) &&
154 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
156 static_assert(
158 "yorch::task_tree.root_forward_prev(...) does not accept callables with yorch::direct_out<T>; use root_into(...) for direct-output materialization.");
159 }
160
161 template <typename F, typename FanoutPolicy, typename AdapterChain>
162 requires (sizeof...(Nodes) == 0) &&
166 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
168 static_assert(
170 "yorch::task_tree.root_forward_prev(...) does not accept callables with yorch::direct_out<T>; use root_into(...) for direct-output materialization.");
171 }
172
173 template <typename F>
174 requires (sizeof...(Nodes) == 0) &&
176 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
177 constexpr void root_forward_prev(F&&) const& {
178 static_assert(
180 "yorch::task_tree.root_forward_prev(...) does not accept member function pointers; use root_forward_prev_member(...) instead.");
181 }
182
183 template <typename F>
184 requires (sizeof...(Nodes) == 0) &&
186 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
187 constexpr void root_forward_prev(F&&) const& {
188 static_assert(
190 "yorch::task_tree.root_forward_prev(...) does not accept direct-output member functions; use root_into_member(...) instead.");
191 }
192
193 template <typename F, typename FanoutPolicyOrChain>
194 requires (sizeof...(Nodes) == 0) &&
197 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
199 static_assert(
201 "yorch::task_tree.root_forward_prev(...) does not accept member function pointers; use root_forward_prev_member(...) instead.");
202 }
203
204 template <typename F, typename FanoutPolicyOrChain>
205 requires (sizeof...(Nodes) == 0) &&
208 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
210 static_assert(
212 "yorch::task_tree.root_forward_prev(...) does not accept direct-output member functions; use root_into_member(...) instead.");
213 }
214
215 template <typename F>
216 requires (sizeof...(Nodes) == 0) &&
218 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
219 constexpr void root_forward_prev_member(F&&) const& {
220 static_assert(
222 "yorch::task_tree.root_forward_prev_member(...) requires an explicit receiver binding as its second argument.");
223 }
224
225 template <typename F>
226 requires (sizeof...(Nodes) == 0) &&
228 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
229 constexpr void root_forward_prev_member(F&&) const& {
230 static_assert(
232 "yorch::task_tree.root_forward_prev_member(...) requires an explicit receiver binding as its second argument; use root_into_member(...) for direct-output member functions.");
233 }
234
235 template <typename F, typename FanoutPolicyOrChain>
236 requires (sizeof...(Nodes) == 0) &&
239 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
241 static_assert(
243 "yorch::task_tree.root_forward_prev_member(...) requires an explicit receiver binding as its second argument; pass fanout policies or adapters only after the receiver.");
244 }
245
246 template <typename F, typename FanoutPolicyOrChain>
247 requires (sizeof...(Nodes) == 0) &&
250 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
252 static_assert(
254 "yorch::task_tree.root_forward_prev_member(...) requires an explicit receiver binding as its second argument; use root_into_member(...) for direct-output member functions.");
255 }
256
257 template <typename F, typename ReceiverSpec>
258 requires (sizeof...(Nodes) == 0) &&
260 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
262 static_assert(
264 "yorch::task_tree.root_forward_prev_member(...) received a direct-output member function whose last parameter is yorch::direct_out<T>; use root_into_member(...) instead.");
265 }
266
267 template <typename F, typename ReceiverSpec, typename FanoutPolicyOrChain>
268 requires (sizeof...(Nodes) == 0) &&
272 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
274 static_assert(
276 "yorch::task_tree.root_forward_prev_member(...) received a direct-output member function whose last parameter is yorch::direct_out<T>; use root_into_member(...) instead.");
277 }
278
279 template <typename F>
280 requires (sizeof...(Nodes) == 0) &&
282 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
283 constexpr void root_member(F&&) const& {
284 static_assert(
286 "yorch::task_tree.root_member(...) requires an explicit receiver binding as its second argument.");
287 }
288
289 template <typename F>
290 requires (sizeof...(Nodes) == 0) &&
292 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
293 constexpr void root_member(F&&) const& {
294 static_assert(
296 "yorch::task_tree.root_member(...) requires an explicit receiver binding as its second argument; use root_into_member(...) for direct-output member functions.");
297 }
298
299 template <typename F, typename FanoutPolicyOrChain>
300 requires (sizeof...(Nodes) == 0) &&
303 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
304 constexpr void root_member(F&&, FanoutPolicyOrChain&&) const& {
305 static_assert(
307 "yorch::task_tree.root_member(...) requires an explicit receiver binding as its second argument; pass fanout policies or adapters only after the receiver.");
308 }
309
310 template <typename F, typename FanoutPolicyOrChain>
311 requires (sizeof...(Nodes) == 0) &&
314 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
315 constexpr void root_member(F&&, FanoutPolicyOrChain&&) const& {
316 static_assert(
318 "yorch::task_tree.root_member(...) requires an explicit receiver binding as its second argument; use root_into_member(...) for direct-output member functions.");
319 }
320
321 template <typename F, typename ReceiverSpec>
322 requires (sizeof...(Nodes) == 0) &&
324 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
325 constexpr void root_member(F&&, ReceiverSpec&&) const& {
326 static_assert(
328 "yorch::task_tree.root_member(...) received a direct-output member function whose last parameter is yorch::direct_out<T>; use root_into_member(...) instead.");
329 }
330
331 template <typename F, typename ReceiverSpec, typename FanoutPolicyOrChain>
332 requires (sizeof...(Nodes) == 0) &&
336 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
337 constexpr void root_member(F&&, ReceiverSpec&&, FanoutPolicyOrChain&&) const& {
338 static_assert(
340 "yorch::task_tree.root_member(...) received a direct-output member function whose last parameter is yorch::direct_out<T>; use root_into_member(...) instead.");
341 }
342
343 template <typename F>
344 requires (sizeof...(Nodes) == 0) &&
346 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
347 constexpr void root_into_member(F&&) const& {
348 static_assert(
350 "yorch::task_tree.root_into_member(...) requires an explicit receiver binding as its second argument.");
351 }
352
353 template <typename F>
354 requires (sizeof...(Nodes) == 0) &&
356 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
357 constexpr void root_into_member(F&&) const& {
358 static_assert(
360 "yorch::task_tree.root_into_member(...) requires an explicit receiver binding as its second argument; use root_member(...) for ordinary member functions.");
361 }
362
363 template <typename F, typename FanoutPolicyOrChain>
364 requires (sizeof...(Nodes) == 0) &&
367 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
369 static_assert(
371 "yorch::task_tree.root_into_member(...) requires an explicit receiver binding as its second argument; pass fanout policies or adapters only after the receiver.");
372 }
373
374 template <typename F, typename FanoutPolicyOrChain>
375 requires (sizeof...(Nodes) == 0) &&
378 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
380 static_assert(
382 "yorch::task_tree.root_into_member(...) requires an explicit receiver binding as its second argument; use root_member(...) for ordinary member functions.");
383 }
384
385 template <typename F, typename ReceiverSpec>
386 requires (sizeof...(Nodes) == 0) &&
388 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
389 constexpr void root_into_member(F&&, ReceiverSpec&&) const& {
390 static_assert(
392 "yorch::task_tree.root_into_member(...) requires a member function whose last parameter is yorch::direct_out<T>; use root_member(...) for ordinary member functions.");
393 }
394
395 template <typename F, typename ReceiverSpec, typename FanoutPolicyOrChain>
396 requires (sizeof...(Nodes) == 0) &&
400 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
401 constexpr void root_into_member(F&&, ReceiverSpec&&, FanoutPolicyOrChain&&) const& {
402 static_assert(
404 "yorch::task_tree.root_into_member(...) requires a member function whose last parameter is yorch::direct_out<T>; use root_member(...) for ordinary member functions.");
405 }
406};
407
408} // namespace yorch::detail
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
constexpr void root_into(F &&, FanoutPolicyOrChain &&) const &
constexpr void root_forward_prev(F &&, FanoutPolicy &&, AdapterChain &&) const &
constexpr void root_into_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void root_into_member(F &&, ReceiverSpec &&) const &
constexpr void root_forward_prev(F &&, FanoutPolicyOrChain &&) const &
constexpr void root_into_member(F &&, ReceiverSpec &&, FanoutPolicyOrChain &&) const &
constexpr void root_forward_prev(F &&, FanoutPolicyOrChain &&) const &
constexpr void root_forward_prev(F &&, FanoutPolicyOrChain &&) const &
constexpr void root_forward_prev(Task &&) const &
constexpr void root_forward_prev_member(F &&, ReceiverSpec &&, FanoutPolicyOrChain &&) const &
constexpr void root_forward_prev_member(F &&, ReceiverSpec &&) const &
constexpr void root_into(Task &&, FanoutPolicy &&) const &
constexpr void root(Task &&, FanoutPolicy &&) const &
constexpr void root(F &&, FanoutPolicy &&, AdapterChain &&) const &
constexpr void root_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void root_member(F &&, ReceiverSpec &&, FanoutPolicyOrChain &&) const &
constexpr void root_forward_prev_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void root_into(F &&, FanoutPolicy &&, AdapterChain &&) const &
constexpr void root(F &&, FanoutPolicyOrChain &&) const &
constexpr void root_member(F &&, ReceiverSpec &&) const &
constexpr void root_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void root_forward_prev(Task &&, FanoutPolicyOrChain &&) const &
constexpr void root_forward_prev_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void root_into_member(F &&, FanoutPolicyOrChain &&) const &