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