diff options
author | ionagamed <ionagamed@yandex-team.com> | 2024-05-13 14:09:39 +0300 |
---|---|---|
committer | ionagamed <ionagamed@yandex-team.com> | 2024-05-13 14:19:57 +0300 |
commit | a385785f956c71f8a29c4dd97d0fbb5d0fb08364 (patch) | |
tree | f6ed3ac1acba501556d1574e31c3c36e2ba129bc /library/cpp/yt/string/format-inl.h | |
parent | 7b31bb09a816431b42dc0a7d01398445ca700477 (diff) | |
download | ydb-a385785f956c71f8a29c4dd97d0fbb5d0fb08364.tar.gz |
YT: Add NYT::FormatVector
5da23499c430efcdae980093fd84c8391537660c
Diffstat (limited to 'library/cpp/yt/string/format-inl.h')
-rw-r--r-- | library/cpp/yt/string/format-inl.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/library/cpp/yt/string/format-inl.h b/library/cpp/yt/string/format-inl.h index bee888b2f0..4d9634039c 100644 --- a/library/cpp/yt/string/format-inl.h +++ b/library/cpp/yt/string/format-inl.h @@ -733,6 +733,33 @@ struct TArgFormatterImpl<IndexBase, THeadArg, TTailArgs...> } }; +template <typename TVectorElement> +struct TSpanArgFormatterImpl +{ + explicit TSpanArgFormatterImpl(std::span<TVectorElement> v) + : Span_(v) + { } + + explicit TSpanArgFormatterImpl(const std::vector<TVectorElement>& v) + : Span_(v.begin(), v.size()) + { } + + explicit TSpanArgFormatterImpl(const TVector<TVectorElement>& v) + : Span_(v.begin(), v.size()) + { } + + std::span<const TVectorElement> Span_; + + void operator() (size_t index, TStringBuilderBase* builder, TStringBuf format) const + { + if (index >= Span_.size()) { + builder->AppendString(TStringBuf("<missing argument>")); + } else { + FormatValue(builder, *(Span_.begin() + index), format); + } + } +}; + //////////////////////////////////////////////////////////////////////////////// template <size_t Length, class... TArgs> @@ -774,6 +801,46 @@ TString Format( return builder.Flush(); } +template <size_t Length, class TVector> +void FormatVector( + TStringBuilderBase* builder, + const char (&format)[Length], + const TVector& vec) +{ + TSpanArgFormatterImpl formatter(vec); + NYT::NDetail::FormatImpl(builder, format, formatter); +} + +template <class TVector> +void FormatVector( + TStringBuilderBase* builder, + TStringBuf format, + const TVector& vec) +{ + TSpanArgFormatterImpl formatter(vec); + NYT::NDetail::FormatImpl(builder, format, formatter); +} + +template <size_t Length, class TVector> +TString FormatVector( + const char (&format)[Length], + const TVector& vec) +{ + TStringBuilder builder; + FormatVector(&builder, format, vec); + return builder.Flush(); +} + +template <class TVector> +TString FormatVector( + TStringBuf format, + const TVector& vec) +{ + TStringBuilder builder; + FormatVector(&builder, format, vec); + return builder.Flush(); +} + //////////////////////////////////////////////////////////////////////////////// } // namespace NYT |