AK: Add a Formatter for Checked

This goes in Format.h instead of Checked.h, to avoid an include cycle.
This commit is contained in:
Sam Atkins 2025-06-17 15:48:16 +01:00 committed by Jelle Raaijmakers
commit 26105b8b11
Notes: github-actions[bot] 2025-06-17 18:45:18 +00:00
2 changed files with 66 additions and 0 deletions

View file

@ -603,6 +603,16 @@ struct Formatter<nullptr_t> : Formatter<FlatPtr> {
}
};
template<typename T>
struct Formatter<Checked<T>> : Formatter<T> {
ErrorOr<void> format(FormatBuilder& builder, Checked<T> value)
{
if (value.has_overflow())
return builder.put_string("{ OVERFLOW }"sv);
return Formatter<T>::format(builder, value.value());
}
};
ErrorOr<void> vformat(StringBuilder&, StringView fmtstr, TypeErasedFormatParams&);
void vout(FILE*, StringView fmtstr, TypeErasedFormatParams&, bool newline = false);

View file

@ -417,3 +417,59 @@ TEST_CASE(format_utf32)
EXPECT_EQ(ByteString::formatted("{:6d}", U'a'), " 97");
EXPECT_EQ(ByteString::formatted("{:#x}", U'\U0001F41E'), "0x1f41e");
}
TEST_CASE(format_checked)
{
EXPECT_EQ(ByteString::formatted("{}", Checked<i32> { 100 }), "100");
EXPECT_EQ(ByteString::formatted("{}", Checked<u32> { 100 }), "100");
EXPECT_EQ(ByteString::formatted("{}", Checked<i32> { -1234 }), "-1234");
{
Checked<i8> c = 127;
EXPECT_EQ(ByteString::formatted("{}", c), "127");
c.add(100);
EXPECT_EQ(ByteString::formatted("{}", c), "{ OVERFLOW }");
}
{
Checked<i16> c = 32767;
EXPECT_EQ(ByteString::formatted("{}", c), "32767");
c.add(100);
EXPECT_EQ(ByteString::formatted("{}", c), "{ OVERFLOW }");
}
{
Checked<i32> c = 2147483647;
EXPECT_EQ(ByteString::formatted("{}", c), "2147483647");
c.add(100);
EXPECT_EQ(ByteString::formatted("{}", c), "{ OVERFLOW }");
}
{
Checked<i64> c = 9223372036854775807;
EXPECT_EQ(ByteString::formatted("{}", c), "9223372036854775807");
c.add(100);
EXPECT_EQ(ByteString::formatted("{}", c), "{ OVERFLOW }");
}
{
Checked<u8> c = 255u;
EXPECT_EQ(ByteString::formatted("{}", c), "255");
c.add(100);
EXPECT_EQ(ByteString::formatted("{}", c), "{ OVERFLOW }");
}
{
Checked<u16> c = 65535u;
EXPECT_EQ(ByteString::formatted("{}", c), "65535");
c.add(100);
EXPECT_EQ(ByteString::formatted("{}", c), "{ OVERFLOW }");
}
{
Checked<u32> c = 4294967295u;
EXPECT_EQ(ByteString::formatted("{}", c), "4294967295");
c.add(100);
EXPECT_EQ(ByteString::formatted("{}", c), "{ OVERFLOW }");
}
{
Checked<u64> c = 18446744073709551615u;
EXPECT_EQ(ByteString::formatted("{}", c), "18446744073709551615");
c.add(100);
EXPECT_EQ(ByteString::formatted("{}", c), "{ OVERFLOW }");
}
}