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/connect.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_connect_2
: exec::sender_base
64 operation_state
connect(BOOST_ASIO_MOVE_ARG(R
) r
)
67 return operation_state();
71 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
78 struct connect_member
<no_connect_3
, R
>
80 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
81 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
82 typedef operation_state result_type
;
89 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
91 struct const_member_connect
: exec::sender_base
93 const_member_connect()
98 operation_state
connect(BOOST_ASIO_MOVE_ARG(R
) r
) const
102 return operation_state();
106 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
112 template <typename R
>
113 struct connect_member
<const const_member_connect
, R
>
115 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
116 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
117 typedef operation_state result_type
;
120 } // namespace traits
124 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
126 struct free_connect_const_receiver
: exec::sender_base
128 free_connect_const_receiver()
132 template <typename R
>
133 friend operation_state
connect(
134 const free_connect_const_receiver
&, BOOST_ASIO_MOVE_ARG(R
) r
)
138 return operation_state();
142 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_FREE_TRAIT)
148 template <typename R
>
149 struct connect_free
<const free_connect_const_receiver
, R
>
151 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
152 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
153 typedef operation_state result_type
;
156 } // namespace traits
160 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_FREE_TRAIT)
162 struct non_const_member_connect
: exec::sender_base
164 template <typename R
>
165 operation_state
connect(BOOST_ASIO_MOVE_ARG(R
) r
)
169 return operation_state();
173 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
179 template <typename R
>
180 struct connect_member
<non_const_member_connect
, R
>
182 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
183 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
184 typedef operation_state result_type
;
187 } // namespace traits
191 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
193 struct free_connect_non_const_receiver
: exec::sender_base
195 free_connect_non_const_receiver()
199 template <typename R
>
200 friend operation_state
connect(
201 free_connect_non_const_receiver
&, BOOST_ASIO_MOVE_ARG(R
) r
)
205 return operation_state();
209 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_FREE_TRAIT)
215 template <typename R
>
216 struct connect_free
<free_connect_non_const_receiver
, R
>
218 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
219 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
220 typedef operation_state result_type
;
223 } // namespace traits
227 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_FREE_TRAIT)
235 receiver(const receiver
&)
239 #if defined(BOOST_ASIO_HAS_MOVE)
240 receiver(receiver
&&) BOOST_ASIO_NOEXCEPT
243 #endif // defined(BOOST_ASIO_HAS_MOVE)
245 template <typename E
>
246 void set_error(BOOST_ASIO_MOVE_ARG(E
) e
) BOOST_ASIO_NOEXCEPT
251 void set_done() BOOST_ASIO_NOEXCEPT
260 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
262 template <typename E
>
263 struct set_error_member
<receiver
, E
>
265 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
266 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
267 typedef void result_type
;
270 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
271 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
274 struct set_done_member
<receiver
>
276 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
277 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
278 typedef void result_type
;
281 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
283 } // namespace traits
293 executor(const executor
&) BOOST_ASIO_NOEXCEPT
297 #if defined(BOOST_ASIO_HAS_MOVE)
298 executor(executor
&&) BOOST_ASIO_NOEXCEPT
301 #endif // defined(BOOST_ASIO_HAS_MOVE)
303 template <typename F
>
304 void execute(BOOST_ASIO_MOVE_ARG(F
) f
) const BOOST_ASIO_NOEXCEPT
309 bool operator==(const executor
&) const BOOST_ASIO_NOEXCEPT
314 bool operator!=(const executor
&) const BOOST_ASIO_NOEXCEPT
324 #if !defined(BOOST_ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
326 template <typename F
>
327 struct execute_member
<executor
, F
>
329 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
330 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
331 typedef void result_type
;
334 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
335 #if !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
338 struct equality_comparable
<executor
>
340 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
341 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
344 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
346 } // namespace traits
350 void test_can_connect()
352 BOOST_ASIO_CONSTEXPR
bool b1
= exec::can_connect
<
353 no_connect_1
&, receiver
>::value
;
354 BOOST_ASIO_CHECK(b1
== false);
356 BOOST_ASIO_CONSTEXPR
bool b2
= exec::can_connect
<
357 const no_connect_1
&, receiver
>::value
;
358 BOOST_ASIO_CHECK(b2
== false);
360 BOOST_ASIO_CONSTEXPR
bool b3
= exec::can_connect
<
361 no_connect_2
&, receiver
>::value
;
362 BOOST_ASIO_CHECK(b3
== false);
364 BOOST_ASIO_CONSTEXPR
bool b4
= exec::can_connect
<
365 const no_connect_2
&, receiver
>::value
;
366 BOOST_ASIO_CHECK(b4
== false);
368 BOOST_ASIO_CONSTEXPR
bool b5
= exec::can_connect
<
369 no_connect_3
&, receiver
>::value
;
370 BOOST_ASIO_CHECK(b5
== false);
372 BOOST_ASIO_CONSTEXPR
bool b6
= exec::can_connect
<
373 const no_connect_3
&, receiver
>::value
;
374 BOOST_ASIO_CHECK(b6
== false);
376 BOOST_ASIO_CONSTEXPR
bool b7
= exec::can_connect
<
377 const_member_connect
&, receiver
>::value
;
378 BOOST_ASIO_CHECK(b7
== true);
380 BOOST_ASIO_CONSTEXPR
bool b8
= exec::can_connect
<
381 const const_member_connect
&, receiver
>::value
;
382 BOOST_ASIO_CHECK(b8
== true);
384 BOOST_ASIO_CONSTEXPR
bool b9
= exec::can_connect
<
385 free_connect_const_receiver
&, receiver
>::value
;
386 BOOST_ASIO_CHECK(b9
== true);
388 BOOST_ASIO_CONSTEXPR
bool b10
= exec::can_connect
<
389 const free_connect_const_receiver
&, receiver
>::value
;
390 BOOST_ASIO_CHECK(b10
== true);
392 BOOST_ASIO_CONSTEXPR
bool b11
= exec::can_connect
<
393 non_const_member_connect
&, receiver
>::value
;
394 BOOST_ASIO_CHECK(b11
== true);
396 BOOST_ASIO_CONSTEXPR
bool b12
= exec::can_connect
<
397 const non_const_member_connect
&, receiver
>::value
;
398 BOOST_ASIO_CHECK(b12
== false);
400 BOOST_ASIO_CONSTEXPR
bool b13
= exec::can_connect
<
401 free_connect_non_const_receiver
&, receiver
>::value
;
402 BOOST_ASIO_CHECK(b13
== true);
404 BOOST_ASIO_CONSTEXPR
bool b14
= exec::can_connect
<
405 const free_connect_non_const_receiver
&, receiver
>::value
;
406 BOOST_ASIO_CHECK(b14
== false);
408 BOOST_ASIO_CONSTEXPR
bool b15
= exec::can_connect
<
409 executor
&, receiver
>::value
;
410 BOOST_ASIO_CHECK(b15
== true);
412 BOOST_ASIO_CONSTEXPR
bool b16
= exec::can_connect
<
413 const executor
&, receiver
>::value
;
414 BOOST_ASIO_CHECK(b16
== true);
417 void increment(int* count
)
427 const_member_connect s1
;
428 operation_state o1
= exec::connect(s1
, r
);
429 BOOST_ASIO_CHECK(call_count
== 1);
433 const const_member_connect s2
;
434 operation_state o2
= exec::connect(s2
, r
);
435 BOOST_ASIO_CHECK(call_count
== 1);
439 operation_state o3
= exec::connect(const_member_connect(), r
);
440 BOOST_ASIO_CHECK(call_count
== 1);
444 free_connect_const_receiver s3
;
445 operation_state o4
= exec::connect(s3
, r
);
446 BOOST_ASIO_CHECK(call_count
== 1);
450 const free_connect_const_receiver s4
;
451 operation_state o5
= exec::connect(s4
, r
);
452 BOOST_ASIO_CHECK(call_count
== 1);
456 operation_state o6
= exec::connect(free_connect_const_receiver(), r
);
457 BOOST_ASIO_CHECK(call_count
== 1);
461 non_const_member_connect s5
;
462 operation_state o7
= exec::connect(s5
, r
);
463 BOOST_ASIO_CHECK(call_count
== 1);
467 free_connect_non_const_receiver s6
;
468 operation_state o8
= exec::connect(s6
, r
);
469 BOOST_ASIO_CHECK(call_count
== 1);
473 exec::connect_result
<executor
&,
474 receiver
&>::type o9
= exec::connect(s7
, r
);
476 exec::is_operation_state
<
477 exec::connect_result
<executor
&, receiver
&>::type
482 exec::connect_result
<const executor
&,
483 receiver
&>::type o10
= exec::connect(s8
, r
);
484 (void)exec::connect(s8
, r
);
486 exec::is_operation_state
<
487 exec::connect_result
<const executor
&, receiver
&>::type
492 BOOST_ASIO_TEST_SUITE
495 BOOST_ASIO_TEST_CASE(test_can_connect
)
496 BOOST_ASIO_TEST_CASE(test_connect
)