Skip to content

Commit 298e934

Browse files
tcl3gmta
authored andcommitted
AK: Add human_readable_short_time()
This gives a more compact version of `human_readable_time()` to nanosecond precision.
1 parent c845e2c commit 298e934

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

AK/NumberFormat.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,51 @@ String human_readable_time(Duration duration)
104104
return MUST(builder.to_string());
105105
}
106106

107+
String human_readable_short_time(Duration duration)
108+
{
109+
auto nanoseconds = duration.to_nanoseconds();
110+
if (nanoseconds < 1'000)
111+
return MUST(String::formatted("{}ns", nanoseconds));
112+
if (nanoseconds < 1'000'000)
113+
return MUST(String::formatted("{:.3}µs", static_cast<double>(nanoseconds) / 1'000.0));
114+
if (nanoseconds < 1'000'000'000)
115+
return MUST(String::formatted("{:.3}ms", static_cast<double>(nanoseconds) / 1'000'000.0));
116+
if (nanoseconds < 60'000'000'000)
117+
return MUST(String::formatted("{:.3}s", static_cast<double>(nanoseconds) / 1'000'000'000.0));
118+
119+
auto days = nanoseconds / 86'400'000'000'000;
120+
nanoseconds = nanoseconds % 86'400'000'000'000;
121+
auto hours = nanoseconds / 3'600'000'000'000;
122+
nanoseconds = nanoseconds % 3'600'000'000'000;
123+
auto minutes = nanoseconds / 60'000'000'000;
124+
nanoseconds = nanoseconds % 60'000'000'000;
125+
auto seconds = static_cast<double>(nanoseconds) / 1'000'000'000.0;
126+
127+
StringBuilder builder;
128+
if (days > 0)
129+
builder.appendff("{}d", days);
130+
131+
if (hours > 0) {
132+
if (!builder.is_empty())
133+
builder.append(' ');
134+
builder.appendff("{}h", hours);
135+
}
136+
137+
if (minutes > 0) {
138+
if (!builder.is_empty())
139+
builder.append(' ');
140+
builder.appendff("{}m", minutes);
141+
}
142+
143+
if (seconds > 0.0) {
144+
if (!builder.is_empty())
145+
builder.append(' ');
146+
builder.appendff("{:.3}s", seconds);
147+
}
148+
149+
return MUST(builder.to_string());
150+
}
151+
107152
String human_readable_digital_time(i64 time_in_seconds)
108153
{
109154
auto hours = time_in_seconds / 3600;

AK/NumberFormat.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@ String human_readable_quantity(u64 quantity, HumanReadableBasedOn based_on = Hum
2626

2727
String human_readable_size_long(u64 size, UseThousandsSeparator use_thousands_separator = UseThousandsSeparator::No);
2828
String human_readable_time(Duration);
29+
String human_readable_short_time(Duration);
2930
String human_readable_digital_time(i64 time_in_seconds);
3031

3132
}
3233

3334
#if USING_AK_GLOBALLY
3435
using AK::human_readable_digital_time;
3536
using AK::human_readable_quantity;
37+
using AK::human_readable_short_time;
3638
using AK::human_readable_size;
3739
using AK::human_readable_size_long;
3840
using AK::human_readable_time;

Tests/AK/TestNumberFormat.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,56 @@ TEST_CASE(base10_units)
133133
EXPECT_EQ(human_readable_size(1100, AK::HumanReadableBasedOn::Base10), "1.1 KB");
134134
EXPECT_EQ(human_readable_size(1000000, AK::HumanReadableBasedOn::Base10), "1.0 MB");
135135
}
136+
137+
TEST_CASE(human_readable_short_time)
138+
{
139+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_nanoseconds(0)), "0ns");
140+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_nanoseconds(1)), "1ns");
141+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_nanoseconds(99)), "99ns");
142+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_nanoseconds(999)), "999ns");
143+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_nanoseconds(1009)), "1.009µs");
144+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_nanoseconds(1099)), "1.099µs");
145+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_nanoseconds(1999)), "1.999µs");
146+
147+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_microseconds(1)), "1µs");
148+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_microseconds(999)), "999µs");
149+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_microseconds(1009)), "1.009ms");
150+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_microseconds(1099)), "1.099ms");
151+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_microseconds(1999)), "1.999ms");
152+
153+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(1)), "1ms");
154+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(99)), "99ms");
155+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(999)), "999ms");
156+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(1009)), "1.009s");
157+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(1099)), "1.099s");
158+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(1999)), "1.999s");
159+
160+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(1)), "1s");
161+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(1001)), "1.001s");
162+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(1999)), "1.999s");
163+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(59)), "59s");
164+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(59999)), "59.999s");
165+
166+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(60)), "1m");
167+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(60001)), "1m 0.001s");
168+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(61)), "1m 1s");
169+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(61001)), "1m 1.001s");
170+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_microseconds(61001001)), "1m 1.001s");
171+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(3599)), "59m 59s");
172+
173+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(3600)), "1h");
174+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(3601)), "1h 1s");
175+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(3600001)), "1h 0.001s");
176+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_microseconds(3601001001)), "1h 1.001s");
177+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(3661)), "1h 1m 1s");
178+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(3661)), "1h 1m 1s");
179+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(86399)), "23h 59m 59s");
180+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(86399001)), "23h 59m 59.001s");
181+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(86399999)), "23h 59m 59.999s");
182+
183+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(86400)), "1d");
184+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(86401)), "1d 1s");
185+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(86461)), "1d 1m 1s");
186+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_seconds(90061)), "1d 1h 1m 1s");
187+
EXPECT_EQ(human_readable_short_time(AK::Duration::from_milliseconds(90061001)), "1d 1h 1m 1.001s");
188+
}

0 commit comments

Comments
 (0)