1//
2// as_tuple.cpp
3// ~~~~~~~~~~~~
4//
5// Copyright (c) 2003-2024 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/as_tuple.hpp>
18
19#include <boost/asio/bind_executor.hpp>
20#include <boost/asio/deferred.hpp>
21#include <boost/asio/io_context.hpp>
22#include <boost/asio/post.hpp>
23#include <boost/asio/system_timer.hpp>
24#include <boost/asio/use_future.hpp>
25#include "unit_test.hpp"
26
27void as_tuple_test()
28{
29 boost::asio::io_context io1;
30 boost::asio::io_context io2;
31 boost::asio::system_timer timer1(io1);
32 int count = 0;
33
34 timer1.expires_after(expiry_time: boost::asio::chrono::seconds(0));
35 timer1.async_wait(
36 token: boost::asio::as_tuple(
37 completion_token: boost::asio::bind_executor(ex: io2.get_executor(),
38 t: [&count](std::tuple<boost::system::error_code>)
39 {
40 ++count;
41 })));
42
43 BOOST_ASIO_CHECK(count == 0);
44
45 io1.run();
46
47 BOOST_ASIO_CHECK(count == 0);
48
49 io2.run();
50
51 BOOST_ASIO_CHECK(count == 1);
52
53 timer1.async_wait(
54 token: boost::asio::as_tuple(
55 completion_token: boost::asio::bind_executor(ex: io2.get_executor(),
56 t: boost::asio::deferred)))(
57 [&count](std::tuple<boost::system::error_code>)
58 {
59 ++count;
60 });
61
62 BOOST_ASIO_CHECK(count == 1);
63
64 io1.restart();
65 io1.run();
66
67 BOOST_ASIO_CHECK(count == 1);
68
69 io2.restart();
70 io2.run();
71
72 BOOST_ASIO_CHECK(count == 2);
73
74# if defined(BOOST_ASIO_HAS_STD_FUTURE_CLASS)
75 std::future<std::tuple<boost::system::error_code> > f = timer1.async_wait(
76 token: boost::asio::as_tuple(
77 completion_token: boost::asio::bind_executor(ex: io2.get_executor(),
78 t: boost::asio::use_future)));
79
80 BOOST_ASIO_CHECK(f.wait_for(std::chrono::seconds(0))
81 == std::future_status::timeout);
82
83 io1.restart();
84 io1.run();
85
86 BOOST_ASIO_CHECK(f.wait_for(std::chrono::seconds(0))
87 == std::future_status::timeout);
88
89 io2.restart();
90 io2.run();
91
92 BOOST_ASIO_CHECK(f.wait_for(std::chrono::seconds(0))
93 == std::future_status::ready);
94# endif // defined(BOOST_ASIO_HAS_STD_FUTURE_CLASS)
95}
96
97void as_tuple_constness_test()
98{
99# if defined(BOOST_ASIO_HAS_STD_FUTURE_CLASS)
100 boost::asio::io_context io1;
101 boost::asio::system_timer timer1(io1);
102
103 auto tok1 = boost::asio::as_tuple(completion_token: boost::asio::use_future);
104 (void)timer1.async_wait(token&: tok1);
105 (void)timer1.async_wait(token: std::move(tok1));
106
107 const auto tok2 = boost::asio::as_tuple(completion_token: boost::asio::use_future);
108 (void)timer1.async_wait(token: tok2);
109 (void)timer1.async_wait(token: std::move(tok2));
110
111 constexpr auto tok3 = boost::asio::as_tuple(completion_token: boost::asio::use_future);
112 (void)timer1.async_wait(token: tok3);
113 (void)timer1.async_wait(token: std::move(tok3));
114# endif // defined(BOOST_ASIO_HAS_STD_FUTURE_CLASS)
115}
116
117BOOST_ASIO_TEST_SUITE
118(
119 "as_tuple",
120 BOOST_ASIO_TEST_CASE(as_tuple_test)
121 BOOST_ASIO_COMPILE_TEST_CASE(as_tuple_constness_test)
122)
123

source code of boost/libs/asio/test/as_tuple.cpp