28void toDuration(std::chrono::duration<Rep, Period>& duration,
const std::string& s)
30 using std::chrono::duration_cast;
31 using namespace std::chrono_literals;
32 using S = std::chrono::duration<Rep>;
33 constexpr std::array<std::pair<std::string_view, S>, 9> unitMap{{
36 {
"ns", duration_cast<S>(std::chrono::nanoseconds(1))},
37 {
"us", duration_cast<S>(std::chrono::microseconds(1))},
38 {
"ms", duration_cast<S>(std::chrono::milliseconds(1))},
39 {
"min", duration_cast<S>(std::chrono::minutes(1))},
40 {
"h", duration_cast<S>(std::chrono::hours(1))},
42 {
"d", duration_cast<S>(std::chrono::hours(24))},
43 {
"y", duration_cast<S>(std::chrono::seconds(31556952))}
46 const auto unitIt = std::find_if(s.rbegin(), s.rend(), [] (
const auto& c) { return !std::isalpha(c); });
47 const auto unitPos = s.size() - std::distance(s.rbegin(), unitIt);
48 const auto number = std::stod(s.substr(0, unitPos));
49 const auto unit = s.substr(unitPos);
50 const auto conversion = [&] () {
51 const auto it = std::find_if(unitMap.begin(), unitMap.end(), [u=std::string_view{unit}] (
const auto& p) {
54 if (it == unitMap.end())
55 DUNE_THROW(Dune::InvalidStateException,
"Unsupported unit " << unit <<
".");
58 duration = duration_cast<std::chrono::duration<Rep, Period>>(number*conversion);