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