aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yt/string/string_builder.h
diff options
context:
space:
mode:
authorbabenko <babenko@yandex-team.com>2024-10-13 17:47:48 +0300
committerbabenko <babenko@yandex-team.com>2024-10-13 17:58:33 +0300
commita03ad07f802b86bbf071acbe1358f7e00ca4be34 (patch)
tree97119051e524f85854516f141e818b81a0f24a39 /library/cpp/yt/string/string_builder.h
parent9a90e464060c2d7a036a1b94b1076f7ea7e0cc95 (diff)
downloadydb-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.h80
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_