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