5 // Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
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)
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)
16 // Test that header file is self-contained.
17 #include <boost/asio/execution/submit.hpp>
19 #include <boost/system/error_code.hpp>
20 #include "../unit_test.hpp"
22 namespace exec
= boost::asio::execution
;
24 static int call_count
= 0;
26 struct operation_state
28 void start() BOOST_ASIO_NOEXCEPT
37 #if !defined(BOOST_ASIO_HAS_DEDUCED_START_MEMBER_TRAIT)
40 struct start_member
<operation_state
>
42 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
43 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
44 typedef void result_type
;
47 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_START_MEMBER_TRAIT)
57 struct no_submit_2
: exec::sender_base
64 void submit(BOOST_ASIO_MOVE_ARG(R
) r
)
70 #if !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_MEMBER_TRAIT)
77 struct submit_member
<no_submit_3
, R
>
79 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
80 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
81 typedef void result_type
;
88 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_MEMBER_TRAIT)
90 struct const_member_submit
: exec::sender_base
97 operation_state
connect(BOOST_ASIO_MOVE_ARG(R
) r
) const
100 return operation_state();
103 template <typename R
>
104 void submit(BOOST_ASIO_MOVE_ARG(R
) r
) const
115 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
117 template <typename R
>
118 struct connect_member
<const const_member_submit
, R
>
120 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
121 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
122 typedef operation_state result_type
;
125 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
127 #if !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_MEMBER_TRAIT)
129 template <typename R
>
130 struct submit_member
<const const_member_submit
, R
>
132 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
133 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
134 typedef void result_type
;
137 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_MEMBER_TRAIT)
139 } // namespace traits
143 struct free_submit_const_receiver
: exec::sender_base
145 free_submit_const_receiver()
149 template <typename R
>
150 friend operation_state
connect(
151 const free_submit_const_receiver
&, BOOST_ASIO_MOVE_ARG(R
) r
)
154 return operation_state();
157 template <typename R
>
159 const free_submit_const_receiver
&, BOOST_ASIO_MOVE_ARG(R
) r
)
170 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_FREE_TRAIT)
172 template <typename R
>
173 struct connect_free
<const free_submit_const_receiver
, R
>
175 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
176 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
177 typedef operation_state result_type
;
180 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_FREE_TRAIT)
182 #if !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_FREE_TRAIT)
184 template <typename R
>
185 struct submit_free
<const free_submit_const_receiver
, R
>
187 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
188 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
189 typedef void result_type
;
192 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_FREE_TRAIT)
194 } // namespace traits
198 struct non_const_member_submit
: exec::sender_base
200 non_const_member_submit()
204 template <typename R
>
205 operation_state
connect(BOOST_ASIO_MOVE_ARG(R
) r
)
208 return operation_state();
211 template <typename R
>
212 void submit(BOOST_ASIO_MOVE_ARG(R
) r
)
223 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
225 template <typename R
>
226 struct connect_member
<non_const_member_submit
, R
>
228 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
229 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
230 typedef operation_state result_type
;
233 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
235 #if !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_MEMBER_TRAIT)
237 template <typename R
>
238 struct submit_member
<non_const_member_submit
, R
>
240 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
241 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
242 typedef void result_type
;
245 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_MEMBER_TRAIT)
247 } // namespace traits
251 struct free_submit_non_const_receiver
: exec::sender_base
253 free_submit_non_const_receiver()
257 template <typename R
>
258 friend operation_state
connect(
259 free_submit_non_const_receiver
&, BOOST_ASIO_MOVE_ARG(R
) r
)
262 return operation_state();
265 template <typename R
>
267 free_submit_non_const_receiver
&, BOOST_ASIO_MOVE_ARG(R
) r
)
278 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_FREE_TRAIT)
280 template <typename R
>
281 struct connect_free
<free_submit_non_const_receiver
, R
>
283 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
284 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
285 typedef operation_state result_type
;
288 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_FREE_TRAIT)
290 #if !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_FREE_TRAIT)
292 template <typename R
>
293 struct submit_free
<free_submit_non_const_receiver
, R
>
295 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
296 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
297 typedef void result_type
;
300 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_FREE_TRAIT)
302 } // namespace traits
312 receiver(const receiver
&)
316 #if defined(BOOST_ASIO_HAS_MOVE)
317 receiver(receiver
&&) BOOST_ASIO_NOEXCEPT
320 #endif // defined(BOOST_ASIO_HAS_MOVE)
322 template <typename E
>
323 void set_error(BOOST_ASIO_MOVE_ARG(E
) e
) BOOST_ASIO_NOEXCEPT
328 void set_done() BOOST_ASIO_NOEXCEPT
337 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
339 template <typename E
>
340 struct set_error_member
<receiver
, E
>
342 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
343 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
344 typedef void result_type
;
347 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
348 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
351 struct set_done_member
<receiver
>
353 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
354 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
355 typedef void result_type
;
358 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
360 } // namespace traits
370 executor(const executor
&) BOOST_ASIO_NOEXCEPT
374 #if defined(BOOST_ASIO_HAS_MOVE)
375 executor(executor
&&) BOOST_ASIO_NOEXCEPT
378 #endif // defined(BOOST_ASIO_HAS_MOVE)
380 template <typename F
>
381 void execute(BOOST_ASIO_MOVE_ARG(F
) f
) const BOOST_ASIO_NOEXCEPT
387 bool operator==(const executor
&) const BOOST_ASIO_NOEXCEPT
392 bool operator!=(const executor
&) const BOOST_ASIO_NOEXCEPT
402 #if !defined(BOOST_ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
404 template <typename F
>
405 struct execute_member
<executor
, F
>
407 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
408 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
409 typedef void result_type
;
412 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
413 #if !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
416 struct equality_comparable
<executor
>
418 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
419 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
422 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
424 } // namespace traits
428 void test_can_submit()
430 BOOST_ASIO_CONSTEXPR
bool b1
= exec::can_submit
<
431 no_submit_1
&, receiver
>::value
;
432 BOOST_ASIO_CHECK(b1
== false);
434 BOOST_ASIO_CONSTEXPR
bool b2
= exec::can_submit
<
435 const no_submit_1
&, receiver
>::value
;
436 BOOST_ASIO_CHECK(b2
== false);
438 BOOST_ASIO_CONSTEXPR
bool b3
= exec::can_submit
<
439 no_submit_2
&, receiver
>::value
;
440 BOOST_ASIO_CHECK(b3
== false);
442 BOOST_ASIO_CONSTEXPR
bool b4
= exec::can_submit
<
443 const no_submit_2
&, receiver
>::value
;
444 BOOST_ASIO_CHECK(b4
== false);
446 BOOST_ASIO_CONSTEXPR
bool b5
= exec::can_submit
<
447 no_submit_3
&, receiver
>::value
;
448 BOOST_ASIO_CHECK(b5
== false);
450 BOOST_ASIO_CONSTEXPR
bool b6
= exec::can_submit
<
451 const no_submit_3
&, receiver
>::value
;
452 BOOST_ASIO_CHECK(b6
== false);
454 BOOST_ASIO_CONSTEXPR
bool b7
= exec::can_submit
<
455 const_member_submit
&, receiver
>::value
;
456 BOOST_ASIO_CHECK(b7
== true);
458 BOOST_ASIO_CONSTEXPR
bool b8
= exec::can_submit
<
459 const const_member_submit
&, receiver
>::value
;
460 BOOST_ASIO_CHECK(b8
== true);
462 BOOST_ASIO_CONSTEXPR
bool b9
= exec::can_submit
<
463 free_submit_const_receiver
&, receiver
>::value
;
464 BOOST_ASIO_CHECK(b9
== true);
466 BOOST_ASIO_CONSTEXPR
bool b10
= exec::can_submit
<
467 const free_submit_const_receiver
&, receiver
>::value
;
468 BOOST_ASIO_CHECK(b10
== true);
470 BOOST_ASIO_CONSTEXPR
bool b11
= exec::can_submit
<
471 non_const_member_submit
&, receiver
>::value
;
472 BOOST_ASIO_CHECK(b11
== true);
474 BOOST_ASIO_CONSTEXPR
bool b12
= exec::can_submit
<
475 const non_const_member_submit
&, receiver
>::value
;
476 BOOST_ASIO_CHECK(b12
== false);
478 BOOST_ASIO_CONSTEXPR
bool b13
= exec::can_submit
<
479 free_submit_non_const_receiver
&, receiver
>::value
;
480 BOOST_ASIO_CHECK(b13
== true);
482 BOOST_ASIO_CONSTEXPR
bool b14
= exec::can_submit
<
483 const free_submit_non_const_receiver
&, receiver
>::value
;
484 BOOST_ASIO_CHECK(b14
== false);
486 BOOST_ASIO_CONSTEXPR
bool b15
= exec::can_submit
<
487 executor
&, receiver
>::value
;
488 BOOST_ASIO_CHECK(b15
== true);
490 BOOST_ASIO_CONSTEXPR
bool b16
= exec::can_submit
<
491 const executor
&, receiver
>::value
;
492 BOOST_ASIO_CHECK(b16
== true);
495 void increment(int* count
)
505 const_member_submit s1
;
507 BOOST_ASIO_CHECK(call_count
== 1);
510 const const_member_submit s2
;
512 BOOST_ASIO_CHECK(call_count
== 1);
515 exec::submit(const_member_submit(), r
);
516 BOOST_ASIO_CHECK(call_count
== 1);
519 free_submit_const_receiver s3
;
521 BOOST_ASIO_CHECK(call_count
== 1);
524 const free_submit_const_receiver s4
;
526 BOOST_ASIO_CHECK(call_count
== 1);
529 exec::submit(free_submit_const_receiver(), r
);
530 BOOST_ASIO_CHECK(call_count
== 1);
533 non_const_member_submit s5
;
535 BOOST_ASIO_CHECK(call_count
== 1);
538 free_submit_non_const_receiver s6
;
540 BOOST_ASIO_CHECK(call_count
== 1);
545 BOOST_ASIO_CHECK(call_count
== 1);
550 BOOST_ASIO_CHECK(call_count
== 1);
553 exec::submit(executor(), r
);
554 BOOST_ASIO_CHECK(call_count
== 1);
557 BOOST_ASIO_TEST_SUITE
560 BOOST_ASIO_TEST_CASE(test_can_submit
)
561 BOOST_ASIO_TEST_CASE(test_submit
)