// // impl/cancel_at.hpp // ~~~~~~~~~~~~~~~~~~ // // 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) // #ifndef ASIO_IMPL_CANCEL_AT_HPP #define ASIO_IMPL_CANCEL_AT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/associated_executor.hpp" #include "asio/async_result.hpp" #include "asio/detail/initiation_base.hpp" #include "asio/detail/timed_cancel_op.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template struct initiate_cancel_at : initiation_base { using initiation_base::initiation_base; template void operator()(Handler&& handler, const chrono::time_point& expiry, cancellation_type_t cancel_type, Args&&... args) && { using op = detail::timed_cancel_op, basic_waitable_timer, Signatures...>; non_const_lvalue handler2(handler); typename op::ptr p = { asio::detail::addressof(handler2.value), op::ptr::allocate(handler2.value), 0 }; p.p = new (p.v) op(handler2.value, basic_waitable_timer(this->get_executor(), expiry), cancel_type); op* o = p.p; p.v = p.p = 0; o->start(static_cast(*this), static_cast(args)...); } template void operator()(Handler&& handler, const chrono::time_point& expiry, cancellation_type_t cancel_type, Args&&... args) const & { using op = detail::timed_cancel_op, basic_waitable_timer, Signatures...>; non_const_lvalue handler2(handler); typename op::ptr p = { asio::detail::addressof(handler2.value), op::ptr::allocate(handler2.value), 0 }; p.p = new (p.v) op(handler2.value, basic_waitable_timer(this->get_executor(), expiry), cancel_type); op* o = p.p; p.v = p.p = 0; o->start(static_cast(*this), static_cast(args)...); } }; template struct initiate_cancel_at_timer : initiation_base { using initiation_base::initiation_base; template void operator()(Handler&& handler, basic_waitable_timer* timer, const chrono::time_point& expiry, cancellation_type_t cancel_type, Args&&... args) && { using op = detail::timed_cancel_op, basic_waitable_timer&, Signatures...>; non_const_lvalue handler2(handler); typename op::ptr p = { asio::detail::addressof(handler2.value), op::ptr::allocate(handler2.value), 0 }; timer->expires_at(expiry); p.p = new (p.v) op(handler2.value, *timer, cancel_type); op* o = p.p; p.v = p.p = 0; o->start(static_cast(*this), static_cast(args)...); } template void operator()(Handler&& handler, basic_waitable_timer* timer, const chrono::time_point& expiry, cancellation_type_t cancel_type, Args&&... args) const & { using op = detail::timed_cancel_op, basic_waitable_timer&, Signatures...>; non_const_lvalue handler2(handler); typename op::ptr p = { asio::detail::addressof(handler2.value), op::ptr::allocate(handler2.value), 0 }; timer->expires_at(expiry); p.p = new (p.v) op(handler2.value, *timer, cancel_type); op* o = p.p; p.v = p.p = 0; o->start(static_cast(*this), static_cast(args)...); } }; } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct async_result< cancel_at_t, Signatures...> : async_result { template static auto initiate(Initiation&& initiation, RawCompletionToken&& token, Args&&... args) -> decltype( async_initiate< conditional_t< is_const>::value, const CompletionToken, CompletionToken>, Signatures...>( declval, Clock, WaitTraits, Signatures...>>(), token.token_, token.expiry_, token.cancel_type_, static_cast(args)...)) { return async_initiate< conditional_t< is_const>::value, const CompletionToken, CompletionToken>, Signatures...>( detail::initiate_cancel_at< decay_t, Clock, WaitTraits, Signatures...>( static_cast(initiation)), token.token_, token.expiry_, token.cancel_type_, static_cast(args)...); } }; template struct async_result< cancel_at_timer, Signatures...> : async_result { template static auto initiate(Initiation&& initiation, RawCompletionToken&& token, Args&&... args) -> decltype( async_initiate< conditional_t< is_const>::value, const CompletionToken, CompletionToken>, Signatures...>( declval, Clock, WaitTraits, Executor, Signatures...>>(), token.token_, &token.timer_, token.expiry_, token.cancel_type_, static_cast(args)...)) { return async_initiate< conditional_t< is_const>::value, const CompletionToken, CompletionToken>, Signatures...>( detail::initiate_cancel_at_timer< decay_t, Clock, WaitTraits, Executor, Signatures...>( static_cast(initiation)), token.token_, &token.timer_, token.expiry_, token.cancel_type_, static_cast(args)...); } }; template struct async_result, Signatures...> { template static auto initiate(Initiation&& initiation, RawCompletionToken&& token, Args&&... args) -> decltype( async_initiate< const cancel_at_t< default_completion_token_t>, Clock, WaitTraits>&, Signatures...>( static_cast(initiation), cancel_at_t< default_completion_token_t>, Clock, WaitTraits>( default_completion_token_t>{}, token.expiry_, token.cancel_type_), static_cast(args)...)) { return async_initiate< const cancel_at_t< default_completion_token_t>, Clock, WaitTraits>&, Signatures...>( static_cast(initiation), cancel_at_t< default_completion_token_t>, Clock, WaitTraits>( default_completion_token_t>{}, token.expiry_, token.cancel_type_), static_cast(args)...); } }; template struct async_result< partial_cancel_at_timer, Signatures...> { template static auto initiate(Initiation&& initiation, RawCompletionToken&& token, Args&&... args) -> decltype( async_initiate( static_cast(initiation), cancel_at_timer< default_completion_token_t>, Clock, WaitTraits, Executor>( default_completion_token_t>{}, token.timer_, token.expiry_, token.cancel_type_), static_cast(args)...)) { return async_initiate( static_cast(initiation), cancel_at_timer< default_completion_token_t>, Clock, WaitTraits, Executor>( default_completion_token_t>{}, token.timer_, token.expiry_, token.cancel_type_), static_cast(args)...); } }; #endif // !defined(GENERATING_DOCUMENTATION) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_CANCEL_AT_HPP