17 #ifndef DOXYGEN_SHOULD_SKIP_THIS
99 #ifndef DOXYGEN_SHOULD_SKIP_THIS
101 namespace rang_implementation {
104 using std::enable_if;
107 using std::streambuf;
110 std::atomic<control> &
111 controlMode()
noexcept {
112 static std::atomic<control> value(control::Auto);
117 std::atomic<winTerm> &
118 winTermMode() noexcept {
119 static std::atomic<winTerm> termMode(winTerm::Auto);
123 template <
typename T>
124 using enableStd =
typename enable_if<
125 is_same<T, rang::style>::value ||
126 is_same<T, rang::fg>::value ||
127 is_same<T, rang::bg>::value ||
128 is_same<T, rang::fgB>::value ||
129 is_same<T, rang::bgB>::value,
133 extern bool isTerminal( streambuf
const * )
noexcept;
134 extern bool supportsAnsi( streambuf
const * )
noexcept;
135 extern bool supportsColor() noexcept;
137 #ifdef UTILS_OS_WINDOWS
138 template <
typename T>
141 setWinColorAnsi( ostream &os, T
const value ) {
142 os <<
"\033[" <<
static_cast<int>(value) <<
"m";
145 void setWinColorNative( ostream &os,
enum rang::style value );
146 void setWinColorNative( ostream &os,
enum rang::bg value );
147 void setWinColorNative( ostream &os,
enum rang::fg value );
148 void setWinColorNative( ostream &os,
enum rang::bgB value );
149 void setWinColorNative( ostream &os,
enum rang::fgB value );
151 template <
typename T>
154 setColor( ostream &os, T
const value ) {
155 if (winTermMode() == winTerm::Auto) {
156 if (supportsAnsi(os.rdbuf())) {
157 setWinColorAnsi(os, value);
159 setWinColorNative(os, value);
161 }
else if (winTermMode() == winTerm::Ansi) {
162 setWinColorAnsi(os, value);
164 setWinColorNative(os, value);
169 template <
typename T>
172 setColor( ostream &os, T
const value ) {
173 return os <<
"\033[" <<
static_cast<int>(value) <<
"m";
179 template <
typename T>
181 rang_implementation::enableStd<T>
183 control const option = rang_implementation::controlMode();
186 return rang_implementation::supportsColor()
187 && rang_implementation::isTerminal(os.rdbuf())
188 ? rang_implementation::setColor(os, value)
191 return rang_implementation::setColor(os, value);
200 rang_implementation::winTermMode() = value;
205 setControlMode(
control const value )
noexcept {
206 rang_implementation::controlMode() = value;
Utils::ostream_type & operator<<(Utils::ostream_type &stream, Utils::Table::Row const &row)
Stream insertion operator for rendering a table row to an output stream.
Definition Table.hxx:379