36 using Duration = std::remove_cvref_t<
decltype(t)>;
37 auto trim = s.find_first_not_of(
"+0 ");
38 if (trim == std::string_view::npos)
40 s.remove_prefix(trim);
41 const auto *val_end = s.data() + s.size();
43 auto res =
from_chars(s.data(), val_end, value);
44 if (res.ec != std::errc())
46 "Invalid value '" + std::string(res.ptr, val_end) +
"' for type '" +
48 "': " + std::make_error_code(res.ec).message(),
50 std::string_view remainder{res.ptr, val_end};
51 auto end = remainder.find_first_of(
"+-0123456789. ");
52 std::string_view units = remainder.substr(0, end);
53 using std::chrono::duration;
54 auto cast = [](
auto t) {
return std::chrono::round<Duration>(t); };
55 if (units ==
"s" || units.empty())
56 t += cast(duration<
double, std::ratio<1, 1>>{value});
57 else if (units ==
"ms")
58 t += cast(duration<
double, std::ratio<1, 1'000>>{value});
59 else if (units ==
"us" || units ==
"µs")
60 t += cast(duration<
double, std::ratio<1, 1'000'000>>{value});
61 else if (units ==
"ns")
62 t += cast(duration<
double, std::ratio<1, 1'000'000'000>>{value});
63 else if (units ==
"min")
64 t += cast(duration<
double, std::ratio<60, 1>>{value});
65 else if (units ==
"h")
66 t += cast(duration<
double, std::ratio<3'600, 1>>{value});
69 "Invalid units '" + std::string(units) +
"' for duration", units);
70 if (end == std::string_view::npos)
72 return remainder.substr(end);