File indexing completed on 2025-04-26 08:25:29
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef BOOST_ASIO_CANCEL_AFTER_HPP
0012 #define BOOST_ASIO_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/basic_waitable_timer.hpp>
0020 #include <boost/asio/cancellation_type.hpp>
0021 #include <boost/asio/detail/chrono.hpp>
0022 #include <boost/asio/detail/type_traits.hpp>
0023 #include <boost/asio/wait_traits.hpp>
0024
0025 #include <boost/asio/detail/push_options.hpp>
0026
0027 namespace boost {
0028 namespace asio {
0029
0030
0031
0032
0033
0034
0035
0036 template <typename CompletionToken, typename Clock,
0037 typename WaitTraits = boost::asio::wait_traits<Clock>>
0038 class cancel_after_t
0039 {
0040 public:
0041
0042 template <typename T>
0043 cancel_after_t(T&& completion_token, const typename Clock::duration& timeout,
0044 cancellation_type_t cancel_type = cancellation_type::terminal)
0045 : token_(static_cast<T&&>(completion_token)),
0046 timeout_(timeout),
0047 cancel_type_(cancel_type)
0048 {
0049 }
0050
0051
0052 CompletionToken token_;
0053 typename Clock::duration timeout_;
0054 cancellation_type_t cancel_type_;
0055 };
0056
0057
0058
0059
0060
0061
0062
0063 template <typename CompletionToken, typename Clock,
0064 typename WaitTraits = boost::asio::wait_traits<Clock>,
0065 typename Executor = any_io_executor>
0066 class cancel_after_timer
0067 {
0068 public:
0069
0070 template <typename T>
0071 cancel_after_timer(T&& completion_token,
0072 basic_waitable_timer<Clock, WaitTraits, Executor>& timer,
0073 const typename Clock::duration& timeout,
0074 cancellation_type_t cancel_type = cancellation_type::terminal)
0075 : token_(static_cast<T&&>(completion_token)),
0076 timer_(timer),
0077 timeout_(timeout),
0078 cancel_type_(cancel_type)
0079 {
0080 }
0081
0082
0083 CompletionToken token_;
0084 basic_waitable_timer<Clock, WaitTraits, Executor>& timer_;
0085 typename Clock::duration timeout_;
0086 cancellation_type_t cancel_type_;
0087 };
0088
0089
0090
0091
0092
0093
0094
0095
0096 template <typename Clock, typename WaitTraits = boost::asio::wait_traits<Clock>>
0097 class partial_cancel_after
0098 {
0099 public:
0100
0101 explicit partial_cancel_after(const typename Clock::duration& timeout,
0102 cancellation_type_t cancel_type = cancellation_type::terminal)
0103 : timeout_(timeout),
0104 cancel_type_(cancel_type)
0105 {
0106 }
0107
0108
0109
0110 template <typename CompletionToken>
0111 BOOST_ASIO_NODISCARD inline
0112 cancel_after_t<decay_t<CompletionToken>, Clock, WaitTraits>
0113 operator()(CompletionToken&& completion_token) const
0114 {
0115 return cancel_after_t<decay_t<CompletionToken>, Clock, WaitTraits>(
0116 static_cast<CompletionToken&&>(completion_token),
0117 timeout_, cancel_type_);
0118 }
0119
0120
0121 typename Clock::duration timeout_;
0122 cancellation_type_t cancel_type_;
0123 };
0124
0125
0126
0127
0128
0129
0130
0131
0132 template <typename Clock, typename WaitTraits = boost::asio::wait_traits<Clock>,
0133 typename Executor = any_io_executor>
0134 class partial_cancel_after_timer
0135 {
0136 public:
0137
0138 explicit partial_cancel_after_timer(
0139 basic_waitable_timer<Clock, WaitTraits, Executor>& timer,
0140 const typename Clock::duration& timeout,
0141 cancellation_type_t cancel_type = cancellation_type::terminal)
0142 : timer_(timer),
0143 timeout_(timeout),
0144 cancel_type_(cancel_type)
0145 {
0146 }
0147
0148
0149
0150 template <typename CompletionToken>
0151 BOOST_ASIO_NODISCARD inline
0152 cancel_after_timer<decay_t<CompletionToken>, Clock, WaitTraits, Executor>
0153 operator()(CompletionToken&& completion_token) const
0154 {
0155 return cancel_after_timer<decay_t<CompletionToken>,
0156 Clock, WaitTraits, Executor>(
0157 static_cast<CompletionToken&&>(completion_token),
0158 timeout_, cancel_type_);
0159 }
0160
0161
0162 basic_waitable_timer<Clock, WaitTraits, Executor>& timer_;
0163 typename Clock::duration timeout_;
0164 cancellation_type_t cancel_type_;
0165 };
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177 template <typename Rep, typename Period>
0178 BOOST_ASIO_NODISCARD inline partial_cancel_after<chrono::steady_clock>
0179 cancel_after(const chrono::duration<Rep, Period>& timeout,
0180 cancellation_type_t cancel_type = cancellation_type::terminal)
0181 {
0182 return partial_cancel_after<chrono::steady_clock>(timeout, cancel_type);
0183 }
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195 template <typename Clock, typename WaitTraits,
0196 typename Executor, typename Rep, typename Period>
0197 BOOST_ASIO_NODISCARD inline
0198 partial_cancel_after_timer<Clock, WaitTraits, Executor>
0199 cancel_after(basic_waitable_timer<Clock, WaitTraits, Executor>& timer,
0200 const chrono::duration<Rep, Period>& timeout,
0201 cancellation_type_t cancel_type = cancellation_type::terminal)
0202 {
0203 return partial_cancel_after_timer<Clock, WaitTraits, Executor>(
0204 timer, timeout, cancel_type);
0205 }
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217 template <typename Rep, typename Period, typename CompletionToken>
0218 BOOST_ASIO_NODISCARD inline
0219 cancel_after_t<decay_t<CompletionToken>, chrono::steady_clock>
0220 cancel_after(const chrono::duration<Rep, Period>& timeout,
0221 CompletionToken&& completion_token)
0222 {
0223 return cancel_after_t<decay_t<CompletionToken>, chrono::steady_clock>(
0224 static_cast<CompletionToken&&>(completion_token),
0225 timeout, cancellation_type::terminal);
0226 }
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238 template <typename Rep, typename Period, typename CompletionToken>
0239 BOOST_ASIO_NODISCARD inline
0240 cancel_after_t<decay_t<CompletionToken>, chrono::steady_clock>
0241 cancel_after(const chrono::duration<Rep, Period>& timeout,
0242 cancellation_type_t cancel_type, CompletionToken&& completion_token)
0243 {
0244 return cancel_after_t<decay_t<CompletionToken>, chrono::steady_clock>(
0245 static_cast<CompletionToken&&>(completion_token), timeout, cancel_type);
0246 }
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258 template <typename Clock, typename WaitTraits, typename Executor,
0259 typename Rep, typename Period, typename CompletionToken>
0260 BOOST_ASIO_NODISCARD inline
0261 cancel_after_timer<decay_t<CompletionToken>, Clock, WaitTraits, Executor>
0262 cancel_after(basic_waitable_timer<Clock, WaitTraits, Executor>& timer,
0263 const chrono::duration<Rep, Period>& timeout,
0264 CompletionToken&& completion_token)
0265 {
0266 return cancel_after_timer<decay_t<CompletionToken>,
0267 Clock, WaitTraits, Executor>(
0268 static_cast<CompletionToken&&>(completion_token),
0269 timer, timeout, cancellation_type::terminal);
0270 }
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282 template <typename Clock, typename WaitTraits, typename Executor,
0283 typename Rep, typename Period, typename CompletionToken>
0284 BOOST_ASIO_NODISCARD inline
0285 cancel_after_timer<decay_t<CompletionToken>, chrono::steady_clock>
0286 cancel_after(basic_waitable_timer<Clock, WaitTraits, Executor>& timer,
0287 const chrono::duration<Rep, Period>& timeout,
0288 cancellation_type_t cancel_type, CompletionToken&& completion_token)
0289 {
0290 return cancel_after_timer<decay_t<CompletionToken>,
0291 Clock, WaitTraits, Executor>(
0292 static_cast<CompletionToken&&>(completion_token),
0293 timer, timeout, cancel_type);
0294 }
0295
0296 }
0297 }
0298
0299 #include <boost/asio/detail/pop_options.hpp>
0300
0301 #include <boost/asio/impl/cancel_after.hpp>
0302
0303 #endif