diff --git a/llvm/include/llvm/Support/raw_ostream.h b/llvm/include/llvm/Support/raw_ostream.h index 2570c826502e7..34f91cbe9551f 100644 --- a/llvm/include/llvm/Support/raw_ostream.h +++ b/llvm/include/llvm/Support/raw_ostream.h @@ -769,6 +769,25 @@ class buffer_unique_ostream : public raw_svector_ostream { ~buffer_unique_ostream() override { *OS << str(); } }; +// Helper struct to add indentation to raw_ostream. Instead of +// OS.indent(6) << "more stuff"; +// you can use +// OS << indent(6) << "more stuff"; +// which has better ergonomics (and clang-formats better as well). +struct indent { + unsigned NumSpaces; + + explicit indent(unsigned NumSpaces) : NumSpaces(NumSpaces) {} + void operator+=(unsigned N) { NumSpaces += N; } + void operator-=(unsigned N) { NumSpaces -= N; } + indent operator+(unsigned N) const { return indent(NumSpaces + N); } + indent operator-(unsigned N) const { return indent(NumSpaces - N); } +}; + +inline raw_ostream &operator<<(raw_ostream &OS, const indent &Indent) { + return OS.indent(Indent.NumSpaces); +} + class Error; /// This helper creates an output stream and then passes it to \p Write. diff --git a/llvm/unittests/Support/raw_ostream_test.cpp b/llvm/unittests/Support/raw_ostream_test.cpp index 1c6dfb6260cc0..99aa350adad71 100644 --- a/llvm/unittests/Support/raw_ostream_test.cpp +++ b/llvm/unittests/Support/raw_ostream_test.cpp @@ -177,6 +177,19 @@ TEST(raw_ostreamTest, Justify) { EXPECT_EQ("none", printToString(center_justify("none", 1), 1)); } +TEST(raw_ostreamTest, Indent) { + indent Indent(4); + auto Spaces = [](int N) { return std::string(N, ' '); }; + EXPECT_EQ(Spaces(4), printToString(Indent)); + EXPECT_EQ("", printToString(indent(0))); + EXPECT_EQ(Spaces(5), printToString(Indent + 1)); + EXPECT_EQ(Spaces(3), printToString(Indent - 1)); + Indent += 1; + EXPECT_EQ(Spaces(5), printToString(Indent)); + Indent -= 1; + EXPECT_EQ(Spaces(4), printToString(Indent)); +} + TEST(raw_ostreamTest, FormatHex) { EXPECT_EQ("0x1234", printToString(format_hex(0x1234, 6), 6)); EXPECT_EQ("0x001234", printToString(format_hex(0x1234, 8), 8)); diff --git a/llvm/utils/yaml-bench/YAMLBench.cpp b/llvm/utils/yaml-bench/YAMLBench.cpp index 50e55538a011c..4dc6caeb6fdbf 100644 --- a/llvm/utils/yaml-bench/YAMLBench.cpp +++ b/llvm/utils/yaml-bench/YAMLBench.cpp @@ -56,17 +56,6 @@ cl::opt UseColor("use-color", cl::desc("Emit colored output (default=autodetect)"), cl::init(cl::BOU_UNSET)); -struct indent { - unsigned distance; - indent(unsigned d) : distance(d) {} -}; - -static raw_ostream &operator <<(raw_ostream &os, const indent &in) { - for (unsigned i = 0; i < in.distance; ++i) - os << " "; - return os; -} - /// Pretty print a tag by replacing tag:yaml.org,2002: with !!. static std::string prettyTag(yaml::Node *N) { std::string Tag = N->getVerbatimTag();