summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp')
-rw-r--r--3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp133
1 files changed, 85 insertions, 48 deletions
diff --git a/3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp b/3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp
index 48cc1baf17b..25b0ff1c995 100644
--- a/3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp
+++ b/3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp
@@ -2,7 +2,7 @@
// bind_cancellation_slot.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_cancellation_slot.hpp"
+#include <functional>
#include "asio/cancellation_signal.hpp"
#include "asio/io_context.hpp"
#include "asio/steady_timer.hpp"
@@ -27,24 +28,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)
@@ -77,64 +67,110 @@ void bind_cancellation_slot_to_function_object_test()
ioc.run();
ASIO_CHECK(count == 1);
+
+ t.async_wait(
+ bind_cancellation_slot(sig.slot(),
+ bind_cancellation_slot(sig.slot(),
+ bindns::bind(&increment_on_cancel,
+ &count, bindns::placeholders::_1))));
+
+ ioc.restart();
+ ioc.poll();
+
+ ASIO_CHECK(count == 1);
+
+ sig.emit(asio::cancellation_type::all);
+
+ ioc.run();
+
+ ASIO_CHECK(count == 2);
}
-struct incrementer_token
+struct incrementer_token_v1
+{
+ explicit incrementer_token_v1(int* c) : count(c) {}
+ int* count;
+};
+
+struct incrementer_handler_v1
{
- explicit incrementer_token(int* c) : count(c) {}
+ explicit incrementer_handler_v1(incrementer_token_v1 t) : count(t.count) {}
+
+ void operator()(asio::error_code error)
+ {
+ increment_on_cancel(count, error);
+ }
+
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_cancellation_slot_to_completion_token_v1_test()
+{
+ io_context ioc;
+ cancellation_signal sig;
+
+ int count = 0;
-#if defined(ASIO_HAS_VARIADIC_TEMPLATES)
+ timer t(ioc, chronons::seconds(5));
+ t.async_wait(
+ bind_cancellation_slot(sig.slot(),
+ incrementer_token_v1(&count)));
+
+ ioc.poll();
+
+ ASIO_CHECK(count == 0);
+
+ sig.emit(asio::cancellation_type::all);
+
+ ioc.run();
+
+ ASIO_CHECK(count == 1);
+}
+
+struct incrementer_token_v2
+{
+ explicit incrementer_token_v2(int* c) : count(c) {}
+ int* count;
+};
+
+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_on_cancel,
token.count, bindns::placeholders::_1),
- ASIO_MOVE_CAST(Args)(args)...);
- }
-
-#else // defined(ASIO_HAS_VARIADIC_TEMPLATES)
-
- template <typename Initiation>
- static void initiate(Initiation initiation, incrementer_token token)
- {
- initiation(
- bindns::bind(&increment_on_cancel,
- token.count, bindns::placeholders::_1));
+ static_cast<Args&&>(args)...);
}
-
-#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_on_cancel, \
- token.count, bindns::placeholders::_1), \
- 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_cancellation_slot_to_completion_token_test()
+void bind_cancellation_slot_to_completion_token_v2_test()
{
io_context ioc;
cancellation_signal sig;
@@ -144,7 +180,7 @@ void bind_cancellation_slot_to_completion_token_test()
timer t(ioc, chronons::seconds(5));
t.async_wait(
bind_cancellation_slot(sig.slot(),
- incrementer_token(&count)));
+ incrementer_token_v2(&count)));
ioc.poll();
@@ -161,5 +197,6 @@ ASIO_TEST_SUITE
(
"bind_cancellation_slot",
ASIO_TEST_CASE(bind_cancellation_slot_to_function_object_test)
- ASIO_TEST_CASE(bind_cancellation_slot_to_completion_token_test)
+ ASIO_TEST_CASE(bind_cancellation_slot_to_completion_token_v1_test)
+ ASIO_TEST_CASE(bind_cancellation_slot_to_completion_token_v2_test)
)