aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yt/string/format-inl.h
diff options
context:
space:
mode:
authorionagamed <ionagamed@yandex-team.com>2024-05-13 14:09:39 +0300
committerionagamed <ionagamed@yandex-team.com>2024-05-13 14:19:57 +0300
commita385785f956c71f8a29c4dd97d0fbb5d0fb08364 (patch)
treef6ed3ac1acba501556d1574e31c3c36e2ba129bc /library/cpp/yt/string/format-inl.h
parent7b31bb09a816431b42dc0a7d01398445ca700477 (diff)
downloadydb-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.h67
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