KBufferBuilder.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/StringView.h>
  8. #include <Kernel/KBuffer.h>
  9. #include <stdarg.h>
  10. namespace Kernel {
  11. class KBufferBuilder {
  12. AK_MAKE_NONCOPYABLE(KBufferBuilder);
  13. public:
  14. using OutputType = KBuffer;
  15. static ErrorOr<KBufferBuilder> try_create();
  16. KBufferBuilder(KBufferBuilder&&) = default;
  17. KBufferBuilder& operator=(KBufferBuilder&&) = default;
  18. ~KBufferBuilder() = default;
  19. ErrorOr<void> append(StringView);
  20. ErrorOr<void> append(char);
  21. ErrorOr<void> append(const char*, int);
  22. ErrorOr<void> append_escaped_for_json(StringView);
  23. ErrorOr<void> append_bytes(ReadonlyBytes);
  24. template<typename... Parameters>
  25. ErrorOr<void> appendff(CheckedFormatString<Parameters...>&& fmtstr, const Parameters&... parameters)
  26. {
  27. // FIXME: This really not ideal, but vformat expects StringBuilder.
  28. StringBuilder builder;
  29. AK::VariadicFormatParams variadic_format_params { parameters... };
  30. TRY(vformat(builder, fmtstr.view(), variadic_format_params));
  31. return append_bytes(builder.string_view().bytes());
  32. }
  33. bool flush();
  34. OwnPtr<KBuffer> build();
  35. ReadonlyBytes bytes() const
  36. {
  37. if (!m_buffer)
  38. return {};
  39. return m_buffer->bytes();
  40. }
  41. private:
  42. explicit KBufferBuilder(NonnullOwnPtr<KBuffer>);
  43. bool check_expand(size_t);
  44. u8* insertion_ptr()
  45. {
  46. if (!m_buffer)
  47. return nullptr;
  48. return m_buffer->data() + m_size;
  49. }
  50. OwnPtr<KBuffer> m_buffer;
  51. size_t m_size { 0 };
  52. };
  53. }