21 static std::vector<String> s_outputs;
22 static std::vector<String> s_inputs;
24 static std::recursive_mutex s_mutex;
30 static bool s_colorsInitialized =
false;
32 void EnsureColorsInitialized() {
33 if (!s_colorsInitialized) {
35 CONSOLE_SCREEN_BUFFER_INFO csbi;
36 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
38 s_defaultBack = (
ConsoleColor)((csbi.wAttributes & 0xF0) >> 4);
39 s_currentFore = s_defaultFore;
40 s_currentBack = s_defaultBack;
43 s_colorsInitialized =
true;
55 std::lock_guard<std::recursive_mutex> lk(s_mutex);
56 s_accumulator = s_accumulator + sValue;
57 pWriter = s_pOutWriter;
61 std::cout << sValue.GetRawString() << std::flush;
67 pWriter->Write(sValue);
73 std::lock_guard<std::recursive_mutex> lk(s_mutex);
74 s_accumulator = s_accumulator + sValue;
75 s_outputs.push_back(s_accumulator);
76 pWriter = s_pOutWriter;
78 std::cout << sValue.GetRawString() << std::endl;
84 pWriter->WriteLine(sValue);
109 std::lock_guard<std::recursive_mutex> lk(s_mutex);
111 return s_pInReader->Read();
113 return std::cin.get();
117 std::lock_guard<std::recursive_mutex> lk(s_mutex);
119 return s_pInReader->ReadLine();
121 if (!s_inputs.empty()) {
122 String v = s_inputs.front();
123 s_inputs.erase(s_inputs.begin());
128 std::getline(std::cin, line);
129 return String(line.c_str());
134 CONSOLE_SCREEN_BUFFER_INFO csbi;
135 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
136 return csbi.dwCursorPosition.X;
148 CONSOLE_SCREEN_BUFFER_INFO csbi;
149 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
150 return csbi.dwCursorPosition.Y;
162 COORD coord = { (SHORT)left, (SHORT)top };
163 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
166 std::cout <<
"\033[" << (top + 1) <<
";" << (left + 1) <<
"H" << std::flush;
172 CONSOLE_CURSOR_INFO cci;
173 if (GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci)) {
174 return cci.bVisible != FALSE;
182 CONSOLE_CURSOR_INFO cci;
183 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
184 if (GetConsoleCursorInfo(hConsole, &cci)) {
185 cci.bVisible = visible;
186 SetConsoleCursorInfo(hConsole, &cci);
189 if (visible) std::cout <<
"\033[?25h" << std::flush;
190 else std::cout <<
"\033[?25l" << std::flush;
196 CONSOLE_SCREEN_BUFFER_INFO csbi;
197 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
198 return csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
206 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
207 CONSOLE_SCREEN_BUFFER_INFO csbi;
208 if (GetConsoleScreenBufferInfo(hConsole, &csbi)) {
209 SMALL_RECT rect = csbi.srWindow;
210 rect.Bottom = rect.Top + (SHORT)height - 1;
211 SetConsoleWindowInfo(hConsole, TRUE, &rect);
218 CONSOLE_SCREEN_BUFFER_INFO csbi;
219 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
220 return csbi.srWindow.Right - csbi.srWindow.Left + 1;
228 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
229 CONSOLE_SCREEN_BUFFER_INFO csbi;
230 if (GetConsoleScreenBufferInfo(hConsole, &csbi)) {
231 SMALL_RECT rect = csbi.srWindow;
232 rect.Right = rect.Left + (SHORT)width - 1;
233 SetConsoleWindowInfo(hConsole, TRUE, &rect);
240 return (GetKeyState(VK_CAPITAL) & 0x0001) != 0;
247 return (GetKeyState(VK_NUMLOCK) & 0x0001) != 0;
253 EnsureColorsInitialized();
255 CONSOLE_SCREEN_BUFFER_INFO csbi;
256 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
260 return s_currentBack;
264 EnsureColorsInitialized();
265 s_currentBack = color;
267 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
268 CONSOLE_SCREEN_BUFFER_INFO csbi;
269 if (GetConsoleScreenBufferInfo(hConsole, &csbi)) {
270 WORD attributes = (csbi.wAttributes & 0xFF0F) | (((WORD)color << 4) & 0x00F0);
271 SetConsoleTextAttribute(hConsole, attributes);
274 static const int ansiBack[] = { 40, 44, 42, 46, 41, 45, 43, 47, 100, 104, 102, 106, 101, 105, 103, 107 };
275 int idx =
static_cast<int>(color);
276 if (idx >= 0 && idx < 16) {
277 std::cout <<
"\033[" << ansiBack[idx] <<
"m" << std::flush;
283 EnsureColorsInitialized();
285 CONSOLE_SCREEN_BUFFER_INFO csbi;
286 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
290 return s_currentFore;
294 EnsureColorsInitialized();
295 s_currentFore = color;
297 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
298 CONSOLE_SCREEN_BUFFER_INFO csbi;
299 if (GetConsoleScreenBufferInfo(hConsole, &csbi)) {
300 WORD attributes = (csbi.wAttributes & 0xFFF0) | ((WORD)color & 0x000F);
301 SetConsoleTextAttribute(hConsole, attributes);
304 static const int ansiFore[] = { 30, 34, 32, 36, 31, 35, 33, 37, 90, 94, 92, 96, 91, 95, 93, 97 };
305 int idx =
static_cast<int>(color);
306 if (idx >= 0 && idx < 16) {
307 std::cout <<
"\033[" << ansiFore[idx] <<
"m" << std::flush;
313 EnsureColorsInitialized();
317 std::cout <<
"\033[0m" << std::flush;
323 wchar_t title[MAX_PATH];
324 if (GetConsoleTitleW(title, MAX_PATH)) {
328 return s_consoleTitle;
332 s_consoleTitle = title;
336 std::cout <<
"\033]0;" << title.
GetRawString() <<
"\007" << std::flush;
344 std::cout <<
"\a" << std::flush;
350 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
351 CONSOLE_SCREEN_BUFFER_INFO csbi;
352 DWORD count, cellCount;
353 COORD home = { 0, 0 };
354 if (GetConsoleScreenBufferInfo(h, &csbi)) {
355 cellCount = csbi.dwSize.X * csbi.dwSize.Y;
356 FillConsoleOutputCharacterW(h, (
wchar_t)
' ', cellCount, home, &count);
357 FillConsoleOutputAttribute(h, csbi.wAttributes, cellCount, home, &count);
358 SetConsoleCursorPosition(h, home);
361 std::cout <<
"\033[2J\033[1;1H" << std::flush;
366 std::lock_guard<std::recursive_mutex> lk(s_mutex);
369 s_accumulator =
String(
"");
370 s_pOutWriter =
nullptr;
371 s_pErrorWriter =
nullptr;
372 s_pInReader =
nullptr;
377 std::lock_guard<std::recursive_mutex> lk(s_mutex);
378 s_pOutWriter = pOutWriter;
382 std::lock_guard<std::recursive_mutex> lk(s_mutex);
383 s_pErrorWriter = pErrorWriter;
390 std::lock_guard<std::recursive_mutex> lk(s_mutex);
391 s_pInReader = pInReader;
395 std::lock_guard<std::recursive_mutex> lk(s_mutex);
400 std::lock_guard<std::recursive_mutex> lk(s_mutex);
401 return s_pErrorWriter;
405 std::lock_guard<std::recursive_mutex> lk(s_mutex);
410 std::lock_guard<std::recursive_mutex> lk(s_mutex);
411 s_inputs.push_back(value);
415 std::lock_guard<std::recursive_mutex> lk(s_mutex);
420 std::lock_guard<std::recursive_mutex> lock(s_mutex);
422 for (
int i = 0; i < (int)s_outputs.size(); i++) result[i] = s_outputs[i];
void InternalWriteLine(const String &sValue)
static void ClearConsoleScreenNative()
void InternalWrite(const String &sValue)
Represents standard input, output, and error streams for console applications.
ArgumentException(const String &sMessage)
Initializes a new instance of the ArgumentException class with a specified error message.
Provides methods for creating, manipulating, searching, and sorting arrays, thereby serving as the ba...
Represents a Unicode character (as a UTF-32 char32_t code point).
static void SetWindowHeight(int iHeight)
static void SetError(const SmartPointer< IO::TextWriter > &pErrorWriter)
static SmartPointer< IO::TextWriter > Error()
static bool GetNumberLock()
static void SetBackgroundColor(ConsoleColor enumColor)
static void SetOut(const SmartPointer< IO::TextWriter > &pOutWriter)
static void SetTitle(const String &sTitle)
static int GetCursorLeft()
static void Write(bool bValue)
static void SetWindowWidth(int iWidth)
static void ClearInputs()
static int GetWindowWidth()
static void SetCursorTop(int iTop)
static ConsoleColor GetForegroundColor()
static SmartPointer< IO::TextWriter > Out()
static ConsoleColor GetBackgroundColor()
static bool GetCapsLock()
static void SetIn(const SmartPointer< IO::TextReader > &pInReader)
static int GetWindowHeight()
static bool GetCursorVisible()
static void SetCursorVisible(bool bVisible)
static void SetCursorPosition(int iLeft, int iTop)
static void SetCursorLeft(int iLeft)
static int GetCursorTop()
static Array< String > GetOutputs()
static SmartPointer< IO::TextReader > In()
static void SetForegroundColor(ConsoleColor enumColor)
A unified smart pointer that supports both unique and shared ownership semantics.
Represents text as a sequence of UTF-8 code units with culture-invariant operations.
String()
Initializes a new instance of the String class to an empty string.
const char * GetRawString() const
std::string WCharToUtf8(const wchar_t *pWStr)
std::wstring Utf8ToWChar(const char *pUtf8Str)
ConsoleColor
Specifies constants that define foreground and background colors for the console.