From 67a579aab01b605f08d0d457efff2f847c7b0a9a Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Tue, 21 Sep 2021 23:07:03 +0200 Subject: [PATCH] AK: Add a basic formatter for wchar_t --- AK/Format.cpp | 13 +++++++++++++ AK/Format.h | 4 ++++ Tests/AK/TestFormat.cpp | 14 ++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/AK/Format.cpp b/AK/Format.cpp index 8e691a5e36..c4ebe8e59f 100644 --- a/AK/Format.cpp +++ b/AK/Format.cpp @@ -688,6 +688,19 @@ void Formatter::format(FormatBuilder& builder, char value) return formatter.format(builder, { &value, 1 }); } } +void Formatter::format(FormatBuilder& builder, wchar_t value) +{ + if (m_mode == Mode::Binary || m_mode == Mode::BinaryUppercase || m_mode == Mode::Decimal || m_mode == Mode::Octal || m_mode == Mode::Hexadecimal || m_mode == Mode::HexadecimalUppercase) { + Formatter formatter { *this }; + return formatter.format(builder, static_cast(value)); + } else { + StringBuilder codepoint; + codepoint.append_code_point(value); + + Formatter formatter { *this }; + return formatter.format(builder, codepoint.to_string()); + } +} void Formatter::format(FormatBuilder& builder, bool value) { if (m_mode == Mode::Binary || m_mode == Mode::BinaryUppercase || m_mode == Mode::Decimal || m_mode == Mode::Octal || m_mode == Mode::Hexadecimal || m_mode == Mode::HexadecimalUppercase) { diff --git a/AK/Format.h b/AK/Format.h index 657be6d8e3..953e062b8b 100644 --- a/AK/Format.h +++ b/AK/Format.h @@ -423,6 +423,10 @@ struct Formatter : StandardFormatter { void format(FormatBuilder&, char value); }; template<> +struct Formatter : StandardFormatter { + void format(FormatBuilder& builder, wchar_t value); +}; +template<> struct Formatter : StandardFormatter { void format(FormatBuilder&, bool value); }; diff --git a/Tests/AK/TestFormat.cpp b/Tests/AK/TestFormat.cpp index 28696cce28..a4cc1f642f 100644 --- a/Tests/AK/TestFormat.cpp +++ b/Tests/AK/TestFormat.cpp @@ -323,3 +323,17 @@ TEST_CASE(vector_format) EXPECT_EQ(String::formatted("{}", v), "[ [ 1, 2 ], [ 3, 4 ] ]"); } } + +TEST_CASE(format_wchar) +{ + EXPECT_EQ(String::formatted("{}", L'a'), "a"); + EXPECT_EQ(String::formatted("{}", L'\U0001F41E'), "\xF0\x9F\x90\x9E"); + EXPECT_EQ(String::formatted("{:x}", L'a'), "61"); + EXPECT_EQ(String::formatted("{:x}", L'\U0001F41E'), "1f41e"); + EXPECT_EQ(String::formatted("{:d}", L'a'), "97"); + EXPECT_EQ(String::formatted("{:d}", L'\U0001F41E'), "128030"); + + EXPECT_EQ(String::formatted("{:6}", L'a'), "a "); + EXPECT_EQ(String::formatted("{:6d}", L'a'), " 97"); + EXPECT_EQ(String::formatted("{:#x}", L'\U0001F41E'), "0x1f41e"); +}