diff options
Diffstat (limited to '3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp')
-rw-r--r-- | 3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp | 133 |
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) ) |