summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/src/tests/unit/bind_executor.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/src/tests/unit/bind_executor.cpp')
-rw-r--r--3rdparty/asio/src/tests/unit/bind_executor.cpp123
1 files changed, 79 insertions, 44 deletions
diff --git a/3rdparty/asio/src/tests/unit/bind_executor.cpp b/3rdparty/asio/src/tests/unit/bind_executor.cpp
index 8b1ea70f6b2..59be1cd14f3 100644
--- a/3rdparty/asio/src/tests/unit/bind_executor.cpp
+++ b/3rdparty/asio/src/tests/unit/bind_executor.cpp
@@ -2,7 +2,7 @@
// bind_executor.cpp
// ~~~~~~~~~~~~~~~~~
//
-// Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -16,6 +16,7 @@
// Test that header file is self-contained.
#include "asio/bind_executor.hpp"
+#include <functional>
#include "asio/io_context.hpp"
#include "asio/steady_timer.hpp"
#include "unit_test.hpp"
@@ -26,24 +27,13 @@
# include "asio/steady_timer.hpp"
#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
-#if defined(ASIO_HAS_BOOST_BIND)
-# include <boost/bind/bind.hpp>
-#else // defined(ASIO_HAS_BOOST_BIND)
-# include <functional>
-#endif // defined(ASIO_HAS_BOOST_BIND)
-
using namespace asio;
-
-#if defined(ASIO_HAS_BOOST_BIND)
-namespace bindns = boost;
-#else // defined(ASIO_HAS_BOOST_BIND)
namespace bindns = std;
-#endif
#if defined(ASIO_HAS_BOOST_DATE_TIME)
typedef deadline_timer timer;
namespace chronons = boost::posix_time;
-#elif defined(ASIO_HAS_CHRONO)
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
typedef steady_timer timer;
namespace chronons = asio::chrono;
#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
@@ -73,58 +63,102 @@ void bind_executor_to_function_object_test()
ioc2.run();
ASIO_CHECK(count == 1);
+
+ t.async_wait(
+ bind_executor(
+ ioc2.get_executor(),
+ bind_executor(
+ asio::system_executor(),
+ bindns::bind(&increment, &count))));
+
+ ioc1.restart();
+ ioc1.run();
+
+ ASIO_CHECK(count == 1);
+
+ ioc2.restart();
+ ioc2.run();
+
+ ASIO_CHECK(count == 2);
}
-struct incrementer_token
+struct incrementer_token_v1
{
- explicit incrementer_token(int* c) : count(c) {}
+ explicit incrementer_token_v1(int* c) : count(c) {}
+ int* count;
+};
+
+struct incrementer_handler_v1
+{
+ explicit incrementer_handler_v1(incrementer_token_v1 t) : count(t.count) {}
+ void operator()(asio::error_code){ increment(count); }
int* count;
};
namespace asio {
template <>
-class async_result<incrementer_token, void(asio::error_code)>
+class async_result<incrementer_token_v1, void(asio::error_code)>
{
public:
+ typedef incrementer_handler_v1 completion_handler_type;
typedef void return_type;
+ explicit async_result(completion_handler_type&) {}
+ return_type get() {}
+};
+
+} // namespace asio
+
+void bind_executor_to_completion_token_v1_test()
+{
+ io_context ioc1;
+ io_context ioc2;
+
+ int count = 0;
+
+ timer t(ioc1, chronons::seconds(1));
+ t.async_wait(
+ bind_executor(
+ ioc2.get_executor(),
+ incrementer_token_v1(&count)));
+
+ ioc1.run();
+
+ ASIO_CHECK(count == 0);
+
+ ioc2.run();
+
+ ASIO_CHECK(count == 1);
+}
+
+struct incrementer_token_v2
+{
+ explicit incrementer_token_v2(int* c) : count(c) {}
+ int* count;
+};
-#if defined(ASIO_HAS_VARIADIC_TEMPLATES)
+namespace asio {
+
+template <>
+class async_result<incrementer_token_v2, void(asio::error_code)>
+{
+public:
+#if !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+ typedef void return_type;
+#endif // !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
template <typename Initiation, typename... Args>
static void initiate(Initiation initiation,
- incrementer_token token, ASIO_MOVE_ARG(Args)... args)
+ incrementer_token_v2 token, Args&&... args)
{
initiation(bindns::bind(&increment, token.count),
- ASIO_MOVE_CAST(Args)(args)...);
+ static_cast<Args&&>(args)...);
}
-
-#else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
- template <typename Initiation>
- static void initiate(Initiation initiation, incrementer_token token)
- {
- initiation(bindns::bind(&increment, token.count));
- }
-
-#define ASIO_PRIVATE_INITIATE_DEF(n) \
- template <typename Initiation, ASIO_VARIADIC_TPARAMS(n)> \
- static return_type initiate(Initiation initiation, \
- incrementer_token token, ASIO_VARIADIC_MOVE_PARAMS(n)) \
- { \
- initiation(bindns::bind(&increment, token.count), \
- ASIO_VARIADIC_MOVE_ARGS(n)); \
- } \
- /**/
- ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_INITIATE_DEF)
-#undef ASIO_PRIVATE_INITIATE_DEF
-
-#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES)
};
} // namespace asio
-void bind_executor_to_completion_token_test()
+void bind_executor_to_completion_token_v2_test()
{
io_context ioc1;
io_context ioc2;
@@ -135,7 +169,7 @@ void bind_executor_to_completion_token_test()
t.async_wait(
bind_executor(
ioc2.get_executor(),
- incrementer_token(&count)));
+ incrementer_token_v2(&count)));
ioc1.run();
@@ -150,5 +184,6 @@ ASIO_TEST_SUITE
(
"bind_executor",
ASIO_TEST_CASE(bind_executor_to_function_object_test)
- ASIO_TEST_CASE(bind_executor_to_completion_token_test)
+ ASIO_TEST_CASE(bind_executor_to_completion_token_v1_test)
+ ASIO_TEST_CASE(bind_executor_to_completion_token_v2_test)
)