mirror of
https://github.com/pantor/inja.git
synced 2026-05-21 19:45:24 +00:00
200 lines
5.4 KiB
C++
Executable File
200 lines
5.4 KiB
C++
Executable File
#ifndef __HAYAI_CONSOLE
|
|
#define __HAYAI_CONSOLE
|
|
|
|
#include <iostream>
|
|
|
|
#if !defined(HAYAI_NO_COLOR)
|
|
# if defined(_WIN32)
|
|
# ifndef NOMINMAX
|
|
# define NOMINMAX
|
|
# endif
|
|
# include <windows.h>
|
|
# else
|
|
# include <unistd.h>
|
|
# include <cstdio>
|
|
# endif
|
|
#endif
|
|
|
|
|
|
namespace hayai
|
|
{
|
|
/// Static helper class for outputting to a terminal/console.
|
|
class Console
|
|
{
|
|
public:
|
|
/// Console text colors.
|
|
enum TextColor
|
|
{
|
|
/// Default console color. Used for resets.
|
|
TextDefault,
|
|
|
|
/// Black.
|
|
///
|
|
/// @warning Avoid using black unless it is absolutely necesssary.
|
|
TextBlack,
|
|
|
|
/// Blue.
|
|
TextBlue,
|
|
|
|
/// Green.
|
|
TextGreen,
|
|
|
|
/// Cyan.
|
|
TextCyan,
|
|
|
|
/// Red.
|
|
TextRed,
|
|
|
|
/// Purple.
|
|
TextPurple,
|
|
|
|
/// Yellow.
|
|
TextYellow,
|
|
|
|
/// White.
|
|
///
|
|
/// @warning Avoid using white unless it is absolutely necessary.
|
|
TextWhite
|
|
};
|
|
|
|
|
|
/// Get the singleton instance of @ref Console.
|
|
|
|
/// @returns a reference to the singleton instance of the
|
|
/// benchmarker execution controller.
|
|
inline static Console& Instance()
|
|
{
|
|
static Console singleton;
|
|
return singleton;
|
|
}
|
|
|
|
|
|
/// Test if formatting is enabled.
|
|
inline static bool IsFormattingEnabled()
|
|
{
|
|
return Instance()._formattingEnabled;
|
|
}
|
|
|
|
|
|
/// Set whether formatting is enabled.
|
|
inline static void SetFormattingEnabled(bool enabled)
|
|
{
|
|
Instance()._formattingEnabled = enabled;
|
|
}
|
|
private:
|
|
inline Console()
|
|
: _formattingEnabled(true)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
bool _formattingEnabled;
|
|
};
|
|
|
|
#if defined(_WIN32) && !defined(HAYAI_NO_COLOR) // Windows
|
|
static inline WORD GetConsoleAttributes()
|
|
{
|
|
CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
|
|
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),
|
|
&consoleInfo);
|
|
return consoleInfo.wAttributes;
|
|
}
|
|
|
|
inline std::ostream& operator <<(std::ostream& stream,
|
|
const Console::TextColor& color)
|
|
{
|
|
static const WORD defaultConsoleAttributes =
|
|
GetConsoleAttributes();
|
|
WORD newColor;
|
|
|
|
if ((!Console::IsFormattingEnabled()) ||
|
|
((stream.rdbuf() != std::cout.rdbuf()) &&
|
|
(stream.rdbuf() != std::cerr.rdbuf())))
|
|
return stream;
|
|
|
|
switch(color)
|
|
{
|
|
case Console::TextDefault:
|
|
newColor = defaultConsoleAttributes;
|
|
break;
|
|
case Console::TextBlack:
|
|
newColor = 0;
|
|
break;
|
|
case Console::TextBlue:
|
|
newColor = FOREGROUND_BLUE;
|
|
break;
|
|
case Console::TextGreen:
|
|
newColor = FOREGROUND_GREEN;
|
|
break;
|
|
case Console::TextCyan:
|
|
newColor = FOREGROUND_GREEN | FOREGROUND_BLUE;
|
|
break;
|
|
case Console::TextRed:
|
|
newColor = FOREGROUND_RED;
|
|
break;
|
|
case Console::TextPurple:
|
|
newColor = FOREGROUND_RED | FOREGROUND_BLUE;
|
|
break;
|
|
case Console::TextYellow:
|
|
newColor =
|
|
FOREGROUND_RED |
|
|
FOREGROUND_GREEN |
|
|
FOREGROUND_INTENSITY;
|
|
break;
|
|
case Console::TextWhite:
|
|
newColor =
|
|
FOREGROUND_RED |
|
|
FOREGROUND_GREEN |
|
|
FOREGROUND_BLUE |
|
|
FOREGROUND_INTENSITY;
|
|
break;
|
|
}
|
|
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), newColor);
|
|
return stream;
|
|
}
|
|
#elif !defined(HAYAI_NO_COLOR) // Linux or others
|
|
inline std::ostream& operator <<(std::ostream& stream,
|
|
const Console::TextColor& color)
|
|
{
|
|
static const bool outputNoColor = isatty(fileno(stdout)) != 1;
|
|
|
|
if ((!Console::IsFormattingEnabled()) ||
|
|
(outputNoColor) ||
|
|
((stream.rdbuf() != std::cout.rdbuf()) &&
|
|
(stream.rdbuf() != std::cerr.rdbuf())))
|
|
return stream;
|
|
|
|
const char* value = "";
|
|
switch(color) {
|
|
case Console::TextDefault:
|
|
value = "\033[m"; break;
|
|
case Console::TextBlack:
|
|
value = "\033[0;30m"; break;
|
|
case Console::TextBlue:
|
|
value = "\033[0;34m"; break;
|
|
case Console::TextGreen:
|
|
value = "\033[0;32m"; break;
|
|
case Console::TextCyan:
|
|
value = "\033[0;36m"; break;
|
|
case Console::TextRed:
|
|
value = "\033[0;31m"; break;
|
|
case Console::TextPurple:
|
|
value = "\033[0;35m"; break;
|
|
case Console::TextYellow:
|
|
value = "\033[0;33m"; break;
|
|
case Console::TextWhite:
|
|
value = "\033[0;37m"; break;
|
|
}
|
|
return stream << value;
|
|
}
|
|
#else // No color
|
|
inline std::ostream& operator <<(std::ostream& stream,
|
|
const Console::TextColor&)
|
|
{
|
|
return stream;
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|