Browse Source

YT: Add NYT::FormatVector
5da23499c430efcdae980093fd84c8391537660c

ionagamed 10 months ago
parent
commit
a385785f95
2 changed files with 74 additions and 0 deletions
  1. 67 0
      library/cpp/yt/string/format-inl.h
  2. 7 0
      library/cpp/yt/string/unittests/format_ut.cpp

+ 67 - 0
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

+ 7 - 0
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