10#ifndef STRING_INPLACE_HPP
11#define STRING_INPLACE_HPP
21 size_type position = 0;
24 friend class InPlaceReplacement;
25 explicit InPlaceBuilder(std::span<char> dest,
const StringConsumer &consumer) : dest(dest), consumer(consumer) {}
26 InPlaceBuilder(
const InPlaceBuilder &src,
const StringConsumer &consumer) : dest(src.dest), position(src.position), consumer(consumer) {}
27 void AssignBuffer(
const InPlaceBuilder &src) { this->dest = src.dest; this->position = src.position; }
29 InPlaceBuilder(
const InPlaceBuilder &) =
delete;
30 InPlaceBuilder& operator=(
const InPlaceBuilder &) =
delete;
35 [[nodiscard]]
bool AnyBytesWritten() const noexcept {
return this->position != 0; }
39 [[nodiscard]] size_type
GetBytesWritten() const noexcept {
return this->position; }
43 [[nodiscard]] std::string_view
GetWrittenData() const noexcept {
return {this->dest.data(), this->position}; }
48 void PutBuffer(std::span<const
char> str) override;
53 class back_insert_iterator {
54 InPlaceBuilder *parent =
nullptr;
56 using value_type = void;
57 using difference_type = void;
58 using iterator_category = std::output_iterator_tag;
60 using reference = void;
62 back_insert_iterator(InPlaceBuilder &parent) : parent(&parent) {}
64 back_insert_iterator &
operator++() {
return *
this; }
65 back_insert_iterator
operator++(
int) {
return *
this; }
66 back_insert_iterator &operator*() {
return *
this; }
68 back_insert_iterator &operator=(
char value)
Compose data into a string / buffer.
void PutChar(char c)
Append 8-bit char.
Implementation of std::back_insert_iterator for non-growing destination buffer.
Builder implementation for InPlaceReplacement.
bool AnyBytesWritten() const noexcept
Check whether any bytes have been written.
bool AnyBytesUnused() const noexcept
Check whether any unused bytes are left between the Builder and Consumer position.
std::string_view GetWrittenData() const noexcept
Get already written data.
back_insert_iterator back_inserter()
Create a back-insert-iterator.
size_type GetBytesUnused() const noexcept
Get number of unused bytes left between the Builder and Consumer position.
size_type GetBytesWritten() const noexcept
Get number of already written bytes.
void PutBuffer(std::span< const char > str) override
Append buffer.
InPlaceReplacement(std::span< char > buffer)
Create coupled Consumer+Builder pair.
InPlaceBuilder builder
Builder into shared buffer.
StringConsumer consumer
Consumer from shared buffer.
Parse data from a string / buffer.
constexpr enum_type & operator++(enum_type &e)
Prefix increment.
Compose strings from textual and binary data.