1 //
2 // receiver.cpp
3 // ~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2021 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 // Disable autolinking for unit tests.
12 #if !defined(BOOST_ALL_NO_LIB)
13 #define BOOST_ALL_NO_LIB 1
14 #endif // !defined(BOOST_ALL_NO_LIB)
15
16 // Test that header file is self-contained.
17 #include <boost/asio/execution/receiver.hpp>
18
19 #include <string>
20 #include <boost/system/error_code.hpp>
21 #include "../unit_test.hpp"
22
23 struct not_a_receiver
24 {
25 };
26
27 struct receiver
28 {
receiverreceiver29 receiver()
30 {
31 }
32
receiverreceiver33 receiver(const receiver&)
34 {
35 }
36
37 #if defined(BOOST_ASIO_HAS_MOVE)
receiverreceiver38 receiver(receiver&&)
39 {
40 }
41 #endif // defined(BOOST_ASIO_HAS_MOVE)
42
43 template <typename E>
set_errorreceiver44 void set_error(BOOST_ASIO_MOVE_ARG(E) e) BOOST_ASIO_NOEXCEPT
45 {
46 (void)e;
47 }
48
set_donereceiver49 void set_done() BOOST_ASIO_NOEXCEPT
50 {
51 }
52 };
53
54 namespace boost {
55 namespace asio {
56 namespace traits {
57
58 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
59
60 template <typename E>
61 struct set_error_member<receiver, E>
62 {
63 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
64 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
65 typedef void result_type;
66 };
67
68 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
69 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
70
71 template <>
72 struct set_done_member<receiver>
73 {
74 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
75 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
76 typedef void result_type;
77 };
78
79 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
80
81 } // namespace traits
82 } // namespace asio
83 } // namespace boost
84
85 struct receiver_of_0
86 {
receiver_of_0receiver_of_087 receiver_of_0()
88 {
89 }
90
receiver_of_0receiver_of_091 receiver_of_0(const receiver_of_0&)
92 {
93 }
94
95 #if defined(BOOST_ASIO_HAS_MOVE)
receiver_of_0receiver_of_096 receiver_of_0(receiver_of_0&&)
97 {
98 }
99 #endif // defined(BOOST_ASIO_HAS_MOVE)
100
101 template <typename E>
set_errorreceiver_of_0102 void set_error(BOOST_ASIO_MOVE_ARG(E) e) BOOST_ASIO_NOEXCEPT
103 {
104 (void)e;
105 }
106
set_donereceiver_of_0107 void set_done() BOOST_ASIO_NOEXCEPT
108 {
109 }
110
set_valuereceiver_of_0111 void set_value()
112 {
113 }
114 };
115
116 namespace boost {
117 namespace asio {
118 namespace traits {
119
120 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
121
122 template <typename E>
123 struct set_error_member<receiver_of_0, E>
124 {
125 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
126 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
127 typedef void result_type;
128 };
129
130 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
131 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
132
133 template <>
134 struct set_done_member<receiver_of_0>
135 {
136 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
137 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
138 typedef void result_type;
139 };
140
141 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
142 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
143
144 template <>
145 struct set_value_member<receiver_of_0, void()>
146 {
147 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
148 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
149 typedef void result_type;
150 };
151
152 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
153
154 } // namespace traits
155 } // namespace asio
156 } // namespace boost
157
158 struct receiver_of_1
159 {
receiver_of_1receiver_of_1160 receiver_of_1()
161 {
162 }
163
receiver_of_1receiver_of_1164 receiver_of_1(const receiver_of_1&)
165 {
166 }
167
168 #if defined(BOOST_ASIO_HAS_MOVE)
receiver_of_1receiver_of_1169 receiver_of_1(receiver_of_1&&)
170 {
171 }
172 #endif // defined(BOOST_ASIO_HAS_MOVE)
173
174 template <typename E>
set_errorreceiver_of_1175 void set_error(BOOST_ASIO_MOVE_ARG(E) e) BOOST_ASIO_NOEXCEPT
176 {
177 (void)e;
178 }
179
set_donereceiver_of_1180 void set_done() BOOST_ASIO_NOEXCEPT
181 {
182 }
183
set_valuereceiver_of_1184 void set_value(int) BOOST_ASIO_NOEXCEPT
185 {
186 }
187 };
188
189 namespace boost {
190 namespace asio {
191 namespace traits {
192
193 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
194
195 template <typename E>
196 struct set_error_member<receiver_of_1, E>
197 {
198 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
199 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
200 typedef void result_type;
201 };
202
203 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
204 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
205
206 template <>
207 struct set_done_member<receiver_of_1>
208 {
209 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
210 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
211 typedef void result_type;
212 };
213
214 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
215 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
216
217 template <>
218 struct set_value_member<receiver_of_1, void(int)>
219 {
220 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
221 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
222 typedef void result_type;
223 };
224
225 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
226
227 } // namespace traits
228 } // namespace asio
229 } // namespace boost
230
231 struct receiver_of_2
232 {
receiver_of_2receiver_of_2233 receiver_of_2()
234 {
235 }
236
receiver_of_2receiver_of_2237 receiver_of_2(const receiver_of_2&)
238 {
239 }
240
241 #if defined(BOOST_ASIO_HAS_MOVE)
receiver_of_2receiver_of_2242 receiver_of_2(receiver_of_2&&)
243 {
244 }
245 #endif // defined(BOOST_ASIO_HAS_MOVE)
246
247 template <typename E>
set_errorreceiver_of_2248 void set_error(BOOST_ASIO_MOVE_ARG(E) e) BOOST_ASIO_NOEXCEPT
249 {
250 (void)e;
251 }
252
set_donereceiver_of_2253 void set_done() BOOST_ASIO_NOEXCEPT
254 {
255 }
256
set_valuereceiver_of_2257 void set_value(int, std::string)
258 {
259 }
260 };
261
262 namespace boost {
263 namespace asio {
264 namespace traits {
265
266 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
267
268 template <typename E>
269 struct set_error_member<receiver_of_2, E>
270 {
271 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
272 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
273 typedef void result_type;
274 };
275
276 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
277 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
278
279 template <>
280 struct set_done_member<receiver_of_2>
281 {
282 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
283 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
284 typedef void result_type;
285 };
286
287 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
288 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
289
290 template <>
291 struct set_value_member<receiver_of_2, void(int, std::string)>
292 {
293 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
294 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
295 typedef void result_type;
296 };
297
298 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
299
300 } // namespace traits
301 } // namespace asio
302 } // namespace boost
303
is_receiver_test()304 void is_receiver_test()
305 {
306 BOOST_ASIO_CHECK((
307 !boost::asio::execution::is_receiver<
308 void,
309 boost::system::error_code
310 >::value));
311
312 BOOST_ASIO_CHECK((
313 !boost::asio::execution::is_receiver<
314 not_a_receiver,
315 boost::system::error_code
316 >::value));
317
318 BOOST_ASIO_CHECK((
319 boost::asio::execution::is_receiver<
320 receiver,
321 boost::system::error_code
322 >::value));
323
324 BOOST_ASIO_CHECK((
325 boost::asio::execution::is_receiver<
326 receiver_of_0,
327 boost::system::error_code
328 >::value));
329
330 BOOST_ASIO_CHECK((
331 boost::asio::execution::is_receiver<
332 receiver_of_1,
333 boost::system::error_code
334 >::value));
335
336 BOOST_ASIO_CHECK((
337 boost::asio::execution::is_receiver<
338 receiver_of_2,
339 boost::system::error_code
340 >::value));
341 }
342
is_receiver_of_test()343 void is_receiver_of_test()
344 {
345 BOOST_ASIO_CHECK((
346 !boost::asio::execution::is_receiver_of<
347 void
348 >::value));
349
350 BOOST_ASIO_CHECK((
351 !boost::asio::execution::is_receiver_of<
352 void,
353 int
354 >::value));
355
356 BOOST_ASIO_CHECK((
357 !boost::asio::execution::is_receiver_of<
358 not_a_receiver
359 >::value));
360
361 BOOST_ASIO_CHECK((
362 !boost::asio::execution::is_receiver_of<
363 not_a_receiver,
364 int
365 >::value));
366
367 BOOST_ASIO_CHECK((
368 !boost::asio::execution::is_receiver_of<
369 not_a_receiver,
370 int,
371 std::string
372 >::value));
373
374 BOOST_ASIO_CHECK((
375 !boost::asio::execution::is_receiver_of<
376 receiver
377 >::value));
378
379 BOOST_ASIO_CHECK((
380 !boost::asio::execution::is_receiver_of<
381 receiver,
382 int
383 >::value));
384
385 BOOST_ASIO_CHECK((
386 !boost::asio::execution::is_receiver_of<
387 receiver,
388 int,
389 std::string
390 >::value));
391
392 BOOST_ASIO_CHECK((
393 boost::asio::execution::is_receiver_of<
394 receiver_of_0
395 >::value));
396
397 BOOST_ASIO_CHECK((
398 !boost::asio::execution::is_receiver_of<
399 receiver_of_0,
400 int
401 >::value));
402
403 BOOST_ASIO_CHECK((
404 !boost::asio::execution::is_receiver_of<
405 receiver_of_0,
406 int,
407 std::string
408 >::value));
409
410 BOOST_ASIO_CHECK((
411 !boost::asio::execution::is_receiver_of<
412 receiver_of_1
413 >::value));
414
415 BOOST_ASIO_CHECK((
416 boost::asio::execution::is_receiver_of<
417 receiver_of_1,
418 int
419 >::value));
420
421 BOOST_ASIO_CHECK((
422 !boost::asio::execution::is_receiver_of<
423 receiver_of_1,
424 int,
425 std::string
426 >::value));
427
428 BOOST_ASIO_CHECK((
429 !boost::asio::execution::is_receiver_of<
430 receiver_of_2
431 >::value));
432
433 BOOST_ASIO_CHECK((
434 !boost::asio::execution::is_receiver_of<
435 receiver_of_2,
436 int
437 >::value));
438
439 BOOST_ASIO_CHECK((
440 boost::asio::execution::is_receiver_of<
441 receiver_of_2,
442 int,
443 std::string
444 >::value));
445 }
446
is_nothrow_receiver_of_test()447 void is_nothrow_receiver_of_test()
448 {
449 BOOST_ASIO_CHECK((
450 !boost::asio::execution::is_nothrow_receiver_of<
451 void
452 >::value));
453
454 BOOST_ASIO_CHECK((
455 !boost::asio::execution::is_nothrow_receiver_of<
456 void,
457 int
458 >::value));
459
460 BOOST_ASIO_CHECK((
461 !boost::asio::execution::is_nothrow_receiver_of<
462 not_a_receiver
463 >::value));
464
465 BOOST_ASIO_CHECK((
466 !boost::asio::execution::is_nothrow_receiver_of<
467 not_a_receiver,
468 int
469 >::value));
470
471 BOOST_ASIO_CHECK((
472 !boost::asio::execution::is_nothrow_receiver_of<
473 not_a_receiver,
474 int,
475 std::string
476 >::value));
477
478 BOOST_ASIO_CHECK((
479 !boost::asio::execution::is_nothrow_receiver_of<
480 receiver
481 >::value));
482
483 BOOST_ASIO_CHECK((
484 !boost::asio::execution::is_nothrow_receiver_of<
485 receiver,
486 int
487 >::value));
488
489 BOOST_ASIO_CHECK((
490 !boost::asio::execution::is_nothrow_receiver_of<
491 receiver,
492 int,
493 std::string
494 >::value));
495
496 BOOST_ASIO_CHECK((
497 !boost::asio::execution::is_nothrow_receiver_of<
498 receiver_of_0
499 >::value));
500
501 BOOST_ASIO_CHECK((
502 !boost::asio::execution::is_nothrow_receiver_of<
503 receiver_of_0,
504 int
505 >::value));
506
507 BOOST_ASIO_CHECK((
508 !boost::asio::execution::is_nothrow_receiver_of<
509 receiver_of_0,
510 int,
511 std::string
512 >::value));
513
514 BOOST_ASIO_CHECK((
515 !boost::asio::execution::is_nothrow_receiver_of<
516 receiver_of_1
517 >::value));
518
519 BOOST_ASIO_CHECK((
520 boost::asio::execution::is_nothrow_receiver_of<
521 receiver_of_1,
522 int
523 >::value));
524
525 BOOST_ASIO_CHECK((
526 !boost::asio::execution::is_nothrow_receiver_of<
527 receiver_of_1,
528 int,
529 std::string
530 >::value));
531
532 BOOST_ASIO_CHECK((
533 !boost::asio::execution::is_nothrow_receiver_of<
534 receiver_of_2
535 >::value));
536
537 BOOST_ASIO_CHECK((
538 !boost::asio::execution::is_nothrow_receiver_of<
539 receiver_of_2,
540 int
541 >::value));
542
543 BOOST_ASIO_CHECK((
544 !boost::asio::execution::is_nothrow_receiver_of<
545 receiver_of_2,
546 int,
547 std::string
548 >::value));
549 }
550
551 BOOST_ASIO_TEST_SUITE
552 (
553 "receiver",
554 BOOST_ASIO_TEST_CASE(is_receiver_test)
555 BOOST_ASIO_TEST_CASE(is_receiver_of_test)
556 BOOST_ASIO_TEST_CASE(is_nothrow_receiver_of_test)
557 )
558