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/sender.hpp>
19 #include <boost/system/error_code.hpp>
20 #include "../unit_test.hpp"
22 namespace exec
= boost::asio::execution
;
28 struct sender_using_base
:
29 boost::asio::execution::sender_base
42 executor(const executor
&) BOOST_ASIO_NOEXCEPT
46 #if defined(BOOST_ASIO_HAS_MOVE)
47 executor(executor
&&) BOOST_ASIO_NOEXCEPT
50 #endif // defined(BOOST_ASIO_HAS_MOVE)
53 void execute(BOOST_ASIO_MOVE_ARG(F
) f
) const BOOST_ASIO_NOEXCEPT
58 bool operator==(const executor
&) const BOOST_ASIO_NOEXCEPT
63 bool operator!=(const executor
&) const BOOST_ASIO_NOEXCEPT
73 #if !defined(BOOST_ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
76 struct execute_member
<executor
, F
>
78 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
79 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
80 typedef void result_type
;
83 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
84 #if !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
87 struct equality_comparable
<executor
>
89 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
90 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
93 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
99 #if defined(BOOST_ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT)
101 struct operation_state
103 void start() BOOST_ASIO_NOEXCEPT
112 #if !defined(BOOST_ASIO_HAS_DEDUCED_START_MEMBER_TRAIT)
115 struct start_member
<operation_state
>
117 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
118 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= true);
119 typedef void result_type
;
122 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_START_MEMBER_TRAIT)
124 } // namespace traits
131 template <typename
...> class Tuple
,
132 template <typename
...> class Variant
>
133 using value_types
= Variant
<Tuple
<int>>;
135 template <template <typename
...> class Variant
>
136 using error_types
= Variant
<boost::system::error_code
>;
138 BOOST_ASIO_STATIC_CONSTEXPR(bool, sends_done
= true);
144 template <typename R
>
145 operation_state
connect(BOOST_ASIO_MOVE_ARG(R
) r
) const
148 return operation_state();
156 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
158 template <typename R
>
159 struct connect_member
<const typed_sender
, R
>
161 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid
= true);
162 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept
= false);
163 typedef operation_state result_type
;
166 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
168 } // namespace traits
172 #endif // defined(BOOST_ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT)
174 template <typename T
>
175 bool is_unspecialised(T
*, ...)
180 template <typename T
>
181 bool is_unspecialised(T
*,
182 typename
boost::asio::void_type
<
183 typename
exec::sender_traits
<
184 T
>::asio_execution_sender_traits_base_is_unspecialised
190 void test_sender_traits()
193 BOOST_ASIO_CHECK(is_unspecialised(&s1
, static_cast<void*>(0)));
195 sender_using_base s2
;
196 BOOST_ASIO_CHECK(!is_unspecialised(&s2
, static_cast<void*>(0)));
199 BOOST_ASIO_CHECK(!is_unspecialised(&s3
, static_cast<void*>(0)));
201 #if defined(BOOST_ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT)
203 BOOST_ASIO_CHECK(!is_unspecialised(&s4
, static_cast<void*>(0)));
204 #endif // defined(BOOST_ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT)
207 void test_is_sender()
209 BOOST_ASIO_CHECK(!exec::is_sender
<void>::value
);
210 BOOST_ASIO_CHECK(!exec::is_sender
<not_a_sender
>::value
);
211 BOOST_ASIO_CHECK(exec::is_sender
<sender_using_base
>::value
);
212 BOOST_ASIO_CHECK(exec::is_sender
<executor
>::value
);
214 #if defined(BOOST_ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT)
215 BOOST_ASIO_CHECK(exec::is_sender
<typed_sender
>::value
);
216 #endif // defined(BOOST_ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT)
219 void test_is_typed_sender()
221 BOOST_ASIO_CHECK(!exec::is_typed_sender
<void>::value
);
222 BOOST_ASIO_CHECK(!exec::is_typed_sender
<not_a_sender
>::value
);
223 BOOST_ASIO_CHECK(!exec::is_typed_sender
<sender_using_base
>::value
);
225 #if defined(BOOST_ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT)
226 BOOST_ASIO_CHECK(exec::is_typed_sender
<executor
>::value
);
227 BOOST_ASIO_CHECK(exec::is_typed_sender
<typed_sender
>::value
);
228 #endif // defined(BOOST_ASIO_HAS_DEDUCED_EXECUTION_IS_TYPED_SENDER_TRAIT)
231 BOOST_ASIO_TEST_SUITE
234 BOOST_ASIO_TEST_CASE(test_sender_traits
)
235 BOOST_ASIO_TEST_CASE(test_is_sender
)
236 BOOST_ASIO_TEST_CASE(test_is_typed_sender
)