aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
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
parent7b31bb09a816431b42dc0a7d01398445ca700477 (diff)
downloadydb-a385785f956c71f8a29c4dd97d0fbb5d0fb08364.tar.gz
YT: Add NYT::FormatVector
5da23499c430efcdae980093fd84c8391537660c
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/yt/string/format-inl.h67
-rw-r--r--library/cpp/yt/string/unittests/format_ut.cpp7
2 files changed, 74 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
diff --git a/library/cpp/yt/string/unittests/format_ut.cpp b/library/cpp/yt/string/unittests/format_ut.cpp
index 86c5b220ee..80162747cc 100644
--- a/library/cpp/yt/string/unittests/format_ut.cpp
+++ b/library/cpp/yt/string/unittests/format_ut.cpp
@@ -208,6 +208,13 @@ TEST(TFormatTest, LazyMultiValueFormatter)
EXPECT_EQ("int: 1, string: hello, range: [1, 2, 3]", Format("%v", lazyFormatter));
}
+TEST(TFormatTest, VectorArg)
+{
+ std::vector<TString> params = {"a", "b", "c"};
+
+ EXPECT_EQ(FormatVector("a is %v, b is %v, c is %v", params), "a is a, b is b, c is c");
+}
+
////////////////////////////////////////////////////////////////////////////////
} // namespace