/* * 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 = DeprecatedString; static ErrorOr create(size_t initial_capacity = inline_capacity); explicit StringBuilder(size_t initial_capacity = inline_capacity); ~StringBuilder() = default; ErrorOr try_append(StringView); #ifndef KERNEL ErrorOr try_append(Utf16View const&); #endif 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); ErrorOr try_append_repeated(char, size_t); ErrorOr try_append_escaped_for_json(StringView); void append(StringView); #ifndef KERNEL void append(Utf16View const&); #endif 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_repeated(char, size_t); 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)); } #ifndef KERNEL [[nodiscard]] DeprecatedString to_deprecated_string() const; #endif ErrorOr to_string() const; ErrorOr to_fly_string() const; [[nodiscard]] ErrorOr 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, StringView fmtstr = "{}"sv) { MUST(try_join(separator, collection, fmtstr)); } template ErrorOr try_join(SeparatorType const& separator, CollectionType const& collection, StringView fmtstr = "{}"sv) { bool first = true; for (auto& item : collection) { if (!first) TRY(try_append(separator)); TRY(try_appendff(fmtstr, item)); first = false; } return {}; } 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; Detail::ByteBuffer m_buffer; }; } #if USING_AK_GLOBALLY using AK::StringBuilder; #endif