Warning, file /include/boost/asio/impl/cancel_after.hpp was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef BOOST_ASIO_IMPL_CANCEL_AFTER_HPP
0012 #define BOOST_ASIO_IMPL_CANCEL_AFTER_HPP
0013
0014 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
0015 # pragma once
0016 #endif
0017
0018 #include <boost/asio/detail/config.hpp>
0019 #include <boost/asio/associated_executor.hpp>
0020 #include <boost/asio/async_result.hpp>
0021 #include <boost/asio/detail/initiation_base.hpp>
0022 #include <boost/asio/detail/timed_cancel_op.hpp>
0023
0024 #include <boost/asio/detail/push_options.hpp>
0025
0026 namespace boost {
0027 namespace asio {
0028 namespace detail {
0029
0030 template <typename Initiation, typename Clock,
0031 typename WaitTraits, typename... Signatures>
0032 struct initiate_cancel_after : initiation_base<Initiation>
0033 {
0034 using initiation_base<Initiation>::initiation_base;
0035
0036 template <typename Handler, typename Rep, typename Period, typename... Args>
0037 void operator()(Handler&& handler,
0038 const chrono::duration<Rep, Period>& timeout,
0039 cancellation_type_t cancel_type, Args&&... args) &&
0040 {
0041 using op = detail::timed_cancel_op<decay_t<Handler>,
0042 basic_waitable_timer<Clock, WaitTraits>, Signatures...>;
0043
0044 non_const_lvalue<Handler> handler2(handler);
0045 typename op::ptr p = { boost::asio::detail::addressof(handler2.value),
0046 op::ptr::allocate(handler2.value), 0 };
0047 p.p = new (p.v) op(handler2.value,
0048 basic_waitable_timer<Clock, WaitTraits,
0049 typename Initiation::executor_type>(this->get_executor(), timeout),
0050 cancel_type);
0051
0052 op* o = p.p;
0053 p.v = p.p = 0;
0054 o->start(static_cast<Initiation&&>(*this), static_cast<Args&&>(args)...);
0055 }
0056
0057 template <typename Handler, typename Rep, typename Period, typename... Args>
0058 void operator()(Handler&& handler,
0059 const chrono::duration<Rep, Period>& timeout,
0060 cancellation_type_t cancel_type, Args&&... args) const &
0061 {
0062 using op = detail::timed_cancel_op<decay_t<Handler>,
0063 basic_waitable_timer<Clock, WaitTraits>, Signatures...>;
0064
0065 non_const_lvalue<Handler> handler2(handler);
0066 typename op::ptr p = { boost::asio::detail::addressof(handler2.value),
0067 op::ptr::allocate(handler2.value), 0 };
0068 p.p = new (p.v) op(handler2.value,
0069 basic_waitable_timer<Clock, WaitTraits,
0070 typename Initiation::executor_type>(this->get_executor(), timeout),
0071 cancel_type);
0072
0073 op* o = p.p;
0074 p.v = p.p = 0;
0075 o->start(static_cast<const Initiation&>(*this),
0076 static_cast<Args&&>(args)...);
0077 }
0078 };
0079
0080 template <typename Initiation, typename Clock,
0081 typename WaitTraits, typename Executor, typename... Signatures>
0082 struct initiate_cancel_after_timer : initiation_base<Initiation>
0083 {
0084 using initiation_base<Initiation>::initiation_base;
0085
0086 template <typename Handler, typename Rep, typename Period, typename... Args>
0087 void operator()(Handler&& handler,
0088 basic_waitable_timer<Clock, WaitTraits, Executor>* timer,
0089 const chrono::duration<Rep, Period>& timeout,
0090 cancellation_type_t cancel_type, Args&&... args) &&
0091 {
0092 using op = detail::timed_cancel_op<decay_t<Handler>,
0093 basic_waitable_timer<Clock, WaitTraits, Executor>&, Signatures...>;
0094
0095 non_const_lvalue<Handler> handler2(handler);
0096 typename op::ptr p = { boost::asio::detail::addressof(handler2.value),
0097 op::ptr::allocate(handler2.value), 0 };
0098 timer->expires_after(timeout);
0099 p.p = new (p.v) op(handler2.value, *timer, cancel_type);
0100
0101 op* o = p.p;
0102 p.v = p.p = 0;
0103 o->start(static_cast<Initiation&&>(*this), static_cast<Args&&>(args)...);
0104 }
0105
0106 template <typename Handler, typename Rep, typename Period, typename... Args>
0107 void operator()(Handler&& handler,
0108 basic_waitable_timer<Clock, WaitTraits, Executor>* timer,
0109 const chrono::duration<Rep, Period>& timeout,
0110 cancellation_type_t cancel_type, Args&&... args) const &
0111 {
0112 using op = detail::timed_cancel_op<decay_t<Handler>,
0113 basic_waitable_timer<Clock, WaitTraits, Executor>&, Signatures...>;
0114
0115 non_const_lvalue<Handler> handler2(handler);
0116 typename op::ptr p = { boost::asio::detail::addressof(handler2.value),
0117 op::ptr::allocate(handler2.value), 0 };
0118 timer->expires_after(timeout);
0119 p.p = new (p.v) op(handler2.value, *timer, cancel_type);
0120
0121 op* o = p.p;
0122 p.v = p.p = 0;
0123 o->start(static_cast<const Initiation&>(*this),
0124 static_cast<Args&&>(args)...);
0125 }
0126 };
0127
0128 }
0129
0130 #if !defined(GENERATING_DOCUMENTATION)
0131
0132 template <typename CompletionToken, typename Clock,
0133 typename WaitTraits, typename... Signatures>
0134 struct async_result<
0135 cancel_after_t<CompletionToken, Clock, WaitTraits>, Signatures...>
0136 : async_result<CompletionToken, Signatures...>
0137 {
0138 template <typename Initiation, typename RawCompletionToken, typename... Args>
0139 static auto initiate(Initiation&& initiation,
0140 RawCompletionToken&& token, Args&&... args)
0141 -> decltype(
0142 async_initiate<
0143 conditional_t<
0144 is_const<remove_reference_t<RawCompletionToken>>::value,
0145 const CompletionToken, CompletionToken>,
0146 Signatures...>(
0147 declval<detail::initiate_cancel_after<
0148 decay_t<Initiation>, Clock, WaitTraits, Signatures...>>(),
0149 token.token_, token.timeout_, token.cancel_type_,
0150 static_cast<Args&&>(args)...))
0151 {
0152 return async_initiate<
0153 conditional_t<
0154 is_const<remove_reference_t<RawCompletionToken>>::value,
0155 const CompletionToken, CompletionToken>,
0156 Signatures...>(
0157 detail::initiate_cancel_after<
0158 decay_t<Initiation>, Clock, WaitTraits, Signatures...>(
0159 static_cast<Initiation&&>(initiation)),
0160 token.token_, token.timeout_, token.cancel_type_,
0161 static_cast<Args&&>(args)...);
0162 }
0163 };
0164
0165 template <typename CompletionToken, typename Clock,
0166 typename WaitTraits, typename Executor, typename... Signatures>
0167 struct async_result<
0168 cancel_after_timer<CompletionToken, Clock, WaitTraits, Executor>,
0169 Signatures...>
0170 : async_result<CompletionToken, Signatures...>
0171 {
0172 template <typename Initiation, typename RawCompletionToken, typename... Args>
0173 static auto initiate(Initiation&& initiation,
0174 RawCompletionToken&& token, Args&&... args)
0175 -> decltype(
0176 async_initiate<
0177 conditional_t<
0178 is_const<remove_reference_t<RawCompletionToken>>::value,
0179 const CompletionToken, CompletionToken>,
0180 Signatures...>(
0181 declval<detail::initiate_cancel_after_timer<
0182 decay_t<Initiation>, Clock, WaitTraits, Executor, Signatures...>>(),
0183 token.token_, &token.timer_, token.timeout_,
0184 token.cancel_type_, static_cast<Args&&>(args)...))
0185 {
0186 return async_initiate<
0187 conditional_t<
0188 is_const<remove_reference_t<RawCompletionToken>>::value,
0189 const CompletionToken, CompletionToken>,
0190 Signatures...>(
0191 detail::initiate_cancel_after_timer<
0192 decay_t<Initiation>, Clock, WaitTraits, Executor, Signatures...>(
0193 static_cast<Initiation&&>(initiation)),
0194 token.token_, &token.timer_, token.timeout_,
0195 token.cancel_type_, static_cast<Args&&>(args)...);
0196 }
0197 };
0198
0199 template <typename Clock, typename WaitTraits, typename... Signatures>
0200 struct async_result<partial_cancel_after<Clock, WaitTraits>, Signatures...>
0201 {
0202 template <typename Initiation, typename RawCompletionToken, typename... Args>
0203 static auto initiate(Initiation&& initiation,
0204 RawCompletionToken&& token, Args&&... args)
0205 -> decltype(
0206 async_initiate<
0207 const cancel_after_t<
0208 default_completion_token_t<associated_executor_t<Initiation>>,
0209 Clock, WaitTraits>&,
0210 Signatures...>(
0211 static_cast<Initiation&&>(initiation),
0212 cancel_after_t<
0213 default_completion_token_t<associated_executor_t<Initiation>>,
0214 Clock, WaitTraits>(
0215 default_completion_token_t<associated_executor_t<Initiation>>{},
0216 token.timeout_, token.cancel_type_),
0217 static_cast<Args&&>(args)...))
0218 {
0219 return async_initiate<
0220 const cancel_after_t<
0221 default_completion_token_t<associated_executor_t<Initiation>>,
0222 Clock, WaitTraits>&,
0223 Signatures...>(
0224 static_cast<Initiation&&>(initiation),
0225 cancel_after_t<
0226 default_completion_token_t<associated_executor_t<Initiation>>,
0227 Clock, WaitTraits>(
0228 default_completion_token_t<associated_executor_t<Initiation>>{},
0229 token.timeout_, token.cancel_type_),
0230 static_cast<Args&&>(args)...);
0231 }
0232 };
0233
0234 template <typename Clock, typename WaitTraits,
0235 typename Executor, typename... Signatures>
0236 struct async_result<
0237 partial_cancel_after_timer<Clock, WaitTraits, Executor>, Signatures...>
0238 {
0239 template <typename Initiation, typename RawCompletionToken, typename... Args>
0240 static auto initiate(Initiation&& initiation,
0241 RawCompletionToken&& token, Args&&... args)
0242 -> decltype(
0243 async_initiate<Signatures...>(
0244 static_cast<Initiation&&>(initiation),
0245 cancel_after_timer<
0246 default_completion_token_t<associated_executor_t<Initiation>>,
0247 Clock, WaitTraits, Executor>(
0248 default_completion_token_t<associated_executor_t<Initiation>>{},
0249 token.timer_, token.timeout_, token.cancel_type_),
0250 static_cast<Args&&>(args)...))
0251 {
0252 return async_initiate<Signatures...>(
0253 static_cast<Initiation&&>(initiation),
0254 cancel_after_timer<
0255 default_completion_token_t<associated_executor_t<Initiation>>,
0256 Clock, WaitTraits, Executor>(
0257 default_completion_token_t<associated_executor_t<Initiation>>{},
0258 token.timer_, token.timeout_, token.cancel_type_),
0259 static_cast<Args&&>(args)...);
0260 }
0261 };
0262
0263 #endif
0264
0265 }
0266 }
0267
0268 #include <boost/asio/detail/pop_options.hpp>
0269
0270 #endif