diff options
author | arkady-e1ppa <arkady-e1ppa@yandex-team.com> | 2024-07-02 15:28:09 +0300 |
---|---|---|
committer | arkady-e1ppa <arkady-e1ppa@yandex-team.com> | 2024-07-02 15:40:39 +0300 |
commit | 3336f268eb26aa0318cd3fa3f97116c43545f87b (patch) | |
tree | 047395a3b7bf0751a86c5676a9c103e168e47e3c /library/cpp | |
parent | aa95a328ada306559bd361a96c5348829d0e562e (diff) | |
download | ydb-3336f268eb26aa0318cd3fa3f97116c43545f87b.tar.gz |
YT-21868: Reorganize files to prevent unclear missing include errors
Moving files around so that include of either `string_builder.h` or `format.h` would result in being able to use both `Format` and `TStringBuilder`
8a2abbea2ae7027c1cd3a243ab3de55bdd5d3d27
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/yt/string/enum-inl.h | 1 | ||||
-rw-r--r-- | library/cpp/yt/string/enum.h | 2 | ||||
-rw-r--r-- | library/cpp/yt/string/format-inl.h | 177 | ||||
-rw-r--r-- | library/cpp/yt/string/format.h | 75 | ||||
-rw-r--r-- | library/cpp/yt/string/guid.cpp | 4 | ||||
-rw-r--r-- | library/cpp/yt/string/guid.h | 8 | ||||
-rw-r--r-- | library/cpp/yt/string/string-inl.h | 158 | ||||
-rw-r--r-- | library/cpp/yt/string/string.h | 83 | ||||
-rw-r--r-- | library/cpp/yt/string/string_builder-inl.h | 191 | ||||
-rw-r--r-- | library/cpp/yt/string/string_builder.h | 78 |
10 files changed, 433 insertions, 344 deletions
diff --git a/library/cpp/yt/string/enum-inl.h b/library/cpp/yt/string/enum-inl.h index d9f8239cbd..41f7197d15 100644 --- a/library/cpp/yt/string/enum-inl.h +++ b/library/cpp/yt/string/enum-inl.h @@ -9,6 +9,7 @@ #include <library/cpp/yt/exception/exception.h> #include <util/string/printf.h> +#include <util/string/strip.h> namespace NYT { diff --git a/library/cpp/yt/string/enum.h b/library/cpp/yt/string/enum.h index b4b8d59171..792e09402d 100644 --- a/library/cpp/yt/string/enum.h +++ b/library/cpp/yt/string/enum.h @@ -1,6 +1,6 @@ #pragma once -#include "string.h" +#include "format_arg.h" #include <library/cpp/yt/misc/enum.h> diff --git a/library/cpp/yt/string/format-inl.h b/library/cpp/yt/string/format-inl.h index 1ff2d816c5..4eaa70bef2 100644 --- a/library/cpp/yt/string/format-inl.h +++ b/library/cpp/yt/string/format-inl.h @@ -4,6 +4,7 @@ #include "format.h" #endif +#include "guid.h" #include "enum.h" #include "string.h" @@ -33,6 +34,155 @@ namespace NYT { //////////////////////////////////////////////////////////////////////////////// +inline char* TStringBuilderBase::Preallocate(size_t size) +{ + Reserve(size + GetLength()); + return Current_; +} + +inline void TStringBuilderBase::Reserve(size_t size) +{ + if (Y_UNLIKELY(End_ - Begin_ < static_cast<ssize_t>(size))) { + size_t length = GetLength(); + auto newLength = std::max(size, MinBufferLength); + DoReserve(newLength); + Current_ = Begin_ + length; + } +} + +inline size_t TStringBuilderBase::GetLength() const +{ + return Current_ ? Current_ - Begin_ : 0; +} + +inline TStringBuf TStringBuilderBase::GetBuffer() const +{ + return TStringBuf(Begin_, Current_); +} + +inline void TStringBuilderBase::Advance(size_t size) +{ + Current_ += size; + YT_ASSERT(Current_ <= End_); +} + +inline void TStringBuilderBase::AppendChar(char ch) +{ + *Preallocate(1) = ch; + Advance(1); +} + +inline void TStringBuilderBase::AppendChar(char ch, int n) +{ + YT_ASSERT(n >= 0); + if (Y_LIKELY(0 != n)) { + char* dst = Preallocate(n); + ::memset(dst, ch, n); + Advance(n); + } +} + +inline void TStringBuilderBase::AppendString(TStringBuf str) +{ + if (Y_LIKELY(str)) { + char* dst = Preallocate(str.length()); + ::memcpy(dst, str.begin(), str.length()); + Advance(str.length()); + } +} + +inline void TStringBuilderBase::AppendString(const char* str) +{ + AppendString(TStringBuf(str)); +} + +inline void TStringBuilderBase::Reset() +{ + Begin_ = Current_ = End_ = nullptr; + DoReset(); +} + +template <class... TArgs> +void TStringBuilderBase::AppendFormat(TStringBuf format, TArgs&& ... args) +{ + Format(this, TRuntimeFormat{format}, std::forward<TArgs>(args)...); +} + +template <size_t Length, class... TArgs> +void TStringBuilderBase::AppendFormat(const char (&format)[Length], TArgs&& ... args) +{ + Format(this, TRuntimeFormat{format}, std::forward<TArgs>(args)...); +} + +//////////////////////////////////////////////////////////////////////////////// + +inline TString TStringBuilder::Flush() +{ + Buffer_.resize(GetLength()); + auto result = std::move(Buffer_); + Reset(); + return result; +} + +inline void TStringBuilder::DoReset() +{ + Buffer_ = {}; +} + +inline void TStringBuilder::DoReserve(size_t newLength) +{ + Buffer_.ReserveAndResize(newLength); + auto capacity = Buffer_.capacity(); + Buffer_.ReserveAndResize(capacity); + Begin_ = &*Buffer_.begin(); + End_ = Begin_ + capacity; +} + +inline void FormatValue(TStringBuilderBase* builder, const TStringBuilder& value, TStringBuf /*spec*/) +{ + builder->AppendString(value.GetBuffer()); +} + +//////////////////////////////////////////////////////////////////////////////// + +template <class T> +TString ToStringViaBuilder(const T& value, TStringBuf spec) +{ + TStringBuilder builder; + FormatValue(&builder, value, spec); + return builder.Flush(); +} + +//////////////////////////////////////////////////////////////////////////////// + +// Compatibility for users of NYT::ToString(nyt_type). +template <CFormattable T> +TString ToString(const T& t) +{ + return ToStringViaBuilder(t); +} + +// Sometime we want to implement +// FormatValue using util's ToString +// However, if we inside the FormatValue +// we cannot just call the ToString since +// in this scope T is already CFormattable +// and ToString will call the very +// FormatValue we are implementing, +// causing an infinite recursion loop. +// This method is basically a call to +// util's ToString default implementation. +template <class T> +TString ToStringIgnoringFormatValue(const T& t) +{ + TString s; + ::TStringOutput o(s); + o << t; + return s; +} + +//////////////////////////////////////////////////////////////////////////////// + // Helper functions for formatting. namespace NDetail { @@ -887,3 +1037,30 @@ TString FormatVector( //////////////////////////////////////////////////////////////////////////////// } // namespace NYT + +#include <util/string/cast.h> + +// util/string/cast.h extension for yt and std types only +// TODO(arkady-e1ppa): Abolish ::ToString in +// favour of either NYT::ToString or +// automatic formatting wherever it is needed. +namespace NPrivate { + +//////////////////////////////////////////////////////////////////////////////// + +template <class T> + requires ( + (NYT::NDetail::IsNYTName<T>() || + NYT::NDetail::IsStdName<T>()) && + NYT::CFormattable<T>) +struct TToString<T, false> +{ + static TString Cvt(const T& t) + { + return NYT::ToStringViaBuilder(t); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NPrivate diff --git a/library/cpp/yt/string/format.h b/library/cpp/yt/string/format.h index 9e12d286b7..a6ab1f76f4 100644 --- a/library/cpp/yt/string/format.h +++ b/library/cpp/yt/string/format.h @@ -1,6 +1,8 @@ #pragma once -#include "string_builder.h" +#include "format_string.h" + +#include <util/generic/string.h> namespace NYT { @@ -55,12 +57,79 @@ namespace NYT { */ template <class... TArgs> -void Format(TStringBuilderBase* builder, TFormatString<TArgs...> format, TArgs&&... args); -template <class... TArgs> TString Format(TFormatString<TArgs...> format, TArgs&&... args); //////////////////////////////////////////////////////////////////////////////// +// StringBuilder(Base) definition. + +//! 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; +}; + +//////////////////////////////////////////////////////////////////////////////// + +template <class... TArgs> +void Format(TStringBuilderBase* builder, TFormatString<TArgs...> format, TArgs&&... args); + +//////////////////////////////////////////////////////////////////////////////// + +template <class T> +TString ToStringViaBuilder(const T& value, TStringBuf spec = TStringBuf("v")); + +//////////////////////////////////////////////////////////////////////////////// + template <class TRange, class TFormatter> struct TFormattableView { diff --git a/library/cpp/yt/string/guid.cpp b/library/cpp/yt/string/guid.cpp index 2a781d032d..b18ac3e128 100644 --- a/library/cpp/yt/string/guid.cpp +++ b/library/cpp/yt/string/guid.cpp @@ -1,10 +1,12 @@ #include "guid.h" +#include "format.h" + namespace NYT { //////////////////////////////////////////////////////////////////////////////// -void FormatValue(TStringBuilderBase* builder, TGuid value, TStringBuf /*format*/) +void FormatValue(TStringBuilderBase* builder, TGuid value, TStringBuf /*spec*/) { char* begin = builder->Preallocate(MaxGuidStringSize); char* end = WriteGuidToBuffer(begin, value); diff --git a/library/cpp/yt/string/guid.h b/library/cpp/yt/string/guid.h index de16993486..fd3943bafd 100644 --- a/library/cpp/yt/string/guid.h +++ b/library/cpp/yt/string/guid.h @@ -1,12 +1,14 @@ -#include <library/cpp/yt/misc/guid.h> +#pragma once + +#include "format_arg.h" -#include "format.h" +#include <library/cpp/yt/misc/guid.h> namespace NYT { //////////////////////////////////////////////////////////////////////////////// -void FormatValue(TStringBuilderBase* builder, TGuid value, TStringBuf /*format*/); +void FormatValue(TStringBuilderBase* builder, TGuid value, TStringBuf /*spec*/); //////////////////////////////////////////////////////////////////////////////// diff --git a/library/cpp/yt/string/string-inl.h b/library/cpp/yt/string/string-inl.h new file mode 100644 index 0000000000..baf789b4f1 --- /dev/null +++ b/library/cpp/yt/string/string-inl.h @@ -0,0 +1,158 @@ +#ifndef STRING_INL_H_ +#error "Direct inclusion of this file is not allowed, include string.h" +// For the sake of sane code completion. +#include "string.h" +#endif + +#include "format.h" + +namespace NYT { + +//////////////////////////////////////////////////////////////////////////////// + +//! Joins a range of items into a string intermixing them with the delimiter. +/*! + * \param builder String builder where the output goes. + * \param begin Iterator pointing to the first item (inclusive). + * \param end Iterator pointing to the last item (not inclusive). + * \param formatter Formatter to apply to the items. + * \param delimiter A delimiter to be inserted between items: ", " by default. + * \return The resulting combined string. + */ +template <class TIterator, class TFormatter> +void JoinToString( + TStringBuilderBase* builder, + const TIterator& begin, + const TIterator& end, + const TFormatter& formatter, + TStringBuf delimiter) +{ + for (auto current = begin; current != end; ++current) { + if (current != begin) { + builder->AppendString(delimiter); + } + formatter(builder, *current); + } +} + +template <class TIterator, class TFormatter> +TString JoinToString( + const TIterator& begin, + const TIterator& end, + const TFormatter& formatter, + TStringBuf delimiter) +{ + TStringBuilder builder; + JoinToString(&builder, begin, end, formatter, delimiter); + return builder.Flush(); +} + +//! A handy shortcut with default formatter. +template <class TIterator> +TString JoinToString( + const TIterator& begin, + const TIterator& end, + TStringBuf delimiter) +{ + return JoinToString(begin, end, TDefaultFormatter(), delimiter); +} + +//! Joins a collection of given items into a string intermixing them with the delimiter. +/*! + * \param collection A collection containing the items to be joined. + * \param formatter Formatter to apply to the items. + * \param delimiter A delimiter to be inserted between items; ", " by default. + */ +template <class TCollection, class TFormatter> +TString JoinToString( + const TCollection& collection, + const TFormatter& formatter, + TStringBuf delimiter) +{ + using std::begin; + using std::end; + return JoinToString(begin(collection), end(collection), formatter, delimiter); +} + +//! A handy shortcut with the default formatter. +template <class TCollection> +TString JoinToString( + const TCollection& collection, + TStringBuf delimiter) +{ + return JoinToString(collection, TDefaultFormatter(), delimiter); +} + +//! Concatenates a bunch of TStringBuf-like instances into TString. +template <class... Ts> +TString ConcatToString(Ts... args) +{ + size_t length = 0; + ((length += args.length()), ...); + + TString result; + result.reserve(length); + (result.append(args), ...); + + return result; +} + +//! Converts a range of items into strings. +template <class TIter, class TFormatter> +std::vector<TString> ConvertToStrings( + const TIter& begin, + const TIter& end, + const TFormatter& formatter, + size_t maxSize) +{ + std::vector<TString> result; + for (auto it = begin; it != end; ++it) { + TStringBuilder builder; + formatter(&builder, *it); + result.push_back(builder.Flush()); + if (result.size() == maxSize) { + break; + } + } + return result; +} + +//! A handy shortcut with the default formatter. +template <class TIter> +std::vector<TString> ConvertToStrings( + const TIter& begin, + const TIter& end, + size_t maxSize) +{ + return ConvertToStrings(begin, end, TDefaultFormatter(), maxSize); +} + +//! Converts a given collection of items into strings. +/*! + * \param collection A collection containing the items to be converted. + * \param formatter Formatter to apply to the items. + * \param maxSize Size limit for the resulting vector. + */ +template <class TCollection, class TFormatter> +std::vector<TString> ConvertToStrings( + const TCollection& collection, + const TFormatter& formatter, + size_t maxSize) +{ + using std::begin; + using std::end; + return ConvertToStrings(begin(collection), end(collection), formatter, maxSize); +} + +//! A handy shortcut with default formatter. +template <class TCollection> +std::vector<TString> ConvertToStrings( + const TCollection& collection, + size_t maxSize) +{ + return ConvertToStrings(collection, TDefaultFormatter(), maxSize); +} + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT diff --git a/library/cpp/yt/string/string.h b/library/cpp/yt/string/string.h index a131b40a2a..8257c1a5ea 100644 --- a/library/cpp/yt/string/string.h +++ b/library/cpp/yt/string/string.h @@ -1,6 +1,6 @@ #pragma once -#include "string_builder.h" +#include "format_arg.h" #include <util/datetime/base.h> @@ -52,37 +52,21 @@ void JoinToString( const TIterator& begin, const TIterator& end, const TFormatter& formatter, - TStringBuf delimiter = DefaultJoinToStringDelimiter) -{ - for (auto current = begin; current != end; ++current) { - if (current != begin) { - builder->AppendString(delimiter); - } - formatter(builder, *current); - } -} + TStringBuf delimiter = DefaultJoinToStringDelimiter); template <class TIterator, class TFormatter> TString JoinToString( const TIterator& begin, const TIterator& end, const TFormatter& formatter, - TStringBuf delimiter = DefaultJoinToStringDelimiter) -{ - TStringBuilder builder; - JoinToString(&builder, begin, end, formatter, delimiter); - return builder.Flush(); -} + TStringBuf delimiter = DefaultJoinToStringDelimiter); //! A handy shortcut with default formatter. template <class TIterator> TString JoinToString( const TIterator& begin, const TIterator& end, - TStringBuf delimiter = DefaultJoinToStringDelimiter) -{ - return JoinToString(begin, end, TDefaultFormatter(), delimiter); -} + TStringBuf delimiter = DefaultJoinToStringDelimiter); //! Joins a collection of given items into a string intermixing them with the delimiter. /*! @@ -94,35 +78,17 @@ template <class TCollection, class TFormatter> TString JoinToString( const TCollection& collection, const TFormatter& formatter, - TStringBuf delimiter = DefaultJoinToStringDelimiter) -{ - using std::begin; - using std::end; - return JoinToString(begin(collection), end(collection), formatter, delimiter); -} + TStringBuf delimiter = DefaultJoinToStringDelimiter); //! A handy shortcut with the default formatter. template <class TCollection> TString JoinToString( const TCollection& collection, - TStringBuf delimiter = DefaultJoinToStringDelimiter) -{ - return JoinToString(collection, TDefaultFormatter(), delimiter); -} + TStringBuf delimiter = DefaultJoinToStringDelimiter); //! Concatenates a bunch of TStringBuf-like instances into TString. template <class... Ts> -TString ConcatToString(Ts... args) -{ - size_t length = 0; - ((length += args.length()), ...); - - TString result; - result.reserve(length); - (result.append(args), ...); - - return result; -} +TString ConcatToString(Ts... args); //! Converts a range of items into strings. template <class TIter, class TFormatter> @@ -130,29 +96,14 @@ std::vector<TString> ConvertToStrings( const TIter& begin, const TIter& end, const TFormatter& formatter, - size_t maxSize = std::numeric_limits<size_t>::max()) -{ - std::vector<TString> result; - for (auto it = begin; it != end; ++it) { - TStringBuilder builder; - formatter(&builder, *it); - result.push_back(builder.Flush()); - if (result.size() == maxSize) { - break; - } - } - return result; -} + size_t maxSize = std::numeric_limits<size_t>::max()); //! A handy shortcut with the default formatter. template <class TIter> std::vector<TString> ConvertToStrings( const TIter& begin, const TIter& end, - size_t maxSize = std::numeric_limits<size_t>::max()) -{ - return ConvertToStrings(begin, end, TDefaultFormatter(), maxSize); -} + size_t maxSize = std::numeric_limits<size_t>::max()); //! Converts a given collection of items into strings. /*! @@ -164,21 +115,13 @@ template <class TCollection, class TFormatter> std::vector<TString> ConvertToStrings( const TCollection& collection, const TFormatter& formatter, - size_t maxSize = std::numeric_limits<size_t>::max()) -{ - using std::begin; - using std::end; - return ConvertToStrings(begin(collection), end(collection), formatter, maxSize); -} + size_t maxSize = std::numeric_limits<size_t>::max()); //! A handy shortcut with default formatter. template <class TCollection> std::vector<TString> ConvertToStrings( const TCollection& collection, - size_t maxSize = std::numeric_limits<size_t>::max()) -{ - return ConvertToStrings(collection, TDefaultFormatter(), maxSize); -} + size_t maxSize = std::numeric_limits<size_t>::max()); //////////////////////////////////////////////////////////////////////////////// @@ -222,3 +165,7 @@ TStringBuf FormatBool(bool value); //////////////////////////////////////////////////////////////////////////////// } // namespace NYT + +#define STRING_INL_H_ +#include "string-inl.h" +#undef STRING_INL_H_ diff --git a/library/cpp/yt/string/string_builder-inl.h b/library/cpp/yt/string/string_builder-inl.h deleted file mode 100644 index 24f1e33880..0000000000 --- a/library/cpp/yt/string/string_builder-inl.h +++ /dev/null @@ -1,191 +0,0 @@ -#ifndef STRING_BUILDER_INL_H_ -#error "Direct inclusion of this file is not allowed, include string.h" -// For the sake of sane code completion. -#include "string_builder.h" -#endif - -#include <library/cpp/yt/assert/assert.h> - -#include <util/stream/str.h> - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -inline char* TStringBuilderBase::Preallocate(size_t size) -{ - Reserve(size + GetLength()); - return Current_; -} - -inline void TStringBuilderBase::Reserve(size_t size) -{ - if (Y_UNLIKELY(End_ - Begin_ < static_cast<ssize_t>(size))) { - size_t length = GetLength(); - auto newLength = std::max(size, MinBufferLength); - DoReserve(newLength); - Current_ = Begin_ + length; - } -} - -inline size_t TStringBuilderBase::GetLength() const -{ - return Current_ ? Current_ - Begin_ : 0; -} - -inline TStringBuf TStringBuilderBase::GetBuffer() const -{ - return TStringBuf(Begin_, Current_); -} - -inline void TStringBuilderBase::Advance(size_t size) -{ - Current_ += size; - YT_ASSERT(Current_ <= End_); -} - -inline void TStringBuilderBase::AppendChar(char ch) -{ - *Preallocate(1) = ch; - Advance(1); -} - -inline void TStringBuilderBase::AppendChar(char ch, int n) -{ - YT_ASSERT(n >= 0); - if (Y_LIKELY(0 != n)) { - char* dst = Preallocate(n); - ::memset(dst, ch, n); - Advance(n); - } -} - -inline void TStringBuilderBase::AppendString(TStringBuf str) -{ - if (Y_LIKELY(str)) { - char* dst = Preallocate(str.length()); - ::memcpy(dst, str.begin(), str.length()); - Advance(str.length()); - } -} - -inline void TStringBuilderBase::AppendString(const char* str) -{ - AppendString(TStringBuf(str)); -} - -inline void TStringBuilderBase::Reset() -{ - Begin_ = Current_ = End_ = nullptr; - DoReset(); -} - -template <class... TArgs> -void TStringBuilderBase::AppendFormat(TStringBuf format, TArgs&& ... args) -{ - Format(this, TRuntimeFormat{format}, std::forward<TArgs>(args)...); -} - -template <size_t Length, class... TArgs> -void TStringBuilderBase::AppendFormat(const char (&format)[Length], TArgs&& ... args) -{ - Format(this, TRuntimeFormat{format}, std::forward<TArgs>(args)...); -} - -//////////////////////////////////////////////////////////////////////////////// - -inline TString TStringBuilder::Flush() -{ - Buffer_.resize(GetLength()); - auto result = std::move(Buffer_); - Reset(); - return result; -} - -inline void TStringBuilder::DoReset() -{ - Buffer_ = {}; -} - -inline void TStringBuilder::DoReserve(size_t newLength) -{ - Buffer_.ReserveAndResize(newLength); - auto capacity = Buffer_.capacity(); - Buffer_.ReserveAndResize(capacity); - Begin_ = &*Buffer_.begin(); - End_ = Begin_ + capacity; -} - -//////////////////////////////////////////////////////////////////////////////// - -inline void FormatValue(TStringBuilderBase* builder, const TStringBuilder& value, TStringBuf /*spec*/) -{ - builder->AppendString(value.GetBuffer()); -} - -template <class T> -TString ToStringViaBuilder(const T& value, TStringBuf spec) -{ - TStringBuilder builder; - FormatValue(&builder, value, spec); - return builder.Flush(); -} - -//////////////////////////////////////////////////////////////////////////////// - -// Compatibility for users of NYT::ToString(nyt_type). -template <CFormattable T> -TString ToString(const T& t) -{ - return ToStringViaBuilder(t); -} - -// Sometime we want to implement -// FormatValue using util's ToString -// However, if we inside the FormatValue -// we cannot just call the ToString since -// in this scope T is already CFormattable -// and ToString will call the very -// FormatValue we are implementing, -// causing an infinite recursion loop. -// This method is basically a call to -// util's ToString default implementation. -template <class T> -TString ToStringIgnoringFormatValue(const T& t) -{ - TString s; - ::TStringOutput o(s); - o << t; - return s; -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT - -#include <util/string/cast.h> - -// util/string/cast.h extension for yt and std types only -// TODO(arkady-e1ppa): Abolish ::ToString in -// favour of either NYT::ToString or -// automatic formatting wherever it is needed. -namespace NPrivate { - -//////////////////////////////////////////////////////////////////////////////// - -template <class T> - requires ( - (NYT::NDetail::IsNYTName<T>() || - NYT::NDetail::IsStdName<T>()) && - NYT::CFormattable<T>) -struct TToString<T, false> -{ - static TString Cvt(const T& t) - { - return NYT::ToStringViaBuilder(t); - } -}; - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NPrivate diff --git a/library/cpp/yt/string/string_builder.h b/library/cpp/yt/string/string_builder.h index 4cba45bc72..de1c1abb1e 100644 --- a/library/cpp/yt/string/string_builder.h +++ b/library/cpp/yt/string/string_builder.h @@ -1,6 +1,6 @@ #pragma once -#include "format_string.h" +#include "format.h" #include <util/generic/string.h> @@ -8,78 +8,6 @@ namespace NYT { //////////////////////////////////////////////////////////////////////////////// -// Forward declarations. -class TStringBuilderBase; -class TStringBuilder; -class TDelimitedStringBuilderWrapper; - -template <class... TArgs> -void Format(TStringBuilderBase* builder, TFormatString<TArgs...> fmt, TArgs&&... args); - -//////////////////////////////////////////////////////////////////////////////// - -//! 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; -}; - -//////////////////////////////////////////////////////////////////////////////// - -template <class T> -TString ToStringViaBuilder(const T& value, TStringBuf spec = TStringBuf("v")); - -//////////////////////////////////////////////////////////////////////////////// - //! Appends a certain delimiter starting from the second call. class TDelimitedStringBuilderWrapper : private TNonCopyable @@ -111,7 +39,3 @@ private: //////////////////////////////////////////////////////////////////////////////// } // namespace NYT - -#define STRING_BUILDER_INL_H_ -#include "string_builder-inl.h" -#undef STRING_BUILDER_INL_H_ |