137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===- RenderingSupport.h - output stream rendering support functions  ----===//
237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//                     The LLVM Compiler Infrastructure
437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// This file is distributed under the University of Illinois Open Source
637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// License. See LICENSE.TXT for details.
737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===//
937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_COV_RENDERINGSUPPORT_H
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_COV_RENDERINGSUPPORT_H
1237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Support/raw_ostream.h"
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include <utility>
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesnamespace llvm {
1737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// \brief A helper class that resets the output stream's color if needed
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// when destroyed.
2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass ColoredRawOstream {
21ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ColoredRawOstream(const ColoredRawOstream &OS) = delete;
2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic:
2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  raw_ostream &OS;
2537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool IsColorUsed;
2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ColoredRawOstream(raw_ostream &OS, bool IsColorUsed)
2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      : OS(OS), IsColorUsed(IsColorUsed) {}
2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ColoredRawOstream(ColoredRawOstream &&Other)
3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      : OS(Other.OS), IsColorUsed(Other.IsColorUsed) {
3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    // Reset the other IsColorUsed so that the other object won't reset the
3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    // color when destroyed.
3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Other.IsColorUsed = false;
3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ~ColoredRawOstream() {
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (IsColorUsed)
3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      OS.resetColor();
4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
4137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines};
4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinestemplate <typename T>
4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesinline raw_ostream &operator<<(const ColoredRawOstream &OS, T &&Value) {
4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return OS.OS << std::forward<T>(Value);
4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// \brief Change the color of the output stream if the `IsColorUsed` flag
4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// is true. Returns an object that resets the color when destroyed.
5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesinline ColoredRawOstream colored_ostream(raw_ostream &OS,
5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                         raw_ostream::Colors Color,
5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                         bool IsColorUsed = true,
5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                         bool Bold = false, bool BG = false) {
5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (IsColorUsed)
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    OS.changeColor(Color, Bold, BG);
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return ColoredRawOstream(OS, IsColorUsed);
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
5937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif // LLVM_COV_RENDERINGSUPPORT_H
61