Skip to content

Commit c9c98a1

Browse files
awesomeklingtrflynn89
authored andcommitted
AK: Avoid temporary Vector<u8> when encoding Base64
Instead, decode directly into an uninitialized StringData object. This avoids the redundant vector allocation + memory copy.
1 parent 2453f0b commit c9c98a1

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

AK/Base64.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,20 @@ static ErrorOr<ByteBuffer> decode_base64_impl(StringView input, LastChunkHandlin
8383

8484
static ErrorOr<String> encode_base64_impl(StringView input, simdutf::base64_options options)
8585
{
86-
Vector<u8> output;
87-
TRY(output.try_resize(simdutf::base64_length_from_binary(input.length(), options)));
86+
if (input.is_empty())
87+
return String {};
88+
89+
u8* buffer = nullptr;
90+
auto output = TRY(AK::Detail::StringData::create_uninitialized(
91+
simdutf::base64_length_from_binary(input.length(), options), buffer));
8892

8993
simdutf::binary_to_base64(
9094
input.characters_without_null_termination(),
9195
input.length(),
92-
reinterpret_cast<char*>(output.data()),
96+
reinterpret_cast<char*>(buffer),
9397
options);
9498

95-
return String::from_utf8_without_validation(output);
99+
return String { move(output) };
96100
}
97101

98102
ErrorOr<ByteBuffer> decode_base64(StringView input, LastChunkHandling last_chunk_handling)

AK/StringBase.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class StringBase {
5252
other.m_impl = { .short_string = ShortString::create_empty() };
5353
}
5454

55+
explicit StringBase(NonnullRefPtr<Detail::StringData const>);
56+
5557
StringBase& operator=(StringBase&&);
5658
StringBase& operator=(StringBase const&);
5759

@@ -123,8 +125,6 @@ class StringBase {
123125
friend class ::AK::FlyString;
124126
friend struct ::AK::Detail::ShortString;
125127

126-
explicit StringBase(NonnullRefPtr<Detail::StringData const>);
127-
128128
explicit constexpr StringBase(nullptr_t)
129129
: m_impl { .data = nullptr }
130130
{

0 commit comments

Comments
 (0)