diff --git a/AK/String.cpp b/AK/String.cpp index 4023451fa30..ba6b980f845 100644 --- a/AK/String.cpp +++ b/AK/String.cpp @@ -55,6 +55,11 @@ String String::from_utf8_without_validation(ReadonlyBytes bytes) return result; } +String String::from_ascii_without_validation(ReadonlyBytes bytes) +{ + return from_utf8_without_validation(bytes); +} + ErrorOr String::from_utf8(StringView view) { if (!Utf8View { view }.validate()) diff --git a/AK/String.h b/AK/String.h index 5e2f481ccf6..9aef4f886a3 100644 --- a/AK/String.h +++ b/AK/String.h @@ -64,6 +64,7 @@ public: static ErrorOr from_utf8(T&&) = delete; [[nodiscard]] static String from_utf8_without_validation(ReadonlyBytes); + [[nodiscard]] static String from_ascii_without_validation(ReadonlyBytes); static ErrorOr from_string_builder(Badge, StringBuilder&); [[nodiscard]] static String from_string_builder_without_validation(Badge, StringBuilder&); diff --git a/AK/StringNumber.h b/AK/StringNumber.h index 54f5395fc1b..f12b29fd0c9 100644 --- a/AK/StringNumber.h +++ b/AK/StringNumber.h @@ -46,7 +46,7 @@ StringType create_string_from_number(T value) } size_t size = buffer + max_digits - ptr; - return StringType::from_utf8_without_validation(ReadonlyBytes { ptr, size }); + return StringType::from_ascii_without_validation(ReadonlyBytes { ptr, size }); } } diff --git a/AK/Utf16String.cpp b/AK/Utf16String.cpp index b98eb54c46a..c2985688b89 100644 --- a/AK/Utf16String.cpp +++ b/AK/Utf16String.cpp @@ -37,6 +37,21 @@ Utf16String Utf16String::from_utf8_with_replacement_character(StringView utf8_st return builder.to_utf16_string(); } +Utf16String Utf16String::from_ascii_without_validation(ReadonlyBytes ascii_string) +{ + if (ascii_string.size() <= Detail::MAX_SHORT_STRING_BYTE_COUNT) { + Utf16String string; + string.m_value.short_ascii_string = Detail::ShortString::create_with_byte_count(ascii_string.size()); + + auto result = ascii_string.copy_to(string.m_value.short_ascii_string.storage); + VERIFY(result == ascii_string.size()); + + return string; + } + + return Utf16String { Detail::Utf16StringData::from_ascii(ascii_string) }; +} + Utf16String Utf16String::from_utf8_without_validation(StringView utf8_string) { if (utf8_string.length() <= Detail::MAX_SHORT_STRING_BYTE_COUNT && utf8_string.is_ascii()) { diff --git a/AK/Utf16String.h b/AK/Utf16String.h index bc31932cede..7e1028333bd 100644 --- a/AK/Utf16String.h +++ b/AK/Utf16String.h @@ -64,6 +64,7 @@ public: } static Utf16String from_utf8_without_validation(StringView); + static Utf16String from_ascii_without_validation(ReadonlyBytes); static Utf16String from_utf16(Utf16View const& utf16_string); diff --git a/AK/Utf16StringData.cpp b/AK/Utf16StringData.cpp index 3f7bdddbc93..c51a111d622 100644 --- a/AK/Utf16StringData.cpp +++ b/AK/Utf16StringData.cpp @@ -56,6 +56,14 @@ NonnullRefPtr Utf16StringData::create_from_code_point_iterable( return string; } +NonnullRefPtr Utf16StringData::from_ascii(ReadonlyBytes ascii_string) +{ + VERIFY_UTF16_LENGTH(ascii_string.size()); + auto string = create_uninitialized(StorageType::ASCII, ascii_string.size()); + TypedTransfer::copy(string->m_ascii_data, reinterpret_cast(ascii_string.data()), ascii_string.size()); + return string; +} + NonnullRefPtr Utf16StringData::from_utf8(StringView utf8_string, AllowASCIIStorage allow_ascii_storage) { RefPtr string; diff --git a/AK/Utf16StringData.h b/AK/Utf16StringData.h index 350efa158a7..8d85ae5358b 100644 --- a/AK/Utf16StringData.h +++ b/AK/Utf16StringData.h @@ -31,6 +31,7 @@ public: }; static NonnullRefPtr from_utf8(StringView, AllowASCIIStorage); + static NonnullRefPtr from_ascii(ReadonlyBytes); static NonnullRefPtr from_utf16(Utf16View const&); static NonnullRefPtr from_utf32(Utf32View const&); static NonnullRefPtr from_string_builder(StringBuilder&);