16 using Clock = std::chrono::steady_clock;
17 using TimePoint = Clock::time_point;
18 using Duration = TimePoint::duration;
24 constexpr bool IsReachable()
const noexcept {
return value_ != kUnreachable; }
44 constexpr TimePoint
GetTimePoint()
const noexcept {
return value_; }
47 template <
typename Rep,
typename Period>
48 static Deadline
FromDuration(
const std::chrono::duration<Rep, Period>& duration)
noexcept {
49 return FromDuration(ToDurationSaturating(duration));
52 static Deadline FromDuration(
const Duration& duration)
noexcept {
53 if (duration < Duration::zero()) {
56 return Deadline{SumWithSaturation(Clock::now(), duration)};
64 template <
typename Clock,
typename Duration>
65 static Deadline
FromTimePoint(
const std::chrono::time_point<Clock, Duration>& time_point)
noexcept {
66 return FromDuration(time_point - Clock::now());
71 constexpr static Deadline FromTimePoint(
const TimePoint& time_point)
noexcept {
return Deadline(time_point); }
75 constexpr static Deadline
Passed()
noexcept {
return Deadline{kPassed}; }
77 constexpr bool operator==(
const Deadline& r)
const noexcept {
return value_ == r.value_; }
79 constexpr bool operator<(
const Deadline& r)
const noexcept {
82 return value_ < r.value_;
86 template <
typename Rep,
typename Period>
88 using FromDuration = std::chrono::duration<Rep, Period>;
92 static_assert(std::is_constructible_v<Duration, FromDuration>);
94 if (std::chrono::duration_cast<FromDuration>(Duration::max()) < from) {
95 return Duration::max();
98 if constexpr (std::is_signed_v<Rep>) {
99 if (from < std::chrono::duration_cast<FromDuration>(Duration::min())) {
100 return Duration::min();
104 return std::chrono::duration_cast<Duration>(from);
108 constexpr explicit Deadline(TimePoint value)
noexcept : value_(value) {}
110 constexpr static TimePoint SumWithSaturation(
const TimePoint& time_point, Duration duration)
noexcept {
111 return TimePoint::max() - time_point < duration ? TimePoint::max() : time_point + duration;
114 static constexpr TimePoint kUnreachable = TimePoint::max();
115 static constexpr TimePoint kPassed = TimePoint::min();
117 TimePoint value_{kUnreachable};