]> granicus.if.org Git - llvm/commitdiff
[formatv] Add the ability to specify a fill character when aligning.
authorZachary Turner <zturner@google.com>
Thu, 15 Jun 2017 03:06:38 +0000 (03:06 +0000)
committerZachary Turner <zturner@google.com>
Thu, 15 Jun 2017 03:06:38 +0000 (03:06 +0000)
Previously if you used fmt_align(7, Center) you would get the
output '   7   '.  It may be desirable for the user to specify
the fill character though, for example producing '---7---'.  This
patch adds that.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305449 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/FormatAdapters.h
include/llvm/Support/FormatCommon.h
unittests/Support/FormatVariadicTest.cpp

index 698e134b328deaba09e1fc791467f786b602bd27..197beb7363dfcf3a5085c5103f35b3a4f656bfaa 100644 (file)
@@ -28,14 +28,16 @@ namespace detail {
 template <typename T> class AlignAdapter final : public FormatAdapter<T> {
   AlignStyle Where;
   size_t Amount;
+  char Fill;
 
 public:
-  AlignAdapter(T &&Item, AlignStyle Where, size_t Amount)
-      : FormatAdapter<T>(std::forward<T>(Item)), Where(Where), Amount(Amount) {}
+  AlignAdapter(T &&Item, AlignStyle Where, size_t Amount, char Fill)
+      : FormatAdapter<T>(std::forward<T>(Item)), Where(Where), Amount(Amount),
+        Fill(Fill) {}
 
   void format(llvm::raw_ostream &Stream, StringRef Style) {
     auto Adapter = detail::build_format_adapter(std::forward<T>(this->Item));
-    FmtAlign(Adapter, Where, Amount).format(Stream, Style);
+    FmtAlign(Adapter, Where, Amount, Fill).format(Stream, Style);
   }
 };
 
@@ -72,8 +74,9 @@ public:
 }
 
 template <typename T>
-detail::AlignAdapter<T> fmt_align(T &&Item, AlignStyle Where, size_t Amount) {
-  return detail::AlignAdapter<T>(std::forward<T>(Item), Where, Amount);
+detail::AlignAdapter<T> fmt_align(T &&Item, AlignStyle Where, size_t Amount,
+                                  char Fill = ' ') {
+  return detail::AlignAdapter<T>(std::forward<T>(Item), Where, Amount, Fill);
 }
 
 template <typename T>
index a8c5fdeb6bffaa57a8f21be7e1757f040a71bb8d..36fbad296c3f2bd1b83ff6a9fdd2724027d077b9 100644 (file)
@@ -21,9 +21,11 @@ struct FmtAlign {
   detail::format_adapter &Adapter;
   AlignStyle Where;
   size_t Amount;
+  char Fill;
 
-  FmtAlign(detail::format_adapter &Adapter, AlignStyle Where, size_t Amount)
-      : Adapter(Adapter), Where(Where), Amount(Amount) {}
+  FmtAlign(detail::format_adapter &Adapter, AlignStyle Where, size_t Amount,
+           char Fill = ' ')
+      : Adapter(Adapter), Where(Where), Amount(Amount), Fill(Fill) {}
 
   void format(raw_ostream &S, StringRef Options) {
     // If we don't need to align, we can format straight into the underlying
@@ -48,21 +50,27 @@ struct FmtAlign {
     switch (Where) {
     case AlignStyle::Left:
       S << Item;
-      S.indent(PadAmount);
+      fill(S, PadAmount);
       break;
     case AlignStyle::Center: {
       size_t X = PadAmount / 2;
-      S.indent(X);
+      fill(S, X);
       S << Item;
-      S.indent(PadAmount - X);
+      fill(S, PadAmount - X);
       break;
     }
     default:
-      S.indent(PadAmount);
+      fill(S, PadAmount);
       S << Item;
       break;
     }
   }
+
+private:
+  void fill(llvm::raw_ostream &S, uint32_t Count) {
+    for (uint32_t I = 0; I < Count; ++I)
+      S << Fill;
+  }
 };
 }
 
index 99b90b17ae442b3d216b8dcb31d1b5bef102fb5f..5387a8ae499c901cdfb5bbc60047e295928074d8 100644 (file)
@@ -542,6 +542,8 @@ TEST(FormatVariadicTest, Adapter) {
 
   EXPECT_EQ("  171  ",
             formatv("{0}", fmt_align(N, AlignStyle::Center, 7)).str());
+  EXPECT_EQ("--171--",
+            formatv("{0}", fmt_align(N, AlignStyle::Center, 7, '-')).str());
   EXPECT_EQ(" 171   ", formatv("{0}", fmt_pad(N, 1, 3)).str());
   EXPECT_EQ("171171171171171", formatv("{0}", fmt_repeat(N, 5)).str());