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>& incoming_duration)
noexcept {
49 using IncomingDuration = std::chrono::duration<Rep, Period>;
54 static_assert(std::is_constructible_v<Duration, IncomingDuration>);
56 if (std::chrono::duration_cast<IncomingDuration>(Duration::max()) <= incoming_duration) {
60 if (incoming_duration < IncomingDuration::zero()) {
64 return Deadline{SumWithSaturation(Clock::now(), std::chrono::duration_cast<Duration>(incoming_duration))};
48 static Deadline
FromDuration(
const std::chrono::duration<Rep, Period>& incoming_duration)
noexcept {
…}
72 template <
typename Clock,
typename Duration>
73 static Deadline
FromTimePoint(
const std::chrono::time_point<Clock, Duration>& time_point)
noexcept {
74 return FromDuration(time_point - Clock::now());
73 static Deadline
FromTimePoint(
const std::chrono::time_point<Clock, Duration>& time_point)
noexcept {
…}
79 constexpr static Deadline FromTimePoint(
const TimePoint& time_point)
noexcept {
return Deadline(time_point); }
83 constexpr static Deadline
Passed()
noexcept {
return Deadline{kPassed}; }
85 constexpr bool operator==(
const Deadline& r)
const noexcept {
return value_ == r.value_; }
87 constexpr bool operator<(
const Deadline& r)
const noexcept {
90 return value_ < r.value_;
94 constexpr explicit Deadline(TimePoint value)
noexcept : value_(value) {}
96 constexpr static TimePoint SumWithSaturation(
const TimePoint& time_point, Duration duration)
noexcept {
97 return TimePoint::max() - time_point < duration ? TimePoint::max() : time_point + duration;
100 static constexpr TimePoint kUnreachable = TimePoint::max();
101 static constexpr TimePoint kPassed = TimePoint::min();
103 TimePoint value_{kUnreachable};