11 #ifndef ASIO_EXECUTION_SENDER_HPP 12 #define ASIO_EXECUTION_SENDER_HPP 14 #if defined(_MSC_VER) && (_MSC_VER >= 1200) 16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) 18 #include "asio/detail/config.hpp" 19 #include "asio/detail/type_traits.hpp" 20 #include "asio/execution/detail/as_invocable.hpp" 21 #include "asio/execution/detail/void_receiver.hpp" 22 #include "asio/execution/executor.hpp" 23 #include "asio/execution/receiver.hpp" 25 #include "asio/detail/push_options.hpp" 27 #if defined(ASIO_HAS_ALIAS_TEMPLATES) \ 28 && defined(ASIO_HAS_VARIADIC_TEMPLATES) \ 29 && defined(ASIO_HAS_DECLTYPE) \ 30 && !defined(ASIO_MSVC) || (_MSC_VER >= 1910) 31 # define ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT 1 32 #endif // defined(ASIO_HAS_ALIAS_TEMPLATES) 43 template <
typename S,
typename =
void>
46 typedef void asio_execution_sender_traits_base_is_unspecialised;
57 template <
typename S,
typename =
void,
typename =
void,
typename =
void>
62 #if defined(ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT) 66 template <
typename...>
class Tuple,
67 template <
typename...>
class Variant
69 struct has_value_types
76 template <
typename...>
class Variant
78 struct has_error_types
85 typename has_value_types<S::template value_types>::type,
86 typename has_error_types<S::template error_types>::type,
87 typename conditional<S::sends_done, void, void>::type> : true_type
94 has_sender_types<S>::value
98 template <
typename...>
class Tuple,
99 template <
typename...>
class Variant>
100 using value_types =
typename S::template value_types<Tuple, Variant>;
102 template <
template <
typename...>
class Variant>
103 using error_types =
typename S::template error_types<Variant>;
105 ASIO_STATIC_CONSTEXPR(
bool, sends_done = S::sends_done);
108 #endif // defined(ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT) 110 template <
typename S>
113 !has_sender_types<S>::value
115 as_invocable<void_receiver, S> >::value
118 #if defined(ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT) \ 119 && defined(ASIO_HAS_STD_EXCEPTION_PTR) 122 template <
typename...>
class Tuple,
123 template <
typename...>
class Variant>
124 using value_types = Variant<Tuple<>>;
126 template <
template <
typename...>
class Variant>
127 using error_types = Variant<std::exception_ptr>;
129 ASIO_STATIC_CONSTEXPR(
bool, sends_done =
true);
131 #endif // defined(ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT) 138 #if defined(GENERATING_DOCUMENTATION) 140 #else // defined(GENERATING_DOCUMENTATION) 142 #endif // defined(GENERATING_DOCUMENTATION) 145 template <
typename S>
147 #if !defined(GENERATING_DOCUMENTATION)
149 #endif // !defined(GENERATING_DOCUMENTATION) 155 template <
typename S,
typename =
void>
160 template <
typename S>
165 S>::asio_execution_sender_traits_base_is_unspecialised,
168 >::type> : false_type
182 template <
typename T>
184 #if defined(GENERATING_DOCUMENTATION) 185 integral_constant<bool, automatically_determined>
186 #else // defined(GENERATING_DOCUMENTATION) 188 detail::has_sender_traits<typename remove_cvref<T>::type>::value,
189 is_move_constructible<typename remove_cvref<T>::type>,
192 #endif // defined(GENERATING_DOCUMENTATION) 196 #if defined(ASIO_HAS_VARIABLE_TEMPLATES) 198 template <
typename T>
201 #endif // defined(ASIO_HAS_VARIABLE_TEMPLATES) 203 #if defined(ASIO_HAS_CONCEPTS) 205 template <
typename T>
208 #define ASIO_EXECUTION_SENDER ::asio::execution::sender 210 #else // defined(ASIO_HAS_CONCEPTS) 212 #define ASIO_EXECUTION_SENDER typename 214 #endif // defined(ASIO_HAS_CONCEPTS) 216 template <
typename S,
typename R>
226 template <
typename T,
typename R>
228 #if defined(GENERATING_DOCUMENTATION) 229 integral_constant<bool, automatically_determined>
230 #else // defined(GENERATING_DOCUMENTATION) 231 integral_constant<bool,
233 && is_receiver<R>::value
234 && can_connect<T, R>::value
236 #endif // defined(GENERATING_DOCUMENTATION) 240 #if defined(ASIO_HAS_VARIABLE_TEMPLATES) 242 template <
typename T,
typename R>
243 ASIO_CONSTEXPR
const bool is_sender_to_v =
246 #endif // defined(ASIO_HAS_VARIABLE_TEMPLATES) 248 #if defined(ASIO_HAS_CONCEPTS) 250 template <
typename T,
typename R>
253 #define ASIO_EXECUTION_SENDER_TO(r) \ 254 ::asio::execution::sender_to<r> 256 #else // defined(ASIO_HAS_CONCEPTS) 258 #define ASIO_EXECUTION_SENDER_TO(r) typename 260 #endif // defined(ASIO_HAS_CONCEPTS) 269 template <
typename T>
271 #if defined(GENERATING_DOCUMENTATION) 272 integral_constant<bool, automatically_determined>
273 #else // defined(GENERATING_DOCUMENTATION) 274 integral_constant<bool,
276 && detail::has_sender_types<
277 sender_traits<typename remove_cvref<T>::type> >::value
279 #endif // defined(GENERATING_DOCUMENTATION) 283 #if defined(ASIO_HAS_VARIABLE_TEMPLATES) 285 template <
typename T>
288 #endif // defined(ASIO_HAS_VARIABLE_TEMPLATES) 290 #if defined(ASIO_HAS_CONCEPTS) 292 template <
typename T>
295 #define ASIO_EXECUTION_TYPED_SENDER \ 296 ::asio::execution::typed_sender 298 #else // defined(ASIO_HAS_CONCEPTS) 300 #define ASIO_EXECUTION_TYPED_SENDER typename 302 #endif // defined(ASIO_HAS_CONCEPTS) 307 #include "asio/detail/pop_options.hpp" 309 #include "asio/execution/connect.hpp" 311 #endif // ASIO_EXECUTION_SENDER_HPP Definition: sender.hpp:58
Definition: executor.hpp:60
Traits for senders.
Definition: sender.hpp:146
The is_sender trait detects whether a type T satisfies the execution::sender concept.
Definition: sender.hpp:183
Definition: sender.hpp:41
Definition: sender.cpp:20
Definition: type_traits.hpp:97
The is_typed_sender trait detects whether a type T satisfies the execution::typed_sender concept...
Definition: sender.hpp:270
Definition: sender.hpp:156
Definition: connect.hpp:436
Definition: sender.hpp:44
Definition: handler_work.hpp:37
The is_sender_to trait detects whether a type T satisfies the execution::sender_to concept for some r...
Definition: execute.hpp:77
Definition: any_io_executor.hpp:28