| 15950 | struct RowBreak {}; |
| 15951 | |
| 15952 | class Duration { |
| 15953 | enum class Unit { |
| 15954 | Auto, |
| 15955 | Nanoseconds, |
| 15956 | Microseconds, |
| 15957 | Milliseconds, |
| 15958 | Seconds, |
| 15959 | Minutes |
| 15960 | }; |
| 15961 | static const uint64_t s_nanosecondsInAMicrosecond = 1000; |
| 15962 | static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond; |
| 15963 | static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond; |
| 15964 | static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond; |
| 15965 | |
| 15966 | uint64_t m_inNanoseconds; |
| 15967 | Unit m_units; |
| 15968 | |
| 15969 | public: |
| 15970 | explicit Duration(double inNanoseconds, Unit units = Unit::Auto) |
| 15971 | : Duration(static_cast<uint64_t>(inNanoseconds), units) { |
| 15972 | } |
| 15973 | |
| 15974 | explicit Duration(uint64_t inNanoseconds, Unit units = Unit::Auto) |
| 15975 | : m_inNanoseconds(inNanoseconds), |
| 15976 | m_units(units) { |
| 15977 | if (m_units == Unit::Auto) { |
| 15978 | if (m_inNanoseconds < s_nanosecondsInAMicrosecond) |
| 15979 | m_units = Unit::Nanoseconds; |
| 15980 | else if (m_inNanoseconds < s_nanosecondsInAMillisecond) |
| 15981 | m_units = Unit::Microseconds; |
| 15982 | else if (m_inNanoseconds < s_nanosecondsInASecond) |
| 15983 | m_units = Unit::Milliseconds; |
| 15984 | else if (m_inNanoseconds < s_nanosecondsInAMinute) |
| 15985 | m_units = Unit::Seconds; |
| 15986 | else |
| 15987 | m_units = Unit::Minutes; |
| 15988 | } |
| 15989 | |
| 15990 | } |
| 15991 | |
| 15992 | auto value() const -> double { |
| 15993 | switch (m_units) { |
| 15994 | case Unit::Microseconds: |
| 15995 | return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMicrosecond); |
| 15996 | case Unit::Milliseconds: |
| 15997 | return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMillisecond); |
| 15998 | case Unit::Seconds: |
| 15999 | return m_inNanoseconds / static_cast<double>(s_nanosecondsInASecond); |
| 16000 | case Unit::Minutes: |
| 16001 | return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMinute); |
| 16002 | default: |
| 16003 | return static_cast<double>(m_inNanoseconds); |
| 16004 | } |
| 16005 | } |
| 16006 | auto unitsAsString() const -> std::string { |
| 16007 | switch (m_units) { |
| 16008 | case Unit::Nanoseconds: |
| 16009 | return "ns"; |
no outgoing calls
no test coverage detected