YOrch 1.0.0
Loading...
Searching...
No Matches
adapters.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <tuple>
4#include <type_traits>
5#include <utility>
6
7#include "tasks.hpp"
8
9namespace yorch {
10
12
13template <typename Policy>
17
18template <typename Policy>
20 Policy policy;
21};
22
23template <typename... Descs>
25 std::tuple<Descs...> descriptors;
26};
27
28template <typename Policy>
29constexpr auto adapt_retry(Policy&& policy)
32 std::forward<Policy>(policy)
33 };
34}
35
36[[nodiscard]] constexpr auto adapt_catch_as_failure() noexcept {
38}
39
40template <typename Policy>
41constexpr auto adapt_catch_as_failure(Policy&& policy)
44 std::forward<Policy>(policy)
45 };
46}
47
48namespace detail {
49
50template <typename Desc>
51struct is_adapter_descriptor : std::false_type {};
52
53template <>
55
56template <typename Policy>
58
59template <typename Policy>
60struct is_adapter_descriptor<retry_adapter_desc<Policy>> : std::true_type {};
61
62template <typename Desc>
63inline constexpr bool is_adapter_descriptor_v =
65
66template <typename Desc>
69
70template <typename T>
71struct is_adapter_chain : std::false_type {};
72
73template <typename... Descs>
74struct is_adapter_chain<adapter_chain<Descs...>> : std::true_type {};
75
76template <typename T>
77inline constexpr bool is_adapter_chain_v =
79
80template <typename T>
83
84template <std::size_t I, typename Task, typename Tuple>
85constexpr auto apply_adapters_from_const(Task&& task, const Tuple& descriptors) {
86 if constexpr (I == 0) {
87 return std::forward<Task>(task);
88 } else {
89 return apply_adapter(
90 std::get<I - 1>(descriptors),
91 apply_adapters_from_const<I - 1>(std::forward<Task>(task), descriptors));
92 }
93}
94
95template <std::size_t I, typename Task, typename Tuple>
96constexpr auto apply_adapters_from_mut(Task&& task, Tuple&& descriptors) {
97 if constexpr (I == 0) {
98 return std::forward<Task>(task);
99 } else {
100 return apply_adapter(
101 std::move(std::get<I - 1>(descriptors)),
103 std::forward<Task>(task),
104 std::forward<Tuple>(descriptors)));
105 }
106}
107
108} // namespace detail
109
110template <typename... Descs>
111 requires (detail::adapter_descriptor<Descs> && ...)
112constexpr auto adapters(Descs&&... descs) {
114 std::tuple<std::decay_t<Descs>...> {
115 std::forward<Descs>(descs)...
116 }
117 };
118}
119
120template <typename Task>
121constexpr auto apply_adapters(Task&& task, const adapter_chain<>&) {
122 return std::forward<Task>(task);
123}
124
125template <typename Task, typename... Descs>
126constexpr auto apply_adapters(Task&& task, const adapter_chain<Descs...>& chain) {
127 return detail::apply_adapters_from_const<sizeof...(Descs)>(
128 std::forward<Task>(task),
129 chain.descriptors);
130}
131
132template <typename Task, typename... Descs>
133constexpr auto apply_adapters(Task&& task, adapter_chain<Descs...>&& chain) {
134 return detail::apply_adapters_from_mut<sizeof...(Descs)>(
135 std::forward<Task>(task),
136 std::move(chain).descriptors);
137}
138
139template <typename Task, typename Policy>
140constexpr auto apply_adapter(retry_adapter_desc<Policy>& desc, Task&& task) {
141 return with_retry(std::forward<Task>(task), desc.policy);
142}
143
144template <typename Task, typename Policy>
145constexpr auto apply_adapter(const retry_adapter_desc<Policy>& desc, Task&& task) {
146 return with_retry(std::forward<Task>(task), desc.policy);
147}
148
149template <typename Task, typename Policy>
150constexpr auto apply_adapter(retry_adapter_desc<Policy>&& desc, Task&& task) {
151 return with_retry(std::forward<Task>(task), std::move(desc.policy));
152}
153
154template <typename Task>
157 std::forward<Task>(task),
159}
160
161template <typename Task, typename Policy>
163 return detail::apply_catch_adapter(std::forward<Task>(task), desc.policy);
164}
165
166template <typename Task, typename Policy>
167constexpr auto apply_adapter(
169 Task&& task) {
170 return detail::apply_catch_adapter(std::forward<Task>(task), desc.policy);
171}
172
173template <typename Task, typename Policy>
174constexpr auto apply_adapter(
176 Task&& task) {
177 return detail::apply_catch_adapter(std::forward<Task>(task), std::move(desc.policy));
178}
179
180} // namespace yorch
Reports whether a retry policy exposes the minimal protocol required by with_retry(....
Definition concepts.hpp:83
constexpr auto apply_adapters_from_mut(Task &&task, Tuple &&descriptors)
Definition adapters.hpp:96
constexpr auto apply_catch_adapter(Task &&task, PolicyLike &&policy_like)
Definition adapters.hpp:20
constexpr auto apply_adapters_from_const(Task &&task, const Tuple &descriptors)
Definition adapters.hpp:85
constexpr bool is_adapter_chain_v
Definition adapters.hpp:77
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
constexpr auto with_retry(Task &&task, Policy &&policy)
Wraps a task so retry results are handled by a user retry policy.
Definition retry.hpp:186
constexpr auto adapt_catch_as_failure() noexcept
Definition adapters.hpp:36
constexpr auto value(T &&v) -> value_t< std::remove_cvref_t< T > >
Wraps a value as an owning spec.
Definition specs.hpp:179
constexpr auto apply_adapter(retry_adapter_desc< Policy > &desc, Task &&task)
Definition adapters.hpp:140
constexpr auto adapt_retry(Policy &&policy)
Definition adapters.hpp:29
constexpr auto apply_adapters(Task &&task, const adapter_chain<> &)
Definition adapters.hpp:121
constexpr auto task(F &&f)
Definition core.hpp:207
constexpr auto adapters(Descs &&... descs)
Definition adapters.hpp:112
std::tuple< Descs... > descriptors
Definition adapters.hpp:25