C++ Utilities  5.0.1
Useful C++ classes and routines such as argument parser, IO and conversion utilities
ansiescapecodes.h
Go to the documentation of this file.
1 #ifndef IOUTILITIES_ANSIESCAPECODES
2 #define IOUTILITIES_ANSIESCAPECODES
3 
4 #include "../global.h"
5 #include "../misc/traits.h"
6 
7 #include <ostream>
8 #include <tuple>
9 
10 namespace CppUtilities {
11 namespace EscapeCodes {
12 
13 extern CPP_UTILITIES_EXPORT bool enabled;
14 
15 enum class Color : char { Black = '0', Red, Green, Yellow, Blue, Purple, Cyan, White };
16 
17 enum class ColorContext : char { Foreground = '3', Background = '4' };
18 
19 enum class TextAttribute : char {
20  Reset = '0',
21  Bold = '1',
22  Dim = '2',
23  Italic = '3',
24  Underscore = '4',
25  Blink = '5',
26  ReverseVideo = '7',
27  Concealed = '8',
28  Strikethrough = '9',
29 };
30 
31 enum class Direction : char { Up = 'A', Down = 'B', Forward = 'C', Backward = 'D' };
32 
33 inline void setStyle(std::ostream &stream, TextAttribute displayAttribute = TextAttribute::Reset)
34 {
35  if (enabled) {
36  stream << '\e' << '[' << static_cast<char>(displayAttribute) << 'm';
37  }
38 }
39 
40 inline void setStyle(
41  std::ostream &stream, Color color, ColorContext context = ColorContext::Foreground, TextAttribute displayAttribute = TextAttribute::Reset)
42 {
43  if (enabled) {
44  stream << '\e' << '[' << static_cast<char>(displayAttribute) << ';' << static_cast<char>(context) << static_cast<char>(color) << 'm';
45  }
46 }
47 
48 inline void setStyle(std::ostream &stream, Color foregroundColor, Color backgroundColor, TextAttribute displayAttribute = TextAttribute::Reset)
49 {
50  if (enabled) {
51  stream << '\e' << '[' << static_cast<char>(displayAttribute) << ';' << static_cast<char>(ColorContext::Foreground)
52  << static_cast<char>(foregroundColor) << ';' << static_cast<char>(ColorContext::Background) << static_cast<char>(backgroundColor)
53  << 'm';
54  }
55 }
56 
57 inline void resetStyle(std::ostream &stream)
58 {
59  if (enabled) {
60  stream << '\e' << '[' << static_cast<char>(TextAttribute::Reset) << 'm';
61  }
62 }
63 
64 inline void setCursor(std::ostream &stream, unsigned int row = 0, unsigned int col = 0)
65 {
66  if (enabled) {
67  stream << '\e' << '[' << row << ';' << col << 'H';
68  }
69 }
70 
71 inline void moveCursor(std::ostream &stream, unsigned int cells, Direction direction)
72 {
73  if (enabled) {
74  stream << '\e' << '[' << cells << static_cast<char>(direction);
75  }
76 }
77 
78 inline void saveCursor(std::ostream &stream)
79 {
80  if (enabled) {
81  stream << "\e[s";
82  }
83 }
84 
85 inline void restoreCursor(std::ostream &stream)
86 {
87  if (enabled) {
88  stream << "\e[u";
89  }
90 }
91 
92 inline void eraseDisplay(std::ostream &stream)
93 {
94  if (enabled) {
95  stream << "\e[2J";
96  }
97 }
98 
99 inline void eraseLine(std::ostream &stream)
100 {
101  if (enabled) {
102  stream << "\33[2K";
103  }
104 }
105 
106 inline std::ostream &operator<<(std::ostream &stream, TextAttribute displayAttribute)
107 {
108  setStyle(stream, displayAttribute);
109  return stream;
110 }
111 
112 constexpr auto color(Color foreground, Color background, TextAttribute displayAttribute = TextAttribute::Reset)
113 {
114  return std::make_tuple(foreground, background, displayAttribute);
115 }
116 
117 constexpr auto color(Color foreground, ColorContext context, TextAttribute displayAttribute = TextAttribute::Reset)
118 {
119  return std::make_tuple(foreground, context, displayAttribute);
120 }
121 
122 template <typename TupleType,
124  std::is_same<TupleType, std::tuple<Color, ColorContext, TextAttribute>>> * = nullptr>
125 inline std::ostream &operator<<(std::ostream &stream, TupleType displayAttribute)
126 {
127  setStyle(stream, std::get<0>(displayAttribute), std::get<1>(displayAttribute), std::get<2>(displayAttribute));
128  return stream;
129 }
130 
136 enum class Phrases {
137  Error,
138  Warning,
139  End,
140  PlainMessage,
142  SubMessage,
143  ErrorMessage,
145  EndFlush,
146  Info,
147  Override,
148  SubError,
149  SubWarning,
150 };
151 CPP_UTILITIES_EXPORT std::ostream &operator<<(std::ostream &stream, Phrases phrase);
152 
153 } // namespace EscapeCodes
154 } // namespace CppUtilities
155 
156 #endif // IOUTILITIES_ANSIESCAPECODES
CppUtilities::EscapeCodes::ColorContext
ColorContext
Definition: ansiescapecodes.h:17
CppUtilities::EscapeCodes::Color::Red
CppUtilities::EscapeCodes::moveCursor
void moveCursor(std::ostream &stream, unsigned int cells, Direction direction)
Definition: ansiescapecodes.h:71
CppUtilities::EscapeCodes::TextAttribute::Bold
CppUtilities::EscapeCodes::setCursor
void setCursor(std::ostream &stream, unsigned int row=0, unsigned int col=0)
Definition: ansiescapecodes.h:64
CppUtilities::EscapeCodes::eraseLine
void eraseLine(std::ostream &stream)
Definition: ansiescapecodes.h:99
CppUtilities::EscapeCodes::Phrases
Phrases
The Phrases enum contains standard phrases which can be printed to any std::ostream.
Definition: ansiescapecodes.h:136
CppUtilities::EscapeCodes::Color::Green
CppUtilities::EscapeCodes::Phrases::Override
CppUtilities::EscapeCodes::Direction::Up
CppUtilities::EscapeCodes::Phrases::SubMessage
CppUtilities::EscapeCodes::Phrases::Warning
CppUtilities::EscapeCodes::Direction::Backward
CppUtilities::EscapeCodes::Color::Black
CppUtilities::EscapeCodes::Phrases::End
CppUtilities::Traits::EnableIfAny
typename std::enable_if< Any< Condition... >::value, Detail::Enabler >::type EnableIfAny
Shortcut for std::enable_if to apply Traits::Any and omit ::value and ::type.
Definition: traits.h:55
CppUtilities::EscapeCodes::color
constexpr auto color(Color foreground, Color background, TextAttribute displayAttribute=TextAttribute::Reset)
Definition: ansiescapecodes.h:112
CppUtilities::EscapeCodes::operator<<
std::ostream & operator<<(std::ostream &stream, TextAttribute displayAttribute)
Definition: ansiescapecodes.h:106
CppUtilities::EscapeCodes::TextAttribute::ReverseVideo
CppUtilities::EscapeCodes::resetStyle
void resetStyle(std::ostream &stream)
Definition: ansiescapecodes.h:57
CppUtilities::EscapeCodes::Color::Yellow
CppUtilities::EscapeCodes::Phrases::Error
CppUtilities::EscapeCodes::Phrases::EndFlush
CppUtilities::EscapeCodes::Phrases::SubError
CppUtilities::EscapeCodes::Direction::Down
CppUtilities::EscapeCodes::TextAttribute::Concealed
CppUtilities::EscapeCodes::TextAttribute
TextAttribute
Definition: ansiescapecodes.h:19
CppUtilities::EscapeCodes::Phrases::ErrorMessage
CppUtilities::EscapeCodes::Direction
Direction
Definition: ansiescapecodes.h:31
CppUtilities
Contains all utilities provides by the c++utilities library.
Definition: argumentparser.h:17
CppUtilities::EscapeCodes::eraseDisplay
void eraseDisplay(std::ostream &stream)
Definition: ansiescapecodes.h:92
CppUtilities::EscapeCodes::TextAttribute::Underscore
CppUtilities::EscapeCodes::Phrases::PlainMessage
CppUtilities::EscapeCodes::saveCursor
void saveCursor(std::ostream &stream)
Definition: ansiescapecodes.h:78
CppUtilities::EscapeCodes::TextAttribute::Strikethrough
CppUtilities::EscapeCodes::TextAttribute::Italic
CppUtilities::EscapeCodes::TextAttribute::Blink
CppUtilities::EscapeCodes::TextAttribute::Dim
CppUtilities::EscapeCodes::Direction::Forward
CppUtilities::EscapeCodes::Phrases::Info
CppUtilities::EscapeCodes::Phrases::SuccessMessage
CppUtilities::EscapeCodes::Color
Color
Definition: ansiescapecodes.h:15
CppUtilities::EscapeCodes::ColorContext::Background
CppUtilities::EscapeCodes::Color::White
CppUtilities::EscapeCodes::Phrases::WarningMessage
CppUtilities::EscapeCodes::Color::Purple
CppUtilities::EscapeCodes::Phrases::SubWarning
CPP_UTILITIES_EXPORT
#define CPP_UTILITIES_EXPORT
Marks the symbol to be exported by the c++utilities library.
CppUtilities::EscapeCodes::restoreCursor
void restoreCursor(std::ostream &stream)
Definition: ansiescapecodes.h:85
CppUtilities::EscapeCodes::setStyle
void setStyle(std::ostream &stream, TextAttribute displayAttribute=TextAttribute::Reset)
Definition: ansiescapecodes.h:33
CppUtilities::EscapeCodes::ColorContext::Foreground
CppUtilities::EscapeCodes::Color::Blue
CppUtilities::EscapeCodes::Color::Cyan
CppUtilities::EscapeCodes::TextAttribute::Reset
CppUtilities::EscapeCodes::enabled
CPP_UTILITIES_EXPORT bool enabled
Controls whether the functions inside the EscapeCodes namespace actually make use of escape codes.
Definition: ansiescapecodes.cpp:22