mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 20:28:11 +00:00

We now use AK::Error and AK::ErrorOr<T> in both kernel and userspace! This was a slightly tedious refactoring that took a long time, so it's not unlikely that some bugs crept in. Nevertheless, it does pass basic functionality testing, and it's just real nice to finally see the same pattern in all contexts. :^)
69 lines
1.6 KiB
C++
69 lines
1.6 KiB
C++
/*
|
|
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/StringView.h>
|
|
#include <Kernel/KBuffer.h>
|
|
#include <stdarg.h>
|
|
|
|
namespace Kernel {
|
|
|
|
class KBufferBuilder {
|
|
AK_MAKE_NONCOPYABLE(KBufferBuilder);
|
|
|
|
public:
|
|
using OutputType = KBuffer;
|
|
|
|
static ErrorOr<KBufferBuilder> try_create();
|
|
|
|
KBufferBuilder(KBufferBuilder&&) = default;
|
|
KBufferBuilder& operator=(KBufferBuilder&&) = default;
|
|
~KBufferBuilder() = default;
|
|
|
|
ErrorOr<void> append(const StringView&);
|
|
ErrorOr<void> append(char);
|
|
ErrorOr<void> append(const char*, int);
|
|
|
|
ErrorOr<void> append_escaped_for_json(const StringView&);
|
|
ErrorOr<void> append_bytes(ReadonlyBytes);
|
|
|
|
template<typename... Parameters>
|
|
ErrorOr<void> appendff(CheckedFormatString<Parameters...>&& fmtstr, const Parameters&... parameters)
|
|
{
|
|
// FIXME: This really not ideal, but vformat expects StringBuilder.
|
|
StringBuilder builder;
|
|
AK::VariadicFormatParams variadic_format_params { parameters... };
|
|
vformat(builder, fmtstr.view(), variadic_format_params);
|
|
return append_bytes(builder.string_view().bytes());
|
|
}
|
|
|
|
bool flush();
|
|
OwnPtr<KBuffer> build();
|
|
|
|
ReadonlyBytes bytes() const
|
|
{
|
|
if (!m_buffer)
|
|
return {};
|
|
return m_buffer->bytes();
|
|
}
|
|
|
|
private:
|
|
explicit KBufferBuilder(NonnullOwnPtr<KBuffer>);
|
|
|
|
bool check_expand(size_t);
|
|
u8* insertion_ptr()
|
|
{
|
|
if (!m_buffer)
|
|
return nullptr;
|
|
return m_buffer->data() + m_size;
|
|
}
|
|
|
|
OwnPtr<KBuffer> m_buffer;
|
|
size_t m_size { 0 };
|
|
};
|
|
|
|
}
|