|
20 | 20 | namespace clang {
|
21 | 21 | namespace mrdocs {
|
22 | 22 |
|
| 23 | +/** Formats a duration into a human-readable string. |
| 24 | +
|
| 25 | + This function takes a `std::chrono::duration` object and formats it into a |
| 26 | + string that represents the duration in a human-readable format. The format |
| 27 | + includes hours, minutes, seconds, and milliseconds as appropriate. |
| 28 | +
|
| 29 | + @param delta The duration to format. |
| 30 | + @return A string representing the formatted duration. |
| 31 | + */ |
23 | 32 | template <class Rep, class Period>
|
24 | 33 | std::string
|
25 | 34 | format_duration(
|
26 | 35 | std::chrono::duration<Rep, Period> delta)
|
27 | 36 | {
|
28 |
| - auto delta_ms = std::chrono::duration_cast< |
29 |
| - std::chrono::milliseconds>(delta).count(); |
30 |
| - if (delta_ms < 1000) |
| 37 | + auto delta_ms = std::chrono::duration_cast<std::chrono::milliseconds>(delta); |
| 38 | + if (delta < std::chrono::seconds(1)) |
31 | 39 | {
|
32 |
| - return fmt::format("{} ms", delta_ms); |
| 40 | + return fmt::format("{}ms", delta_ms.count()); |
33 | 41 | }
|
34 |
| - else |
| 42 | + |
| 43 | + auto delta_s = std::chrono::duration_cast<std::chrono::seconds>(delta); |
| 44 | + if (delta < std::chrono::minutes(1)) |
35 | 45 | {
|
36 |
| - double const delta_s = static_cast<double>(delta_ms) / 1000.0; |
37 |
| - return fmt::format("{:.02f} s", delta_s); |
| 46 | + delta_ms -= delta_s; |
| 47 | + return fmt::format("{}s {}ms", delta_s.count(), delta_ms.count()); |
38 | 48 | }
|
| 49 | + |
| 50 | + auto delta_min = std::chrono::duration_cast<std::chrono::minutes>(delta); |
| 51 | + if (delta < std::chrono::hours(1)) |
| 52 | + { |
| 53 | + delta_ms -= delta_s; |
| 54 | + delta_s -= delta_min; |
| 55 | + return fmt::format("{}min {}s {}ms", delta_min.count(), delta_s.count(), delta_ms.count()); |
| 56 | + } |
| 57 | + |
| 58 | + auto delta_h = std::chrono::duration_cast<std::chrono::hours>(delta); |
| 59 | + delta_ms -= delta_s; |
| 60 | + delta_s -= delta_min; |
| 61 | + delta_min -= delta_h; |
| 62 | + return fmt::format("{}h {}min {}s {}ms", delta_h.count(), delta_min.count(), delta_s.count(), delta_ms.count()); |
39 | 63 | }
|
40 | 64 |
|
41 | 65 | } // mrdocs
|
|
0 commit comments