YOrch 1.0.0
Loading...
Searching...
No Matches
builder_node_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#include "metadata.hpp"
7
8namespace yorch::detail {
9
10template <typename Derived, typename... Nodes>
12 template <std::size_t Level, typename Task>
15 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
16 constexpr void node(Task&&) const& {
17 static_assert(
19 "yorch::task_tree.node<Level>(...) received a direct-output task; use node_into<Level>(...) instead.");
20 }
21
22 template <std::size_t Level, typename Task, typename FanoutPolicy>
26 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
27 constexpr void node(Task&&, FanoutPolicy&&) const& {
28 static_assert(
30 "yorch::task_tree.node<Level>(...) received a direct-output task; use node_into<Level>(...) instead.");
31 }
32
33 template <std::size_t Level, typename F>
36 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
37 constexpr void node(F&&) const& {
38 static_assert(
40 "yorch::task_tree.node<Level>(...) received a direct-output callable whose last parameter is yorch::direct_out<T>; use node_into<Level>(...) instead.");
41 }
42
43 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
47 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
48 constexpr void node(F&&, FanoutPolicyOrChain&&) const& {
49 static_assert(
51 "yorch::task_tree.node<Level>(...) received a direct-output callable whose last parameter is yorch::direct_out<T>; use node_into<Level>(...) instead.");
52 }
53
54 template <std::size_t Level, typename F, typename FanoutPolicy, typename AdapterChain>
59 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
60 constexpr void node(F&&, FanoutPolicy&&, AdapterChain&&) const& {
61 static_assert(
63 "yorch::task_tree.node<Level>(...) received a direct-output callable whose last parameter is yorch::direct_out<T>; use node_into<Level>(...) instead.");
64 }
65
66 template <std::size_t Level, typename Task>
69 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
70 constexpr void node_into(Task&&) const& {
71 static_assert(
73 "yorch::task_tree.node_into<Level>(...) received a non-direct-output task; use node<Level>(...) instead.");
74 }
75
76 template <std::size_t Level, typename Task, typename FanoutPolicy>
80 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
81 constexpr void node_into(Task&&, FanoutPolicy&&) const& {
82 static_assert(
84 "yorch::task_tree.node_into<Level>(...) received a non-direct-output task; use node<Level>(...) instead.");
85 }
86
87 template <std::size_t Level, typename F>
90 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
91 constexpr void node_into(F&&) const& {
92 static_assert(
94 "yorch::task_tree.node_into<Level>(...) requires a callable whose last parameter is yorch::direct_out<T>; use node<Level>(...) for ordinary tasks.");
95 }
96
97 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
101 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
102 constexpr void node_into(F&&, FanoutPolicyOrChain&&) const& {
103 static_assert(
105 "yorch::task_tree.node_into<Level>(...) requires a callable whose last parameter is yorch::direct_out<T>; use node<Level>(...) for ordinary tasks.");
106 }
107
108 template <std::size_t Level, typename F, typename FanoutPolicy, typename AdapterChain>
109 requires (detail::append_level_valid_v<Level, Nodes...>) &&
113 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
114 constexpr void node_into(F&&, FanoutPolicy&&, AdapterChain&&) const& {
115 static_assert(
117 "yorch::task_tree.node_into<Level>(...) requires a callable whose last parameter is yorch::direct_out<T>; use node<Level>(...) for ordinary tasks.");
118 }
119
120 template <std::size_t Level, typename Task>
121 requires (detail::append_level_valid_v<Level, Nodes...>) &&
123 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
124 constexpr void node_forward_prev(Task&&) const& {
125 static_assert(
127 "yorch::task_tree.node_forward_prev<Level>(...) only accepts a callable; pass prebuilt tasks directly to node<Level>(...) instead.");
128 }
129
130 template <std::size_t Level, typename Task, typename FanoutPolicyOrChain>
131 requires (detail::append_level_valid_v<Level, Nodes...>) &&
134 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
135 constexpr void node_forward_prev(Task&&, FanoutPolicyOrChain&&) const& {
136 static_assert(
138 "yorch::task_tree.node_forward_prev<Level>(...) only accepts a callable; pass prebuilt tasks directly to node<Level>(...) instead.");
139 }
140
141 template <std::size_t Level, typename F>
142 requires (detail::append_level_valid_v<Level, Nodes...>) &&
144 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
145 constexpr void node_forward_prev(F&&) const& {
146 static_assert(
148 "yorch::task_tree.node_forward_prev<Level>(...) does not accept callables with yorch::direct_out<T>; use node_into<Level>(...) for direct-output materialization.");
149 }
150
151 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
152 requires (detail::append_level_valid_v<Level, Nodes...>) &&
155 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
156 constexpr void node_forward_prev(F&&, FanoutPolicyOrChain&&) const& {
157 static_assert(
159 "yorch::task_tree.node_forward_prev<Level>(...) does not accept callables with yorch::direct_out<T>; use node_into<Level>(...) for direct-output materialization.");
160 }
161
162 template <std::size_t Level, typename F, typename FanoutPolicy, typename AdapterChain>
163 requires (detail::append_level_valid_v<Level, Nodes...>) &&
167 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
168 constexpr void node_forward_prev(F&&, FanoutPolicy&&, AdapterChain&&) const& {
169 static_assert(
171 "yorch::task_tree.node_forward_prev<Level>(...) does not accept callables with yorch::direct_out<T>; use node_into<Level>(...) for direct-output materialization.");
172 }
173
174 template <std::size_t Level, typename F>
175 requires (detail::append_level_valid_v<Level, Nodes...>) &&
177 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
178 constexpr void node_forward_prev(F&&) const& {
179 static_assert(
181 "yorch::task_tree.node_forward_prev<Level>(...) does not accept member function pointers; use node_forward_prev_member<Level>(...) instead.");
182 }
183
184 template <std::size_t Level, typename F>
185 requires (detail::append_level_valid_v<Level, Nodes...>) &&
187 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
188 constexpr void node_forward_prev(F&&) const& {
189 static_assert(
191 "yorch::task_tree.node_forward_prev<Level>(...) does not accept direct-output member functions; use node_into_member<Level>(...) instead.");
192 }
193
194 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
195 requires (detail::append_level_valid_v<Level, Nodes...>) &&
198 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
199 constexpr void node_forward_prev(F&&, FanoutPolicyOrChain&&) const& {
200 static_assert(
202 "yorch::task_tree.node_forward_prev<Level>(...) does not accept member function pointers; use node_forward_prev_member<Level>(...) instead.");
203 }
204
205 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
206 requires (detail::append_level_valid_v<Level, Nodes...>) &&
209 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
210 constexpr void node_forward_prev(F&&, FanoutPolicyOrChain&&) const& {
211 static_assert(
213 "yorch::task_tree.node_forward_prev<Level>(...) does not accept direct-output member functions; use node_into_member<Level>(...) instead.");
214 }
215
216 template <std::size_t Level, typename F>
217 requires (detail::append_level_valid_v<Level, Nodes...>) &&
219 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
220 constexpr void node_forward_prev_member(F&&) const& {
221 static_assert(
223 "yorch::task_tree.node_forward_prev_member<Level>(...) requires an explicit receiver binding as its second argument.");
224 }
225
226 template <std::size_t Level, typename F>
227 requires (detail::append_level_valid_v<Level, Nodes...>) &&
229 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
230 constexpr void node_forward_prev_member(F&&) const& {
231 static_assert(
233 "yorch::task_tree.node_forward_prev_member<Level>(...) requires an explicit receiver binding as its second argument; use node_into_member<Level>(...) for direct-output member functions.");
234 }
235
236 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
237 requires (detail::append_level_valid_v<Level, Nodes...>) &&
240 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
241 constexpr void node_forward_prev_member(F&&, FanoutPolicyOrChain&&) const& {
242 static_assert(
244 "yorch::task_tree.node_forward_prev_member<Level>(...) requires an explicit receiver binding as its second argument; pass fanout policies or adapters only after the receiver.");
245 }
246
247 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
248 requires (detail::append_level_valid_v<Level, Nodes...>) &&
251 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
252 constexpr void node_forward_prev_member(F&&, FanoutPolicyOrChain&&) const& {
253 static_assert(
255 "yorch::task_tree.node_forward_prev_member<Level>(...) requires an explicit receiver binding as its second argument; use node_into_member<Level>(...) for direct-output member functions.");
256 }
257
258 template <std::size_t Level, typename F, typename ReceiverSpec>
259 requires (detail::append_level_valid_v<Level, Nodes...>) &&
261 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
262 constexpr void node_forward_prev_member(F&&, ReceiverSpec&&) const& {
263 static_assert(
265 "yorch::task_tree.node_forward_prev_member<Level>(...) received a direct-output member function whose last parameter is yorch::direct_out<T>; use node_into_member<Level>(...) instead.");
266 }
267
268 template <std::size_t Level, typename F, typename ReceiverSpec, typename FanoutPolicyOrChain>
269 requires (detail::append_level_valid_v<Level, Nodes...>) &&
273 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
275 static_assert(
277 "yorch::task_tree.node_forward_prev_member<Level>(...) received a direct-output member function whose last parameter is yorch::direct_out<T>; use node_into_member<Level>(...) instead.");
278 }
279
280 template <std::size_t Level, typename F>
281 requires (detail::append_level_valid_v<Level, Nodes...>) &&
283 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
284 constexpr void node_member(F&&) const& {
285 static_assert(
287 "yorch::task_tree.node_member<Level>(...) requires an explicit receiver binding as its second argument.");
288 }
289
290 template <std::size_t Level, typename F>
291 requires (detail::append_level_valid_v<Level, Nodes...>) &&
293 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
294 constexpr void node_member(F&&) const& {
295 static_assert(
297 "yorch::task_tree.node_member<Level>(...) requires an explicit receiver binding as its second argument; use node_into_member<Level>(...) for direct-output member functions.");
298 }
299
300 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
301 requires (detail::append_level_valid_v<Level, Nodes...>) &&
304 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
305 constexpr void node_member(F&&, FanoutPolicyOrChain&&) const& {
306 static_assert(
308 "yorch::task_tree.node_member<Level>(...) requires an explicit receiver binding as its second argument; pass fanout policies or adapters only after the receiver.");
309 }
310
311 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
312 requires (detail::append_level_valid_v<Level, Nodes...>) &&
315 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
316 constexpr void node_member(F&&, FanoutPolicyOrChain&&) const& {
317 static_assert(
319 "yorch::task_tree.node_member<Level>(...) requires an explicit receiver binding as its second argument; use node_into_member<Level>(...) for direct-output member functions.");
320 }
321
322 template <std::size_t Level, typename F, typename ReceiverSpec>
323 requires (detail::append_level_valid_v<Level, Nodes...>) &&
325 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
326 constexpr void node_member(F&&, ReceiverSpec&&) const& {
327 static_assert(
329 "yorch::task_tree.node_member<Level>(...) received a direct-output member function whose last parameter is yorch::direct_out<T>; use node_into_member<Level>(...) instead.");
330 }
331
332 template <std::size_t Level, typename F, typename ReceiverSpec, typename FanoutPolicyOrChain>
333 requires (detail::append_level_valid_v<Level, Nodes...>) &&
337 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
339 static_assert(
341 "yorch::task_tree.node_member<Level>(...) received a direct-output member function whose last parameter is yorch::direct_out<T>; use node_into_member<Level>(...) instead.");
342 }
343
344 template <std::size_t Level, typename F>
345 requires (detail::append_level_valid_v<Level, Nodes...>) &&
347 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
348 constexpr void node_into_member(F&&) const& {
349 static_assert(
351 "yorch::task_tree.node_into_member<Level>(...) requires an explicit receiver binding as its second argument.");
352 }
353
354 template <std::size_t Level, typename F>
355 requires (detail::append_level_valid_v<Level, Nodes...>) &&
357 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
358 constexpr void node_into_member(F&&) const& {
359 static_assert(
361 "yorch::task_tree.node_into_member<Level>(...) requires an explicit receiver binding as its second argument; use node_member<Level>(...) for ordinary member functions.");
362 }
363
364 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
365 requires (detail::append_level_valid_v<Level, Nodes...>) &&
368 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
369 constexpr void node_into_member(F&&, FanoutPolicyOrChain&&) const& {
370 static_assert(
372 "yorch::task_tree.node_into_member<Level>(...) requires an explicit receiver binding as its second argument; pass fanout policies or adapters only after the receiver.");
373 }
374
375 template <std::size_t Level, typename F, typename FanoutPolicyOrChain>
376 requires (detail::append_level_valid_v<Level, Nodes...>) &&
379 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
380 constexpr void node_into_member(F&&, FanoutPolicyOrChain&&) const& {
381 static_assert(
383 "yorch::task_tree.node_into_member<Level>(...) requires an explicit receiver binding as its second argument; use node_member<Level>(...) for ordinary member functions.");
384 }
385
386 template <std::size_t Level, typename F, typename ReceiverSpec>
387 requires (detail::append_level_valid_v<Level, Nodes...>) &&
389 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
390 constexpr void node_into_member(F&&, ReceiverSpec&&) const& {
391 static_assert(
393 "yorch::task_tree.node_into_member<Level>(...) requires a member function whose last parameter is yorch::direct_out<T>; use node_member<Level>(...) for ordinary member functions.");
394 }
395
396 template <std::size_t Level, typename F, typename ReceiverSpec, typename FanoutPolicyOrChain>
397 requires (detail::append_level_valid_v<Level, Nodes...>) &&
401 // NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
403 static_assert(
405 "yorch::task_tree.node_into_member<Level>(...) requires a member function whose last parameter is yorch::direct_out<T>; use node_member<Level>(...) for ordinary member functions.");
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 void node_forward_prev(F &&, FanoutPolicy &&, AdapterChain &&) const &
constexpr void node_forward_prev(F &&, FanoutPolicyOrChain &&) const &
constexpr void node_forward_prev(F &&, FanoutPolicyOrChain &&) const &
constexpr void node_into(F &&, FanoutPolicy &&, AdapterChain &&) const &
constexpr void node_forward_prev_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void node(F &&, FanoutPolicy &&, AdapterChain &&) const &
constexpr void node_member(F &&, ReceiverSpec &&, FanoutPolicyOrChain &&) const &
constexpr void node_forward_prev_member(F &&, ReceiverSpec &&, FanoutPolicyOrChain &&) const &
constexpr void node_into(Task &&, FanoutPolicy &&) const &
constexpr void node_forward_prev(F &&, FanoutPolicyOrChain &&) const &
constexpr void node_into_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void node_forward_prev_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void node_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void node_forward_prev(Task &&) const &
constexpr void node_forward_prev(Task &&, FanoutPolicyOrChain &&) const &
constexpr void node(F &&, FanoutPolicyOrChain &&) const &
constexpr void node(Task &&, FanoutPolicy &&) const &
constexpr void node_into(F &&, FanoutPolicyOrChain &&) const &
constexpr void node_forward_prev_member(F &&, ReceiverSpec &&) const &
constexpr void node_into_member(F &&, ReceiverSpec &&) const &
constexpr void node_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void node_into_member(F &&, ReceiverSpec &&, FanoutPolicyOrChain &&) const &
constexpr void node_into_member(F &&, FanoutPolicyOrChain &&) const &
constexpr void node_member(F &&, ReceiverSpec &&) const &