From c16aca7abf801a9d4da3d882b9e45ffcb35cd304 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Mon, 9 Aug 2021 11:53:28 -0400 Subject: [PATCH] AK+Kernel: Add StringBuilder::append overload for UTF-16 views Currently, to append a UTF-16 view to a StringBuilder, callers must first convert the view to UTF-8 and then append the copy. Add a UTF-16 overload so callers do not need to hold an entire copy in memory. --- AK/StringBuilder.cpp | 11 +++++++++++ AK/StringBuilder.h | 1 + Kernel/CMakeLists.txt | 2 ++ 3 files changed, 14 insertions(+) diff --git a/AK/StringBuilder.cpp b/AK/StringBuilder.cpp index bd375900a0..5a12df2a63 100644 --- a/AK/StringBuilder.cpp +++ b/AK/StringBuilder.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include namespace AK { @@ -112,6 +113,16 @@ void StringBuilder::append_code_point(u32 code_point) } } +void StringBuilder::append(Utf16View const& utf16_view) +{ + for (size_t i = 0; i < utf16_view.length_in_code_units();) { + auto code_point = utf16_view.code_point_at(i); + append_code_point(code_point); + + i += (code_point > 0xffff ? 2 : 1); + } +} + void StringBuilder::append(Utf32View const& utf32_view) { for (size_t i = 0; i < utf32_view.length(); ++i) { diff --git a/AK/StringBuilder.h b/AK/StringBuilder.h index 0bc99c450b..6f3d0b5380 100644 --- a/AK/StringBuilder.h +++ b/AK/StringBuilder.h @@ -22,6 +22,7 @@ public: ~StringBuilder() = default; void append(StringView const&); + void append(Utf16View const&); void append(Utf32View const&); void append(char); void append_code_point(u32); diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 1ac315a2d8..b0b12804f9 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -312,6 +312,8 @@ set(AK_SOURCES ../AK/Time.cpp ../AK/Format.cpp ../AK/UUID.cpp + ../AK/Utf8View.cpp + ../AK/Utf16View.cpp ) set(ELF_SOURCES