LCOV - code coverage report
Current view: top level - corosio - wait_traits.hpp (source / functions) Coverage Total Hit
Test: coverage_remapped.info Lines: 100.0 % 2 2
Test Date: 2026-08-06 12:46:30 Functions: 100.0 % 3 3

           TLA  Line data    Source code
       1                 : //
       2                 : // Copyright (c) 2026 Steve Gerbino
       3                 : //
       4                 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       5                 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       6                 : //
       7                 : // Official repository: https://github.com/cppalliance/corosio
       8                 : //
       9                 : 
      10                 : #ifndef BOOST_COROSIO_WAIT_TRAITS_HPP
      11                 : #define BOOST_COROSIO_WAIT_TRAITS_HPP
      12                 : 
      13                 : #include <boost/corosio/detail/config.hpp>
      14                 : 
      15                 : #include <concepts>
      16                 : 
      17                 : namespace boost::corosio {
      18                 : 
      19                 : /** Default wait traits for clock-based delays.
      20                 : 
      21                 :     Controls how much of the remaining time a single underlying
      22                 :     steady-clock wait may cover before `Clock::now()` is re-read.
      23                 :     A larger value costs fewer wakeups; a smaller value bounds how
      24                 :     late an adjustment of `Clock` ( e.g. a stepped time-of-day
      25                 :     clock ) is observed. The default covers the full remaining
      26                 :     duration, which is exact for clocks that advance in lockstep
      27                 :     with the machine's monotonic clock.
      28                 : 
      29                 :     @par Example
      30                 :     @code
      31                 :     // Observe wall-clock steps within one second
      32                 :     struct capped_traits
      33                 :     {
      34                 :         static std::chrono::system_clock::duration
      35                 :         to_wait_duration(std::chrono::system_clock::duration d)
      36                 :         {
      37                 :             return (std::min)(d,
      38                 :                 std::chrono::system_clock::duration(
      39                 :                     std::chrono::seconds(1)));
      40                 :         }
      41                 :     };
      42                 : 
      43                 :     auto [ec] = co_await delay<capped_traits>(
      44                 :         std::chrono::system_clock::now() + std::chrono::hours(1));
      45                 :     @endcode
      46                 : 
      47                 :     @tparam Clock The clock type whose durations are converted.
      48                 : 
      49                 :     @see delay
      50                 : */
      51                 : template<class Clock>
      52                 : struct wait_traits
      53                 : {
      54                 :     /** Convert a remaining duration into a wait duration.
      55                 : 
      56                 :         Should return a positive duration when @p d is positive; a
      57                 :         non-positive result degrades to reactor-rate re-checking.
      58                 : 
      59                 :         @par Preconditions
      60                 :         Must not throw and must not block — invoked on the
      61                 :         io_context's run thread, including from the timer
      62                 :         completion path.
      63                 : 
      64                 :         @param d The remaining time until the deadline.
      65                 : 
      66                 :         @return The duration the next underlying wait may cover.
      67                 :     */
      68                 :     static typename Clock::duration
      69 HIT           5 :     to_wait_duration(typename Clock::duration d)
      70                 :     {
      71               5 :         return d;
      72                 :     }
      73                 : };
      74                 : 
      75                 : /** Concept for wait-traits policies usable with `Clock`.
      76                 : 
      77                 :     Satisfied when `Traits::to_wait_duration` accepts a
      78                 :     `Clock::duration` and returns something convertible back to it.
      79                 :     `Traits::to_wait_duration` must not throw.
      80                 : */
      81                 : template<class Traits, class Clock>
      82                 : concept WaitTraits = requires(typename Clock::duration d)
      83                 : {
      84                 :     { Traits::to_wait_duration(d) }
      85                 :         -> std::convertible_to<typename Clock::duration>;
      86                 : };
      87                 : 
      88                 : } // namespace boost::corosio
      89                 : 
      90                 : #endif
        

Generated by: LCOV version 2.3