1//===- RenderingSupport.h - output stream rendering support functions ----===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLVM_COV_RENDERINGSUPPORT_H 10#define LLVM_COV_RENDERINGSUPPORT_H 11 12#include "llvm/Support/raw_ostream.h" 13#include <utility> 14 15namespace llvm { 16 17/// A helper class that resets the output stream's color if needed 18/// when destroyed. 19class ColoredRawOstream { 20 ColoredRawOstream(const ColoredRawOstream &OS) = delete; 21 22public: 23 raw_ostream &OS; 24 bool IsColorUsed; 25 26 ColoredRawOstream(raw_ostream &OS, bool IsColorUsed) 27 : OS(OS), IsColorUsed(IsColorUsed) {} 28 29 ColoredRawOstream(ColoredRawOstream &&Other) 30 : OS(Other.OS), IsColorUsed(Other.IsColorUsed) { 31 // Reset the other IsColorUsed so that the other object won't reset the 32 // color when destroyed. 33 Other.IsColorUsed = false; 34 } 35 36 ~ColoredRawOstream() { 37 if (IsColorUsed) 38 OS.resetColor(); 39 } 40}; 41 42template <typename T> 43inline raw_ostream &operator<<(const ColoredRawOstream &OS, T &&Value) { 44 return OS.OS << std::forward<T>(Value); 45} 46 47/// Change the color of the output stream if the `IsColorUsed` flag 48/// is true. Returns an object that resets the color when destroyed. 49inline ColoredRawOstream colored_ostream(raw_ostream &OS, 50 raw_ostream::Colors Color, 51 bool IsColorUsed = true, 52 bool Bold = false, bool BG = false) { 53 if (IsColorUsed) 54 OS.changeColor(Color, Bold, BG); 55 return ColoredRawOstream(OS, IsColorUsed); 56} 57 58} // namespace llvm 59 60#endif // LLVM_COV_RENDERINGSUPPORT_H 61