diff --git a/AK/Utf16View.h b/AK/Utf16View.h index c1323be942..66668c7500 100644 --- a/AK/Utf16View.h +++ b/AK/Utf16View.h @@ -71,6 +71,14 @@ public: { } + template + Utf16View(char16_t const (&code_units)[Size]) + : m_code_units( + reinterpret_cast(&code_units[0]), + code_units[Size - 1] == u'\0' ? Size - 1 : Size) + { + } + bool operator==(Utf16View const& other) const { return m_code_units == other.m_code_units; } enum class AllowInvalidCodeUnits { diff --git a/Tests/AK/TestUtf16.cpp b/Tests/AK/TestUtf16.cpp index b305370596..d6418c4d5d 100644 --- a/Tests/AK/TestUtf16.cpp +++ b/Tests/AK/TestUtf16.cpp @@ -89,6 +89,36 @@ TEST_CASE(decode_utf16) EXPECT_EQ(i, expected.size()); } +TEST_CASE(utf16_literal) +{ + { + Utf16View view { u"" }; + EXPECT(view.validate()); + EXPECT_EQ(view.length_in_code_units(), 0u); + } + { + Utf16View view { u"a" }; + EXPECT(view.validate()); + EXPECT_EQ(view.length_in_code_units(), 1u); + EXPECT_EQ(view.code_unit_at(0), 0x61u); + } + { + Utf16View view { u"abc" }; + EXPECT(view.validate()); + EXPECT_EQ(view.length_in_code_units(), 3u); + EXPECT_EQ(view.code_unit_at(0), 0x61u); + EXPECT_EQ(view.code_unit_at(1), 0x62u); + EXPECT_EQ(view.code_unit_at(2), 0x63u); + } + { + Utf16View view { u"๐Ÿ™ƒ" }; + EXPECT(view.validate()); + EXPECT_EQ(view.length_in_code_units(), 2u); + EXPECT_EQ(view.code_unit_at(0), 0xd83du); + EXPECT_EQ(view.code_unit_at(1), 0xde43u); + } +} + TEST_CASE(iterate_utf16) { auto string = MUST(AK::utf8_to_utf16("ะŸั€ะธะฒะตั‚ ๐Ÿ˜€"sv));