18 using source_duration = std::chrono::duration<Rep, Period>;
19 using target_rep =
typename ToDuration::rep;
21 if constexpr (std::is_same_v<source_duration, ToDuration>)
24 using floating_duration = std::chrono::duration<long double, typename ToDuration::period>;
26 auto const count = floating_duration(value).count();
27 if (!std::isfinite(count))
28 return unexpected(std::make_error_code(std::errc::invalid_argument));
30 if constexpr (std::is_integral_v<target_rep>)
32 auto const minimum =
static_cast<long double>((std::numeric_limits<target_rep>::lowest)());
33 auto const upper_bound =
static_cast<long double>((std::numeric_limits<target_rep>::max)()) + 1.0L;
34 if (count < minimum || count >= upper_bound)
35 return unexpected(std::make_error_code(std::errc::value_too_large));
39 auto const minimum =
static_cast<long double>((std::numeric_limits<target_rep>::lowest)());
40 auto const maximum =
static_cast<long double>((std::numeric_limits<target_rep>::max)());
41 if (count < minimum || count > maximum)
42 return unexpected(std::make_error_code(std::errc::value_too_large));
45 return ToDuration(
static_cast<target_rep
>(count));
53 if (delay <= Duration::zero())
56 auto const current = now.time_since_epoch().count();
57 auto const delta = delay.count();
58 auto const maximum = (std::numeric_limits<typename Duration::rep>::max)();
59 if (current > maximum - delta)
60 return unexpected(std::make_error_code(std::errc::value_too_large));
61 return std::chrono::time_point<Clock, Duration>(Duration(current + delta));