mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-22 09:21:57 -05:00
AK: Add ASCII fast path in StringBuilder::append(Utf16View)
And let's at least try to pre-allocate an appropriate amount of buffer space in the builder instead of appending and growing one code point at a time. (cherry picked from commit b6e28ff80779520ccb49e6c15ae1866bbc8713a7)
This commit is contained in:
parent
aa34916d45
commit
b57e502d21
1 changed files with 12 additions and 0 deletions
|
@ -233,7 +233,19 @@ void StringBuilder::append_code_point(u32 code_point)
|
|||
#ifndef KERNEL
|
||||
ErrorOr<void> StringBuilder::try_append(Utf16View const& utf16_view)
|
||||
{
|
||||
// NOTE: This may under-allocate in the presence of surrogate pairs.
|
||||
// That's okay, appending will still grow the buffer as needed.
|
||||
TRY(will_append(utf16_view.length_in_code_units()));
|
||||
|
||||
for (size_t i = 0; i < utf16_view.length_in_code_units();) {
|
||||
// OPTIMIZATION: Fast path for ASCII characters.
|
||||
auto code_unit = utf16_view.data()[i];
|
||||
if (code_unit <= 0x7f) {
|
||||
append(static_cast<char>(code_unit));
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
|
||||
auto code_point = utf16_view.code_point_at(i);
|
||||
TRY(try_append_code_point(code_point));
|
||||
|
||||
|
|
Loading…
Reference in a new issue