YOrch 1.0.0
Loading...
Searching...
No Matches
prev_access_task_traits.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <tuple>
5#include <type_traits>
6#include <utility>
7
8#include "../../bind/tasks.hpp"
9#include "../../task_adapters/catch_as_failure.hpp"
10#include "../../task_adapters/retry.hpp"
11#include "prev_access_specs.hpp"
12
13namespace yorch::detail {
14
16 std::size_t prev_access_count = 0;
18 std::size_t borrow_prev_count = 0;
19 std::size_t borrow_prev_mut_count = 0;
20 std::size_t copy_prev_count = 0;
21 std::size_t consume_prev_count = 0;
22};
23
26 const prev_access_summary& rhs) noexcept {
27 lhs.prev_access_count += rhs.prev_access_count;
28 lhs.exclusive_prev_access_count += rhs.exclusive_prev_access_count;
29 lhs.borrow_prev_count += rhs.borrow_prev_count;
30 lhs.borrow_prev_mut_count += rhs.borrow_prev_mut_count;
31 lhs.copy_prev_count += rhs.copy_prev_count;
32 lhs.consume_prev_count += rhs.consume_prev_count;
33 return lhs;
34}
35
36template <typename Spec>
38 prev_access_summary summary {};
39
40 if constexpr (is_prev_access_spec_v<Spec>) {
41 ++summary.prev_access_count;
42 }
43
45 ++summary.exclusive_prev_access_count;
46 }
47
48 if constexpr (is_borrow_prev_spec_v<Spec>) {
49 ++summary.borrow_prev_count;
50 }
51
52 if constexpr (is_borrow_prev_mut_spec_v<Spec>) {
53 ++summary.borrow_prev_mut_count;
54 }
55
56 if constexpr (is_copy_prev_spec_v<Spec>) {
57 ++summary.copy_prev_count;
58 }
59
60 if constexpr (is_consume_prev_spec_v<Spec>) {
61 ++summary.consume_prev_count;
62 }
63
64 return summary;
65}
66
68 const prev_access_summary& summary) noexcept {
69 return summary.exclusive_prev_access_count == 0 ||
70 (summary.exclusive_prev_access_count == 1 &&
71 summary.prev_access_count == 1);
72}
73
74template <typename Task>
76
77template <typename F, typename... Specs>
79 using callable_type = std::remove_cvref_t<F>;
81 using specs_tuple = std::tuple<Specs...>;
82
83 static constexpr bool has_receiver = false;
84
85 template <std::size_t I>
87};
88
89template <typename F, typename T, typename... Specs>
91 using callable_type = std::remove_cvref_t<F>;
93 using specs_tuple = std::tuple<Specs...>;
94
95 static constexpr bool has_receiver = false;
96
97 template <std::size_t I>
99};
100
101template <typename F, typename T, typename... Specs>
103 using callable_type = std::remove_cvref_t<F>;
105 using specs_tuple = std::tuple<Specs...>;
106
107 static constexpr bool has_receiver = false;
108
109 template <std::size_t I>
111};
112
113template <typename F, typename ReceiverSpec, typename... Specs>
115 using callable_type = std::remove_cvref_t<F>;
116 using receiver_spec = std::remove_cvref_t<ReceiverSpec>;
117 using specs_tuple = std::tuple<Specs...>;
118
119 static constexpr bool has_receiver = true;
120
121 template <std::size_t I>
123};
124
125template <typename F, typename ReceiverSpec, typename T, typename... Specs>
127 using callable_type = std::remove_cvref_t<F>;
128 using receiver_spec = std::remove_cvref_t<ReceiverSpec>;
129 using specs_tuple = std::tuple<Specs...>;
130
131 static constexpr bool has_receiver = true;
132
133 template <std::size_t I>
135};
136
137template <typename F, typename ReceiverSpec, typename T, typename... Specs>
139 using callable_type = std::remove_cvref_t<F>;
140 using receiver_spec = std::remove_cvref_t<ReceiverSpec>;
141 using specs_tuple = std::tuple<Specs...>;
142
143 static constexpr bool has_receiver = true;
144
145 template <std::size_t I>
147};
148
149template <typename View, std::size_t... I>
151 std::index_sequence<I...>) {
152 using specs_tuple = typename View::specs_tuple;
153
154 if constexpr (View::has_receiver) {
157 typename View::receiver_spec,
158 typename View::callable_type>) &&
159 (((!is_prev_access_spec_v<std::tuple_element_t<I, specs_tuple>>) ||
161 std::tuple_element_t<I, specs_tuple>,
162 typename View::template arg<I>>) &&
163 ...);
164 } else {
165 return (((!is_prev_access_spec_v<std::tuple_element_t<I, specs_tuple>>) ||
167 std::tuple_element_t<I, specs_tuple>,
168 typename View::template arg<I>>) &&
169 ...);
170 }
171}
172
173template <typename View, std::size_t... I>
175 std::index_sequence<I...>) {
176 using specs_tuple = typename View::specs_tuple;
177
178 prev_access_summary summary {};
179
180 if constexpr (View::has_receiver) {
182 summary,
184 }
185
186 ((summary = merge_prev_access_summary(
187 summary,
188 summarize_prev_access_spec<std::tuple_element_t<I, specs_tuple>>())),
189 ...);
190
191 return summary;
192}
193
194template <typename Task>
196 static constexpr prev_access_summary summary {};
197 static constexpr bool valid = true;
198};
199
200template <typename Task>
203
204 static constexpr prev_access_summary summary =
206 std::make_index_sequence<
207 std::tuple_size_v<typename view::specs_tuple>> {});
208
209 static constexpr bool valid =
211 std::make_index_sequence<
212 std::tuple_size_v<typename view::specs_tuple>> {}) &&
214};
215
216template <typename F, typename... Specs>
219
220template <typename F, typename T, typename... Specs>
222 : task_prev_access_traits_from_binding_view<bound_output_task<F, T, Specs...>> {};
223
224template <typename F, typename T, typename... Specs>
226 : task_prev_access_traits_from_binding_view<bound_forward_prev_task<F, T, Specs...>> {};
227
228template <typename F, typename ReceiverSpec, typename... Specs>
231 bound_member_task<F, ReceiverSpec, Specs...>> {};
232
233template <typename F, typename ReceiverSpec, typename T, typename... Specs>
236 bound_member_forward_prev_task<F, ReceiverSpec, T, Specs...>> {};
237
238template <typename F, typename ReceiverSpec, typename T, typename... Specs>
241 bound_member_output_task<F, ReceiverSpec, T, Specs...>> {};
242
243template <typename Task>
250
251template <typename Task>
254
255template <typename Task, typename Policy>
258
259template <typename Task, typename Policy>
267
268template <typename Task>
270 : std::bool_constant<
271 task_prev_access_traits_impl<std::remove_cvref_t<Task>>::valid> {};
272
273template <typename Task>
275 : std::bool_constant<
276 task_prev_access_traits_impl<std::remove_cvref_t<Task>>::summary.prev_access_count != 0> {};
277
278template <typename Task>
280 : std::bool_constant<
281 task_prev_access_traits_impl<std::remove_cvref_t<Task>>::summary
282 .exclusive_prev_access_count != 0> {};
283
284template <typename Task>
286 : std::bool_constant<
287 task_prev_access_traits_impl<std::remove_cvref_t<Task>>::summary.consume_prev_count != 0> {};
288
289template <typename Task>
291 : std::bool_constant<
292 task_prev_access_traits_impl<std::remove_cvref_t<Task>>::summary.borrow_prev_count != 0> {};
293
294template <typename Task>
296 : std::bool_constant<
297 task_prev_access_traits_impl<std::remove_cvref_t<Task>>::summary
298 .borrow_prev_mut_count != 0> {};
299
300template <typename Task>
302 : std::bool_constant<
303 task_prev_access_traits_impl<std::remove_cvref_t<Task>>::summary.copy_prev_count != 0> {};
304
305template <typename Task>
306inline constexpr bool task_prev_access_valid_v =
308
309template <typename Task>
310inline constexpr bool task_uses_prev_access_v =
312
313template <typename Task>
316
317template <typename Task>
318inline constexpr bool task_uses_consume_prev_v =
320
321template <typename Task>
322inline constexpr bool task_uses_borrow_prev_v =
324
325template <typename Task>
326inline constexpr bool task_uses_borrow_prev_mut_v =
328
329template <typename Task>
330inline constexpr bool task_uses_copy_prev_v =
332
333} // namespace yorch::detail
constexpr bool prev_access_summary_is_locally_valid(const prev_access_summary &summary) noexcept
typename member_function_traits< std::remove_cvref_t< F > >::template arg< I > member_nth_arg_t
Definition traits.hpp:141
constexpr bool task_uses_copy_prev_v
consteval prev_access_summary summarize_prev_access_spec()
constexpr bool is_prev_access_spec_v
consteval bool task_binding_prev_access_bindings_valid_impl(std::index_sequence< I... >)
typename function_traits< std::remove_cvref_t< F > >::template arg< I > nth_arg_t
Definition traits.hpp:118
constexpr bool task_uses_prev_access_v
constexpr bool task_uses_exclusive_prev_access_v
constexpr bool member_receiver_prev_access_valid_v
constexpr bool task_uses_borrow_prev_mut_v
constexpr prev_access_summary merge_prev_access_summary(prev_access_summary lhs, const prev_access_summary &rhs) noexcept
constexpr bool prev_access_binding_valid_v
constexpr bool task_uses_borrow_prev_v
constexpr bool task_uses_consume_prev_v
consteval prev_access_summary summarize_task_binding_impl(std::index_sequence< I... >)
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
constexpr bool task_prev_access_valid_v
Bound direct-output task composed of a member function, receiver spec, and non-output parameter specs...
Definition types.hpp:255
Bound executable task composed of a member function, receiver spec, and per-parameter specs.
Definition types.hpp:213
Bound direct-output task that writes its payload into a provided slot.
Definition types.hpp:76
Bound executable task composed of a callable and per-parameter specs.
Definition types.hpp:28
Exception-catching adapter for tasks that rely on the default failure mapping.
Exception-catching adapter for tasks with a user-supplied fallback policy.
Retry adapter that re-invokes a task when it returns retry.
Definition retry.hpp:71