* Compose data into a growing std::string. */
| 63 | * Compose data into a growing std::string. |
| 64 | */ |
| 65 | class StringBuilder final : public BaseStringBuilder { |
| 66 | std::string *dest; |
| 67 | public: |
| 68 | /** |
| 69 | * Construct StringBuilder into destination string. |
| 70 | * @note The lifetime of the string must exceed the lifetime of the StringBuilder. |
| 71 | */ |
| 72 | StringBuilder(std::string &dest) : dest(&dest) {} |
| 73 | |
| 74 | /** |
| 75 | * Check whether any bytes have been written. |
| 76 | */ |
| 77 | [[nodiscard]] bool AnyBytesWritten() const noexcept { return !this->dest->empty(); } |
| 78 | /** |
| 79 | * Get number of already written bytes. |
| 80 | */ |
| 81 | [[nodiscard]] size_type GetBytesWritten() const noexcept { return this->dest->size(); } |
| 82 | /** |
| 83 | * Get already written data. |
| 84 | */ |
| 85 | [[nodiscard]] const std::string &GetWrittenData() const noexcept { return *dest; } |
| 86 | /** |
| 87 | * Get mutable already written data. |
| 88 | */ |
| 89 | [[nodiscard]] std::string &GetString() noexcept { return *dest; } |
| 90 | |
| 91 | void PutBuffer(std::span<const char> str) override; |
| 92 | |
| 93 | /** |
| 94 | * Append string. |
| 95 | */ |
| 96 | StringBuilder& operator+=(std::string_view str) |
| 97 | { |
| 98 | this->Put(str); |
| 99 | return *this; |
| 100 | } |
| 101 | |
| 102 | using back_insert_iterator = std::back_insert_iterator<std::string>; |
| 103 | /** |
| 104 | * Create a back-insert-iterator. |
| 105 | */ |
| 106 | back_insert_iterator back_inserter() |
| 107 | { |
| 108 | return back_insert_iterator(*this->dest); |
| 109 | } |
| 110 | }; |
| 111 | |
| 112 | #endif /* STRING_BUILDER_HPP */ |