Clementine
receiver.hpp
1 //
2 // execution/receiver.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 //
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 //
10 
11 #ifndef ASIO_EXECUTION_RECEIVER_HPP
12 #define ASIO_EXECUTION_RECEIVER_HPP
13 
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15 # pragma once
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17 
18 #include "asio/detail/config.hpp"
19 #include "asio/detail/type_traits.hpp"
20 #include "asio/detail/variadic_templates.hpp"
21 #include "asio/execution/set_done.hpp"
22 #include "asio/execution/set_error.hpp"
23 #include "asio/execution/set_value.hpp"
24 
25 #if defined(ASIO_HAS_STD_EXCEPTION_PTR)
26 # include <exception>
27 #else // defined(ASIO_HAS_STD_EXCEPTION_PTR)
28 # include "asio/error_code.hpp"
29 #endif // defined(ASIO_HAS_STD_EXCEPTION_PTR)
30 
31 #if defined(ASIO_HAS_DEDUCED_SET_DONE_FREE_TRAIT) \
32  && defined(ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT) \
33  && defined(ASIO_HAS_DEDUCED_SET_ERROR_FREE_TRAIT) \
34  && defined(ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT) \
35  && defined(ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT) \
36  && defined(ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT) \
37  && defined(ASIO_HAS_DEDUCED_RECEIVER_OF_FREE_TRAIT) \
38  && defined(ASIO_HAS_DEDUCED_RECEIVER_OF_MEMBER_TRAIT)
39 # define ASIO_HAS_DEDUCED_EXECUTION_IS_RECEIVER_TRAIT 1
40 #endif // defined(ASIO_HAS_DEDUCED_SET_DONE_FREE_TRAIT)
41  // && defined(ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
42  // && defined(ASIO_HAS_DEDUCED_SET_ERROR_FREE_TRAIT)
43  // && defined(ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
44  // && defined(ASIO_HAS_DEDUCED_SET_VALUE_FREE_TRAIT)
45  // && defined(ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
46  // && defined(ASIO_HAS_DEDUCED_RECEIVER_OF_FREE_TRAIT)
47  // && defined(ASIO_HAS_DEDUCED_RECEIVER_OF_MEMBER_TRAIT)
48 
49 #include "asio/detail/push_options.hpp"
50 
51 namespace asio {
52 namespace execution {
53 namespace detail {
54 
55 template <typename T, typename E>
57  integral_constant<bool,
58  is_move_constructible<typename remove_cvref<T>::type>::value
59  && is_constructible<typename remove_cvref<T>::type, T>::value
60  >
61 {
62 };
63 
64 } // namespace detail
65 
66 #if defined(ASIO_HAS_STD_EXCEPTION_PTR)
67 # define ASIO_EXECUTION_RECEIVER_ERROR_DEFAULT = std::exception_ptr
68 #else // defined(ASIO_HAS_STD_EXCEPTION_PTR)
69 # define ASIO_EXECUTION_RECEIVER_ERROR_DEFAULT \
70  = ::asio::error_code
71 #endif // defined(ASIO_HAS_STD_EXCEPTION_PTR)
72 
75 
80 template <typename T, typename E ASIO_EXECUTION_RECEIVER_ERROR_DEFAULT>
81 struct is_receiver :
82 #if defined(GENERATING_DOCUMENTATION)
83  integral_constant<bool, automatically_determined>
84 #else // defined(GENERATING_DOCUMENTATION)
85  conditional<
86  can_set_done<typename remove_cvref<T>::type>::value
87  && is_nothrow_set_done<typename remove_cvref<T>::type>::value
88  && can_set_error<typename remove_cvref<T>::type, E>::value
89  && is_nothrow_set_error<typename remove_cvref<T>::type, E>::value,
90  detail::is_receiver_base<T, E>,
91  false_type
92  >::type
93 #endif // defined(GENERATING_DOCUMENTATION)
94 {
95 };
96 
97 #if defined(ASIO_HAS_VARIABLE_TEMPLATES)
98 
99 template <typename T, typename E ASIO_EXECUTION_RECEIVER_ERROR_DEFAULT>
100 ASIO_CONSTEXPR const bool is_receiver_v = is_receiver<T, E>::value;
101 
102 #endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
103 
104 #if defined(ASIO_HAS_CONCEPTS)
105 
106 template <typename T, typename E ASIO_EXECUTION_RECEIVER_ERROR_DEFAULT>
107 ASIO_CONCEPT receiver = is_receiver<T, E>::value;
108 
109 #define ASIO_EXECUTION_RECEIVER ::asio::execution::receiver
110 
111 #else // defined(ASIO_HAS_CONCEPTS)
112 
113 #define ASIO_EXECUTION_RECEIVER typename
114 
115 #endif // defined(ASIO_HAS_CONCEPTS)
116 
117 #if defined(ASIO_HAS_VARIADIC_TEMPLATES) \
118  || defined(GENERATING_DOCUMENTATION)
119 
122 
127 template <typename T, typename... Vs>
128 struct is_receiver_of :
129 #if defined(GENERATING_DOCUMENTATION)
130  integral_constant<bool, automatically_determined>
131 #else // defined(GENERATING_DOCUMENTATION)
132  conditional<
133  is_receiver<T>::value,
134  can_set_value<typename remove_cvref<T>::type, Vs...>,
135  false_type
136  >::type
137 #endif // defined(GENERATING_DOCUMENTATION)
138 {
139 };
140 
141 #if defined(ASIO_HAS_VARIABLE_TEMPLATES)
142 
143 template <typename T, typename... Vs>
144 ASIO_CONSTEXPR const bool is_receiver_of_v =
145  is_receiver_of<T, Vs...>::value;
146 
147 #endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
148 
149 #if defined(ASIO_HAS_CONCEPTS)
150 
151 template <typename T, typename... Vs>
152 ASIO_CONCEPT receiver_of = is_receiver_of<T, Vs...>::value;
153 
154 #define ASIO_EXECUTION_RECEIVER_OF_0 \
155  ::asio::execution::receiver_of
156 
157 #define ASIO_EXECUTION_RECEIVER_OF_1(v) \
158  ::asio::execution::receiver_of<v>
159 
160 #else // defined(ASIO_HAS_CONCEPTS)
161 
162 #define ASIO_EXECUTION_RECEIVER_OF_0 typename
163 #define ASIO_EXECUTION_RECEIVER_OF_1(v) typename
164 
165 #endif // defined(ASIO_HAS_CONCEPTS)
166 
167 #else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
168  // || defined(GENERATING_DOCUMENTATION)
169 
170 template <typename T, typename = void,
171  typename = void, typename = void, typename = void, typename = void,
172  typename = void, typename = void, typename = void, typename = void>
174 
175 template <typename T>
176 struct is_receiver_of<T> :
177  conditional<
178  is_receiver<T>::value,
179  can_set_value<typename remove_cvref<T>::type>,
180  false_type
181  >::type
182 {
183 };
184 
185 #define ASIO_PRIVATE_RECEIVER_OF_TRAITS_DEF(n) \
186  template <typename T, ASIO_VARIADIC_TPARAMS(n)> \
187  struct is_receiver_of<T, ASIO_VARIADIC_TARGS(n)> : \
188  conditional< \
189  conditional<true, is_receiver<T>, void>::type::value, \
190  can_set_value< \
191  typename remove_cvref<T>::type, \
192  ASIO_VARIADIC_TARGS(n)>, \
193  false_type \
194  >::type \
195  { \
196  }; \
197 
198 ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_RECEIVER_OF_TRAITS_DEF)
199 #undef ASIO_PRIVATE_RECEIVER_OF_TRAITS_DEF
200 
201 #define ASIO_EXECUTION_RECEIVER_OF_0 typename
202 #define ASIO_EXECUTION_RECEIVER_OF_1(v) typename
203 
204 #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
205  // || defined(GENERATING_DOCUMENTATION)
206 
207 #if defined(ASIO_HAS_VARIADIC_TEMPLATES) \
208  || defined(GENERATING_DOCUMENTATION)
209 
213 
220 template <typename T, typename... Vs>
221 struct is_nothrow_receiver_of :
222 #if defined(GENERATING_DOCUMENTATION)
223  integral_constant<bool, automatically_determined>
224 #else // defined(GENERATING_DOCUMENTATION)
225  integral_constant<bool,
226  is_receiver_of<T, Vs...>::value
227  && is_nothrow_set_value<typename remove_cvref<T>::type, Vs...>::value
228  >
229 #endif // defined(GENERATING_DOCUMENTATION)
230 {
231 };
232 
233 #if defined(ASIO_HAS_VARIABLE_TEMPLATES)
234 
235 template <typename T, typename... Vs>
236 ASIO_CONSTEXPR const bool is_nothrow_receiver_of_v =
237  is_nothrow_receiver_of<T, Vs...>::value;
238 
239 #endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
240 
241 #else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
242  // || defined(GENERATING_DOCUMENTATION)
243 
244 template <typename T, typename = void,
245  typename = void, typename = void, typename = void, typename = void,
246  typename = void, typename = void, typename = void, typename = void>
248 
249 template <typename T>
251  integral_constant<bool,
252  is_receiver_of<T>::value
253  && is_nothrow_set_value<typename remove_cvref<T>::type>::value
254  >
255 {
256 };
257 
258 #define ASIO_PRIVATE_NOTHROW_RECEIVER_OF_TRAITS_DEF(n) \
259  template <typename T, ASIO_VARIADIC_TPARAMS(n)> \
260  struct is_nothrow_receiver_of<T, ASIO_VARIADIC_TARGS(n)> : \
261  integral_constant<bool, \
262  is_receiver_of<T, ASIO_VARIADIC_TARGS(n)>::value \
263  && is_nothrow_set_value<typename remove_cvref<T>::type, \
264  ASIO_VARIADIC_TARGS(n)>::value \
265  > \
266  { \
267  }; \
268 
269 ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_NOTHROW_RECEIVER_OF_TRAITS_DEF)
270 #undef ASIO_PRIVATE_NOTHROW_RECEIVER_OF_TRAITS_DEF
271 
272 #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
273  // || defined(GENERATING_DOCUMENTATION)
274 
275 } // namespace execution
276 } // namespace asio
277 
278 #include "asio/detail/pop_options.hpp"
279 
280 #endif // ASIO_EXECUTION_RECEIVER_HPP
The is_receiver trait detects whether a type T satisfies the execution::receiver concept.
Definition: receiver.hpp:81
Definition: receiver.hpp:173
Definition: chrono.h:284
Definition: receiver.hpp:247
Definition: handler_work.hpp:37
Definition: receiver.cpp:18
Definition: any_io_executor.hpp:28