AK: Add a Utf16View ASCII validator

This commit is contained in:
Timothy Flynn 2025-06-12 19:06:11 -04:00 committed by Tim Flynn
parent 35a1832d08
commit d978a582a0
3 changed files with 19 additions and 0 deletions

View File

@ -133,6 +133,11 @@ ErrorOr<String> Utf16View::to_utf8(AllowInvalidCodeUnits allow_invalid_code_unit
return builder.to_string();
}
bool Utf16View::is_ascii() const
{
return simdutf::validate_ascii(reinterpret_cast<char const*>(m_code_units.data()), length_in_code_units() * sizeof(char16_t));
}
size_t Utf16View::length_in_code_points() const
{
if (m_length_in_code_points == NumericLimits<size_t>::max())

View File

@ -109,6 +109,8 @@ public:
bool is_null() const { return m_code_units.is_null(); }
bool is_empty() const { return m_code_units.is_empty(); }
bool is_ascii() const;
size_t length_in_code_units() const { return m_code_units.size(); }
size_t length_in_code_points() const;

View File

@ -307,6 +307,18 @@ TEST_CASE(decode_invalid_utf16)
}
}
TEST_CASE(is_ascii)
{
EXPECT(Utf16View {}.is_ascii());
EXPECT(Utf16View { u"a" }.is_ascii());
EXPECT(Utf16View { u"foo" }.is_ascii());
EXPECT(Utf16View { u"foo\t\n\rbar\v\b123" }.is_ascii());
EXPECT(!Utf16View { u"😀" }.is_ascii());
EXPECT(!Utf16View { u"foo 😀" }.is_ascii());
EXPECT(!Utf16View { u"😀 foo" }.is_ascii());
}
TEST_CASE(equals_ignoring_case)
{
auto string1 = MUST(AK::utf8_to_utf16("foobar"sv));