5 // Copyright (c) 2003-2020 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/schedule.hpp>
19 #include <boost/system/error_code.hpp>
20 #include <boost/asio/execution/sender.hpp>
21 #include <boost/asio/execution/submit.hpp>
22 #include <boost/asio/traits/connect_member.hpp>
23 #include <boost/asio/traits/start_member.hpp>
24 #include <boost/asio/traits/submit_member.hpp>
25 #include "../unit_test.hpp"
27 namespace exec
= boost::asio::execution
;
29 struct operation_state
31 void start() BOOST_ASIO_NOEXCEPT
40 #if !defined(BOOST_ASIO_HAS_DEDUCED_START_MEMBER_TRAIT)
43 struct start_member
<operation_state
>
45 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
46 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
47 typedef void result_type
;
50 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_START_MEMBER_TRAIT)
56 struct sender
: exec::sender_base
63 operation_state
connect(BOOST_ASIO_MOVE_ARG(R
) r
) const
66 return operation_state();
70 void submit(BOOST_ASIO_MOVE_ARG(R
) r
) const
72 typename
boost::asio::decay
<R
>::type
tmp(BOOST_ASIO_MOVE_CAST(R
)(r
));
81 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
84 struct connect_member
<const sender
, R
>
86 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
87 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
88 typedef operation_state result_type
;
91 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
93 #if !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_MEMBER_TRAIT)
96 struct submit_member
<const sender
, R
>
98 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
99 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
100 typedef void result_type
;
103 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SUBMIT_MEMBER_TRAIT)
105 } // namespace traits
113 struct const_member_schedule
115 sender
schedule() const BOOST_ASIO_NOEXCEPT
121 #if !defined(BOOST_ASIO_HAS_DEDUCED_SCHEDULE_MEMBER_TRAIT)
128 struct schedule_member
<const const_member_schedule
>
130 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
131 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
132 typedef sender result_type
;
135 } // namespace traits
139 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SCHEDULE_MEMBER_TRAIT)
141 struct free_schedule_const_receiver
143 friend sender
schedule(
144 const free_schedule_const_receiver
&) BOOST_ASIO_NOEXCEPT
150 #if !defined(BOOST_ASIO_HAS_DEDUCED_SCHEDULE_FREE_TRAIT)
157 struct schedule_free
<const free_schedule_const_receiver
>
159 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
160 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
161 typedef sender result_type
;
164 } // namespace traits
168 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SCHEDULE_FREE_TRAIT)
170 struct non_const_member_schedule
172 sender
schedule() BOOST_ASIO_NOEXCEPT
178 #if !defined(BOOST_ASIO_HAS_DEDUCED_SCHEDULE_MEMBER_TRAIT)
185 struct schedule_member
<non_const_member_schedule
>
187 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
188 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
189 typedef sender result_type
;
192 } // namespace traits
196 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SCHEDULE_MEMBER_TRAIT)
198 struct free_schedule_non_const_receiver
200 friend sender
schedule(
201 free_schedule_non_const_receiver
&) BOOST_ASIO_NOEXCEPT
207 #if !defined(BOOST_ASIO_HAS_DEDUCED_SCHEDULE_FREE_TRAIT)
214 struct schedule_free
<free_schedule_non_const_receiver
>
216 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
217 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
218 typedef sender result_type
;
221 } // namespace traits
225 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SCHEDULE_FREE_TRAIT)
233 executor(const executor
&) BOOST_ASIO_NOEXCEPT
237 #if defined(BOOST_ASIO_HAS_MOVE)
238 executor(executor
&&) BOOST_ASIO_NOEXCEPT
241 #endif // defined(BOOST_ASIO_HAS_MOVE)
243 template <typename F
>
244 void execute(BOOST_ASIO_MOVE_ARG(F
) f
) const BOOST_ASIO_NOEXCEPT
246 typename
boost::asio::decay
<F
>::type
tmp(BOOST_ASIO_MOVE_CAST(F
)(f
));
250 bool operator==(const executor
&) const BOOST_ASIO_NOEXCEPT
255 bool operator!=(const executor
&) const BOOST_ASIO_NOEXCEPT
265 #if !defined(BOOST_ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
267 template <typename F
>
268 struct execute_member
<executor
, F
>
270 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
271 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
272 typedef void result_type
;
275 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
276 #if !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
279 struct equality_comparable
<executor
>
281 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
282 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
285 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
287 } // namespace traits
291 void test_can_schedule()
293 BOOST_ASIO_CONSTEXPR
bool b1
= exec::can_schedule
<
294 no_schedule
&>::value
;
295 BOOST_ASIO_CHECK(b1
== false);
297 BOOST_ASIO_CONSTEXPR
bool b2
= exec::can_schedule
<
298 const no_schedule
&>::value
;
299 BOOST_ASIO_CHECK(b2
== false);
301 BOOST_ASIO_CONSTEXPR
bool b3
= exec::can_schedule
<
302 const_member_schedule
&>::value
;
303 BOOST_ASIO_CHECK(b3
== true);
305 BOOST_ASIO_CONSTEXPR
bool b4
= exec::can_schedule
<
306 const const_member_schedule
&>::value
;
307 BOOST_ASIO_CHECK(b4
== true);
309 BOOST_ASIO_CONSTEXPR
bool b5
= exec::can_schedule
<
310 free_schedule_const_receiver
&>::value
;
311 BOOST_ASIO_CHECK(b5
== true);
313 BOOST_ASIO_CONSTEXPR
bool b6
= exec::can_schedule
<
314 const free_schedule_const_receiver
&>::value
;
315 BOOST_ASIO_CHECK(b6
== true);
317 BOOST_ASIO_CONSTEXPR
bool b7
= exec::can_schedule
<
318 non_const_member_schedule
&>::value
;
319 BOOST_ASIO_CHECK(b7
== true);
321 BOOST_ASIO_CONSTEXPR
bool b8
= exec::can_schedule
<
322 const non_const_member_schedule
&>::value
;
323 BOOST_ASIO_CHECK(b8
== false);
325 BOOST_ASIO_CONSTEXPR
bool b9
= exec::can_schedule
<
326 free_schedule_non_const_receiver
&>::value
;
327 BOOST_ASIO_CHECK(b9
== true);
329 BOOST_ASIO_CONSTEXPR
bool b10
= exec::can_schedule
<
330 const free_schedule_non_const_receiver
&>::value
;
331 BOOST_ASIO_CHECK(b10
== false);
333 BOOST_ASIO_CONSTEXPR
bool b11
= exec::can_schedule
<
335 BOOST_ASIO_CHECK(b11
== true);
337 BOOST_ASIO_CONSTEXPR
bool b12
= exec::can_schedule
<
338 const executor
&>::value
;
339 BOOST_ASIO_CHECK(b12
== true);
351 receiver(const receiver
& other
) BOOST_ASIO_NOEXCEPT
352 : count_(other
.count_
)
356 #if defined(BOOST_ASIO_HAS_MOVE)
357 receiver(receiver
&& other
) BOOST_ASIO_NOEXCEPT
358 : count_(other
.count_
)
362 #endif // defined(BOOST_ASIO_HAS_MOVE)
364 void set_value() BOOST_ASIO_NOEXCEPT
369 template <typename E
>
370 void set_error(BOOST_ASIO_MOVE_ARG(E
) e
) BOOST_ASIO_NOEXCEPT
375 void set_done() BOOST_ASIO_NOEXCEPT
384 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
387 struct set_value_member
<receiver
, void()>
389 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
390 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
391 typedef void result_type
;
394 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
396 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
398 template <typename E
>
399 struct set_error_member
<receiver
, E
>
401 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
402 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
403 typedef void result_type
;
406 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
408 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
411 struct set_done_member
<receiver
>
413 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
414 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
415 typedef void result_type
;
418 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
420 } // namespace traits
427 const_member_schedule ex1
= {};
431 BOOST_ASIO_CHECK(count
== 1);
434 const const_member_schedule ex2
= {};
438 BOOST_ASIO_CHECK(count
== 1);
442 exec::schedule(const_member_schedule()),
444 BOOST_ASIO_CHECK(count
== 1);
447 free_schedule_const_receiver ex3
= {};
451 BOOST_ASIO_CHECK(count
== 1);
454 const free_schedule_const_receiver ex4
= {};
458 BOOST_ASIO_CHECK(count
== 1);
462 exec::schedule(free_schedule_const_receiver()),
464 BOOST_ASIO_CHECK(count
== 1);
467 non_const_member_schedule ex5
= {};
471 BOOST_ASIO_CHECK(count
== 1);
474 free_schedule_non_const_receiver ex6
= {};
478 BOOST_ASIO_CHECK(count
== 1);
485 BOOST_ASIO_CHECK(count
== 1);
492 BOOST_ASIO_CHECK(count
== 1);
496 exec::schedule(executor()),
498 BOOST_ASIO_CHECK(count
== 1);
501 BOOST_ASIO_TEST_SUITE
504 BOOST_ASIO_TEST_CASE(test_can_schedule
)
505 BOOST_ASIO_TEST_CASE(test_schedule
)