/* * Copyright (c) 2018-2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace AK { class StringBuilder { public: using OutputType = String; explicit StringBuilder(size_t initial_capacity = inline_capacity); ~StringBuilder() = default; ErrorOr try_append(StringView); ErrorOr try_append(Utf16View const&); ErrorOr try_append(Utf32View const&); ErrorOr try_append_code_point(u32); ErrorOr try_append(char); template ErrorOr try_appendff(CheckedFormatString&& fmtstr, Parameters const&... parameters) { VariadicFormatParams variadic_format_params { parameters... }; return vformat(*this, fmtstr.view(), variadic_format_params); } ErrorOr try_append(char const*, size_t); void append(StringView); void append(Utf16View const&); void append(Utf32View const&); void append(char); void append_code_point(u32); void append(char const*, size_t); void appendvf(char const*, va_list); void append_as_lowercase(char); void append_escaped_for_json(StringView); template void appendff(CheckedFormatString&& fmtstr, Parameters const&... parameters) { VariadicFormatParams variadic_format_params { parameters... }; MUST(vformat(*this, fmtstr.view(), variadic_format_params)); } [[nodiscard]] String build() const; [[nodiscard]] String to_string() const; [[nodiscard]] ByteBuffer to_byte_buffer() const; [[nodiscard]] StringView string_view() const; void clear(); [[nodiscard]] size_t length() const { return m_buffer.size(); } [[nodiscard]] bool is_empty() const { return m_buffer.is_empty(); } void trim(size_t count) { m_buffer.resize(m_buffer.size() - count); } template void join(SeparatorType const& separator, CollectionType const& collection) { bool first = true; for (auto& item : collection) { if (first) first = false; else append(separator); appendff("{}", item); } } private: ErrorOr will_append(size_t); u8* data() { return m_buffer.data(); } u8 const* data() const { return m_buffer.data(); } static constexpr size_t inline_capacity = 256; AK::Detail::ByteBuffer m_buffer; }; } using AK::StringBuilder;