AK: Initialize StringBuilder buffer in place
Before this change, we'd construct a ByteBuffer for the internal buffer, and then move-construct StringBuilder::m_buffer from it. Due to ByteBuffer's inline capacity, this meant we had to memmove the inline buffer an extra time for every StringBuilder created.
This commit is contained in:
parent
1ec72de0a6
commit
72ea158f16
2 changed files with 11 additions and 13 deletions
|
|
@ -34,16 +34,12 @@ static constexpr size_t string_builder_prefix_size(StringBuilder::Mode mode)
|
|||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
static ErrorOr<StringBuilder::Buffer> create_buffer(StringBuilder::Mode mode, size_t capacity)
|
||||
void StringBuilder::initialize_buffer(Mode mode, size_t capacity)
|
||||
{
|
||||
StringBuilder::Buffer buffer;
|
||||
auto prefix_size = string_builder_prefix_size(mode);
|
||||
|
||||
if (capacity > StringBuilder::inline_capacity)
|
||||
TRY(buffer.try_ensure_capacity(prefix_size + capacity));
|
||||
|
||||
TRY(buffer.try_resize(prefix_size));
|
||||
return buffer;
|
||||
m_buffer.ensure_capacity(prefix_size + capacity);
|
||||
m_buffer.resize(prefix_size);
|
||||
}
|
||||
|
||||
StringBuilder::StringBuilder()
|
||||
|
|
@ -51,24 +47,24 @@ StringBuilder::StringBuilder()
|
|||
static constexpr auto prefix_size = string_builder_prefix_size(DEFAULT_MODE);
|
||||
static_assert(inline_capacity > prefix_size);
|
||||
|
||||
m_buffer.resize(prefix_size);
|
||||
initialize_buffer(m_mode, inline_capacity);
|
||||
}
|
||||
|
||||
StringBuilder::StringBuilder(size_t initial_capacity)
|
||||
: m_buffer(MUST(create_buffer(DEFAULT_MODE, initial_capacity)))
|
||||
{
|
||||
initialize_buffer(m_mode, initial_capacity);
|
||||
}
|
||||
|
||||
StringBuilder::StringBuilder(Mode mode)
|
||||
: m_buffer(MUST(create_buffer(mode, inline_capacity)))
|
||||
, m_mode(mode)
|
||||
: m_mode(mode)
|
||||
{
|
||||
initialize_buffer(m_mode, inline_capacity);
|
||||
}
|
||||
|
||||
StringBuilder::StringBuilder(Mode mode, size_t initial_capacity_in_code_units)
|
||||
: m_buffer(MUST(create_buffer(mode, initial_capacity_in_code_units * (mode == Mode::UTF8 ? 1 : 2))))
|
||||
, m_mode(mode)
|
||||
: m_mode(mode)
|
||||
{
|
||||
initialize_buffer(mode, initial_capacity_in_code_units * (mode == Mode::UTF8 ? 1 : 2));
|
||||
}
|
||||
|
||||
inline ErrorOr<void> StringBuilder::will_append(size_t size_in_bytes)
|
||||
|
|
|
|||
|
|
@ -119,6 +119,8 @@ public:
|
|||
Optional<Buffer::OutlineBuffer> leak_buffer_for_string_construction(Badge<Detail::Utf16StringData>) { return leak_buffer_for_string_construction(); }
|
||||
|
||||
private:
|
||||
void initialize_buffer(Mode, size_t capacity);
|
||||
|
||||
Optional<Buffer::OutlineBuffer> leak_buffer_for_string_construction();
|
||||
|
||||
ErrorOr<void> will_append(size_t);
|
||||
|
|
|
|||
Loading…
Reference in a new issue