File indexing completed on 2026-08-17 08:39:20
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_COBALT_IO_SLEEP_HPP
0009 #define BOOST_COBALT_IO_SLEEP_HPP
0010
0011 #include <boost/cobalt/io/detail/config.hpp>
0012 #include <boost/cobalt/io/ops.hpp>
0013 #include <boost/cobalt/io/steady_timer.hpp>
0014 #include <boost/cobalt/io/system_timer.hpp>
0015
0016 namespace boost::cobalt::detail::io
0017 {
0018
0019 struct BOOST_COBALT_IO_DECL steady_sleep final : op<system::error_code>
0020 {
0021 steady_sleep(const std::chrono::steady_clock::time_point & tp);
0022 steady_sleep(const std::chrono::steady_clock::duration & du);
0023
0024 std::chrono::steady_clock::time_point tp;
0025
0026 void ready(handler<system::error_code> h) final override
0027 {
0028 if (tp < std::chrono::steady_clock::now())
0029 h({});
0030 }
0031 void initiate(completion_handler<system::error_code> h) final override;
0032 ~steady_sleep() = default;
0033
0034 std::optional< asio::basic_waitable_timer<std::chrono::steady_clock, asio::wait_traits<std::chrono::steady_clock>, executor> > timer_;
0035 };
0036
0037 struct BOOST_COBALT_IO_DECL system_sleep final : op<system::error_code>
0038 {
0039 system_sleep(const std::chrono::system_clock::time_point & tp);
0040 system_sleep(const std::chrono::system_clock::duration & du);
0041
0042 std::chrono::system_clock::time_point tp;
0043
0044 void ready(handler<system::error_code> h) final override
0045 {
0046 if (tp < std::chrono::system_clock::now())
0047 h({});
0048 }
0049
0050 void initiate(completion_handler<system::error_code> h) final override;
0051 ~system_sleep() = default;
0052
0053 std::optional<asio::basic_waitable_timer<std::chrono::system_clock, asio::wait_traits<std::chrono::system_clock>, executor> > timer_;
0054 };
0055
0056 }
0057
0058 namespace boost::cobalt::io
0059 {
0060
0061 [[nodiscard]] inline auto sleep(const std::chrono::steady_clock::duration & d) { return ::boost::cobalt::detail::io::steady_sleep{d};}
0062 [[nodiscard]] inline auto sleep(const std::chrono::steady_clock::time_point & tp) { return ::boost::cobalt::detail::io::steady_sleep{tp};}
0063 [[nodiscard]] inline auto sleep(const std::chrono::system_clock::time_point & tp) { return ::boost::cobalt::detail::io::system_sleep{tp};}
0064
0065 template<typename Duration>
0066 [[nodiscard]] inline auto sleep(const std::chrono::time_point<std::chrono::steady_clock, Duration> & tp)
0067 {
0068 return sleep(std::chrono::time_point_cast<std::chrono::steady_clock::duration >(tp));
0069 }
0070
0071 template<typename Duration>
0072 [[nodiscard]] inline auto sleep(const std::chrono::time_point<std::chrono::system_clock, Duration> & tp)
0073 {
0074 return sleep(std::chrono::time_point_cast<std::chrono::system_clock::duration >(tp));
0075 }
0076
0077 template<typename Rep, typename Period>
0078 [[nodiscard]] inline auto sleep(const std::chrono::duration<Rep, Period> & dur)
0079 {
0080 return sleep(std::chrono::duration_cast<std::chrono::steady_clock::duration >(dur));
0081 }
0082
0083 }
0084
0085 #endif