YOrch 1.0.0
Loading...
Searching...
No Matches
core.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <type_traits>
4#include <utility>
5
6#include "../../detail/bind/tasks.hpp"
7#include "../../detail/bind/traits.hpp"
8#include "../adapters.hpp"
9
10namespace yorch {
11
12template <typename F, typename AdapterChain>
13struct task_into_binder;
14
15template <typename F, typename AdapterChain>
16struct task_forward_prev_binder;
17
18template <typename F, typename ReceiverSpec, typename AdapterChain>
19struct task_member_receiver_binder;
20
21template <typename F, typename ReceiverSpec, typename AdapterChain>
22struct task_forward_prev_member_receiver_binder;
23
24template <typename F, typename ReceiverSpec, typename AdapterChain>
25struct task_into_member_receiver_binder;
26
27template <typename F, typename AdapterChain>
30 AdapterChain adapter_specs;
31
32 template <typename... Specs>
33 requires detail::bind_signature_matches<F, Specs...>
34 constexpr auto operator()(Specs&&... specs) const& {
36 yorch::bind(func, std::forward<Specs>(specs)...),
38 }
39
40 template <typename... Specs>
41 requires detail::bind_signature_matches<F, Specs...>
42 constexpr auto operator()(Specs&&... specs) && {
44 yorch::bind(std::move(func), std::forward<Specs>(specs)...),
45 std::move(adapter_specs));
46 }
47};
48
49template <typename F, typename AdapterChain>
52 AdapterChain adapter_specs;
55
56 template <typename... Specs>
58 constexpr auto operator()(Specs&&... specs) const& {
60 yorch::bind_into<output_type>(func, std::forward<Specs>(specs)...),
62 }
63
64 template <typename... Specs>
66 constexpr auto operator()(Specs&&... specs) && {
68 yorch::bind_into<output_type>(std::move(func), std::forward<Specs>(specs)...),
69 std::move(adapter_specs));
70 }
71};
72
73template <typename F, typename AdapterChain>
76 AdapterChain adapter_specs;
77
78 template <typename... Specs>
80 constexpr auto operator()(Specs&&... specs) const& {
82
83 static_assert(!std::is_void_v<output_type>,
84 "yorch::task_forward_prev(...) requires exactly one prev-access binding");
85
87 yorch::bind_forward_prev<output_type>(func, std::forward<Specs>(specs)...),
89 }
90
91 template <typename... Specs>
93 constexpr auto operator()(Specs&&... specs) && {
95
96 static_assert(!std::is_void_v<output_type>,
97 "yorch::task_forward_prev(...) requires exactly one prev-access binding");
98
100 yorch::bind_forward_prev<output_type>(std::move(func), std::forward<Specs>(specs)...),
101 std::move(adapter_specs));
102 }
103};
104
105template <typename F, typename ReceiverSpec, typename AdapterChain>
108 ReceiverSpec receiver_spec;
109 AdapterChain adapter_specs;
110
111 template <typename... Specs>
112 requires detail::member_bound_signature_matches<F, Specs...>
113 constexpr auto operator()(Specs&&... specs) const& {
115 yorch::bind_member(func, receiver_spec, std::forward<Specs>(specs)...),
117 }
118
119 template <typename... Specs>
120 requires detail::member_bound_signature_matches<F, Specs...>
121 constexpr auto operator()(Specs&&... specs) && {
123 yorch::bind_member(std::move(func), std::move(receiver_spec), std::forward<Specs>(specs)...),
124 std::move(adapter_specs));
125 }
126};
127
128template <typename F, typename ReceiverSpec, typename AdapterChain>
131 ReceiverSpec receiver_spec;
132 AdapterChain adapter_specs;
133
134 template <typename... Specs>
135 requires detail::member_bound_signature_matches<F, Specs...>
136 constexpr auto operator()(Specs&&... specs) const& {
137 using output_type =
139 std::decay_t<ReceiverSpec>,
140 std::decay_t<Specs>...>;
141
142 static_assert(
143 !std::is_void_v<output_type>,
144 "yorch::task_forward_prev_member(...) requires exactly one prev-access binding across receiver and member-function parameters");
145
147 yorch::bind_forward_prev_member<output_type>(
148 func,
150 std::forward<Specs>(specs)...),
152 }
153
154 template <typename... Specs>
155 requires detail::member_bound_signature_matches<F, Specs...>
156 constexpr auto operator()(Specs&&... specs) && {
157 using output_type =
159 std::decay_t<ReceiverSpec>,
160 std::decay_t<Specs>...>;
161
162 static_assert(
163 !std::is_void_v<output_type>,
164 "yorch::task_forward_prev_member(...) requires exactly one prev-access binding across receiver and member-function parameters");
165
167 yorch::bind_forward_prev_member<output_type>(
168 std::move(func),
169 std::move(receiver_spec),
170 std::forward<Specs>(specs)...),
171 std::move(adapter_specs));
172 }
173};
174
175template <typename F, typename ReceiverSpec, typename AdapterChain>
178 ReceiverSpec receiver_spec;
179 AdapterChain adapter_specs;
182
183 template <typename... Specs>
185 constexpr auto operator()(Specs&&... specs) const& {
187 yorch::bind_into_member<output_type>(
188 func,
190 std::forward<Specs>(specs)...),
192 }
193
194 template <typename... Specs>
196 constexpr auto operator()(Specs&&... specs) && {
198 yorch::bind_into_member<output_type>(
199 std::move(func),
200 std::move(receiver_spec),
201 std::forward<Specs>(specs)...),
202 std::move(adapter_specs));
203 }
204};
205
206template <typename F>
207constexpr auto task(F&& f)
210 std::forward<F>(f),
211 {}
212 };
213}
214
215template <typename F, typename AdapterChain>
216constexpr auto task(F&& f, AdapterChain&& adapter_specs)
219 return task_binder<
220 std::decay_t<F>,
221 std::decay_t<AdapterChain>
222 > {
223 std::forward<F>(f),
224 std::forward<AdapterChain>(adapter_specs)
225 };
226}
227
228template <typename F, typename ReceiverSpec>
229constexpr auto task_member(F&& f, ReceiverSpec&& receiver_spec)
234 std::decay_t<F>,
235 std::decay_t<ReceiverSpec>,
237 > {
238 std::forward<F>(f),
239 std::forward<ReceiverSpec>(receiver_spec),
240 {}
241 };
242}
243
244template <typename F, typename ReceiverSpec, typename AdapterChain>
245constexpr auto task_member(F&& f, ReceiverSpec&& receiver_spec, AdapterChain&& adapter_specs)
251 std::decay_t<F>,
252 std::decay_t<ReceiverSpec>,
253 std::decay_t<AdapterChain>
254 > {
255 std::forward<F>(f),
256 std::forward<ReceiverSpec>(receiver_spec),
257 std::forward<AdapterChain>(adapter_specs)
258 };
259}
260
261template <typename F>
262constexpr auto task_into(F&& f)
265 std::forward<F>(f),
266 {}
267 };
268}
269
270template <typename F, typename AdapterChain>
271constexpr auto task_into(F&& f, AdapterChain&& adapter_specs)
274 return task_into_binder<
275 std::decay_t<F>,
276 std::decay_t<AdapterChain>
277 > {
278 std::forward<F>(f),
279 std::forward<AdapterChain>(adapter_specs)
280 };
281}
282
283template <typename F>
284constexpr auto task_forward_prev(F&& f)
287 std::forward<F>(f),
288 {}
289 };
290}
291
292template <typename F, typename AdapterChain>
293constexpr auto task_forward_prev(F&& f, AdapterChain&& adapter_specs)
297 std::decay_t<F>,
298 std::decay_t<AdapterChain>
299 > {
300 std::forward<F>(f),
301 std::forward<AdapterChain>(adapter_specs)
302 };
303}
304
305template <typename F, typename ReceiverSpec>
306constexpr auto task_forward_prev_member(F&& f, ReceiverSpec&& receiver_spec)
311 std::decay_t<F>,
312 std::decay_t<ReceiverSpec>,
314 > {
315 std::forward<F>(f),
316 std::forward<ReceiverSpec>(receiver_spec),
317 {}
318 };
319}
320
321template <typename F, typename ReceiverSpec, typename AdapterChain>
322constexpr auto task_forward_prev_member(F&& f, ReceiverSpec&& receiver_spec, AdapterChain&& adapter_specs)
328 std::decay_t<F>,
329 std::decay_t<ReceiverSpec>,
330 std::decay_t<AdapterChain>
331 > {
332 std::forward<F>(f),
333 std::forward<ReceiverSpec>(receiver_spec),
334 std::forward<AdapterChain>(adapter_specs)
335 };
336}
337
338template <typename F, typename ReceiverSpec>
339constexpr auto task_into_member(F&& f, ReceiverSpec&& receiver_spec)
344 std::decay_t<F>,
345 std::decay_t<ReceiverSpec>,
347 > {
348 std::forward<F>(f),
349 std::forward<ReceiverSpec>(receiver_spec),
350 {}
351 };
352}
353
354template <typename F, typename ReceiverSpec, typename AdapterChain>
355constexpr auto task_into_member(F&& f, ReceiverSpec&& receiver_spec, AdapterChain&& adapter_specs)
361 std::decay_t<F>,
362 std::decay_t<ReceiverSpec>,
363 std::decay_t<AdapterChain>
364 > {
365 std::forward<F>(f),
366 std::forward<ReceiverSpec>(receiver_spec),
367 std::forward<AdapterChain>(adapter_specs)
368 };
369}
370
371} // namespace yorch
typename direct_out_payload< T >::type direct_out_payload_t
Definition traits.hpp:182
typename forward_prev_unique_prev_payload< Specs... >::type forward_prev_unique_prev_payload_t
constexpr auto task_member(F &&f, ReceiverSpec &&receiver_spec)
Definition core.hpp:229
constexpr void bind_member(F &&)
constexpr auto task_forward_prev_member(F &&f, ReceiverSpec &&receiver_spec)
Definition core.hpp:306
constexpr auto bind(F &&f, Specs &&... specs)
Creates a bound_task from a callable and matching argument specs.
Definition factories.hpp:34
constexpr auto task_forward_prev(F &&f)
Definition core.hpp:284
constexpr auto apply_adapters(Task &&task, const adapter_chain<> &)
Definition adapters.hpp:121
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
constexpr auto operator()(Specs &&... specs) &&
Definition core.hpp:42
constexpr auto operator()(Specs &&... specs) const &
Definition core.hpp:34
AdapterChain adapter_specs
Definition core.hpp:30
constexpr auto operator()(Specs &&... specs) const &
Definition core.hpp:80
constexpr auto operator()(Specs &&... specs) &&
Definition core.hpp:93
constexpr auto operator()(Specs &&... specs) const &
Definition core.hpp:136
constexpr auto operator()(Specs &&... specs) &&
Definition core.hpp:156
detail::direct_out_payload_t< detail::last_arg_t< F > > output_type
Definition core.hpp:54
constexpr auto operator()(Specs &&... specs) &&
Definition core.hpp:66
constexpr auto operator()(Specs &&... specs) const &
Definition core.hpp:58
AdapterChain adapter_specs
Definition core.hpp:52
constexpr auto operator()(Specs &&... specs) &&
Definition core.hpp:196
constexpr auto operator()(Specs &&... specs) const &
Definition core.hpp:185
detail::direct_out_payload_t< detail::member_last_arg_t< F > > output_type
Definition core.hpp:181
constexpr auto operator()(Specs &&... specs) &&
Definition core.hpp:121
constexpr auto operator()(Specs &&... specs) const &
Definition core.hpp:113