diff options
author | babenko <babenko@yandex-team.com> | 2024-10-13 17:47:48 +0300 |
---|---|---|
committer | babenko <babenko@yandex-team.com> | 2024-10-13 17:58:33 +0300 |
commit | a03ad07f802b86bbf071acbe1358f7e00ca4be34 (patch) | |
tree | 97119051e524f85854516f141e818b81a0f24a39 /library/cpp/yt/string/string_builder.h | |
parent | 9a90e464060c2d7a036a1b94b1076f7ea7e0cc95 (diff) | |
download | ydb-a03ad07f802b86bbf071acbe1358f7e00ca4be34.tar.gz |
Extract string_builder
commit_hash:1573c88f09db79bab2755c9c2c3ffd0bc219b2d2
Diffstat (limited to 'library/cpp/yt/string/string_builder.h')
-rw-r--r-- | library/cpp/yt/string/string_builder.h | 80 |
1 files changed, 65 insertions, 15 deletions
diff --git a/library/cpp/yt/string/string_builder.h b/library/cpp/yt/string/string_builder.h index de1c1abb1e..ac3aa26a7c 100644 --- a/library/cpp/yt/string/string_builder.h +++ b/library/cpp/yt/string/string_builder.h @@ -1,13 +1,68 @@ #pragma once -#include "format.h" - #include <util/generic/string.h> namespace NYT { //////////////////////////////////////////////////////////////////////////////// +//! A simple helper for constructing strings by a sequence of appends. +class TStringBuilderBase +{ +public: + virtual ~TStringBuilderBase() = default; + + char* Preallocate(size_t size); + + void Reserve(size_t size); + + size_t GetLength() const; + + TStringBuf GetBuffer() const; + + void Advance(size_t size); + + void AppendChar(char ch); + void AppendChar(char ch, int n); + + void AppendString(TStringBuf str); + void AppendString(const char* str); + + template <size_t Length, class... TArgs> + void AppendFormat(const char (&format)[Length], TArgs&&... args); + template <class... TArgs> + void AppendFormat(TStringBuf format, TArgs&&... args); + + void Reset(); + +protected: + char* Begin_ = nullptr; + char* Current_ = nullptr; + char* End_ = nullptr; + + virtual void DoReset() = 0; + virtual void DoReserve(size_t newLength) = 0; + + static constexpr size_t MinBufferLength = 128; +}; + +//////////////////////////////////////////////////////////////////////////////// + +class TStringBuilder + : public TStringBuilderBase +{ +public: + TString Flush(); + +protected: + TString Buffer_; + + void DoReset() override; + void DoReserve(size_t size) override; +}; + +//////////////////////////////////////////////////////////////////////////////// + //! Appends a certain delimiter starting from the second call. class TDelimitedStringBuilderWrapper : private TNonCopyable @@ -15,19 +70,10 @@ class TDelimitedStringBuilderWrapper public: TDelimitedStringBuilderWrapper( TStringBuilderBase* builder, - TStringBuf delimiter = TStringBuf(", ")) - : Builder_(builder) - , Delimiter_(delimiter) - { } - - TStringBuilderBase* operator->() - { - if (!FirstCall_) { - Builder_->AppendString(Delimiter_); - } - FirstCall_ = false; - return Builder_; - } + TStringBuf delimiter = TStringBuf(", ")); + + TStringBuilderBase* operator->(); + TStringBuilderBase* operator&(); private: TStringBuilderBase* const Builder_; @@ -39,3 +85,7 @@ private: //////////////////////////////////////////////////////////////////////////////// } // namespace NYT + +#define STRING_BUILDER_INL_H_ +#include "string_builder-inl.h" +#undef STRING_BUILDER_INL_H_ |