Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-17 08:39:20

0001 //
0002 // Copyright (c) 2025 Klemens Morgenstern (klemens.morgenstern@gmx.net)
0003 //
0004 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0005 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
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 //BOOST_COBALT_IO_IO_SLEEP_HPP