NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
console.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_SYSTEM_CONSOLE_HPP__
2#define NEFORCE_CORE_SYSTEM_CONSOLE_HPP__
3
8
10#include "NeForce/core/exception/system_exception.hpp"
14NEFORCE_BEGIN_NAMESPACE__
15
21
26struct console_exception final : device_exception {
27 explicit console_exception(const char* info = "Pipe Operation Failed.",
28 const error_code code = last_error()) noexcept :
29 device_exception(info, code) {}
30
31 explicit console_exception(const exception& e) :
32 device_exception(e) {}
33
34 ~console_exception() override = default;
35
36 NEFORCE_NODISCARD const char* type() const noexcept override { return "console_exception"; }
37};
38 // Exceptions
40
46
62class NEFORCE_API sys_console {
63public:
68 struct console_size {
69 int width;
70 int height;
71
72 explicit console_size(const int w = 0, const int h = 0) :
73 width(w),
74 height(h) {}
75
79 NEFORCE_NODISCARD bool operator==(const console_size& other) const noexcept {
80 return width == other.width && height == other.height;
81 }
82
86 NEFORCE_NODISCARD bool operator!=(const console_size& other) const noexcept { return !(*this == other); }
87 };
88
89private:
93
94#ifdef NEFORCE_PLATFORM_WINDOWS
95 console_size saved_cursor_pos_{0, 0};
96#endif
97
98 mutable mutex mutex_;
99 console_size last_size_{0, 0};
100
101 bool alt_buffer_active_ = false; // 交替缓冲区是否激活
102 bool mouse_enabled_ = false; // 鼠标输入是否开启
103 int pending_char_ = -1; // kbhit 预读的字符,-1 表示无待处理字符
104
105private:
106 void print_string_unsafe(const string& str) const { print_string_unsafe(str.view()); }
107 void print_string_unsafe(string_view str) const;
108 void print_string_unsafe(const char* str) const { print_string_unsafe(string_view{str}); }
109
110 void print_error_unsafe(const string& str) const { print_error_unsafe(str.view()); }
111 void print_error_unsafe(string_view str) const;
112 void print_error_unsafe(const char* str) const { print_error_unsafe(string_view{str}); }
113
114 void set_color_unsafe(const color& color, bool use_256_color) const;
115 void typewriter_print_unsafe(string_view text, milliseconds delay_per_char, bool with_sound) const;
116
117 string readln_unsafe() const;
118 string read_unsafe() const;
119 char read_char_unsafe() const;
120 console_size get_console_size_unsafe() const;
121
122 void flush_unsafe() const;
123 void ignore_unsafe() const;
124
125 void beep_unsafe() const;
126 void flash_screen_unsafe() const;
127
128 void fade_effect_unsafe(string_view text, const color& from, const color& to, milliseconds duration,
129 bool is_fade_in) const;
130
131private:
132 sys_console() noexcept;
133
134public:
135 sys_console(const sys_console&) = delete;
136 sys_console& operator=(const sys_console&) = delete;
137 sys_console(sys_console&&) = delete;
138 sys_console& operator=(sys_console&&) = delete;
139
140 ~sys_console() = default;
141
146 static sys_console& instance() noexcept {
147 static sys_console console;
148 return console;
149 }
150
154 void flush();
155
159 void ignore();
160
165 void print_string(const string& str);
166
171 void print_string(const string_view& view);
172
177 void print_string(const char* str);
178
183 void print_error(const string& str);
184
189 void print_error(const string_view& view);
190
195 void print_error(const char* str);
196
201 string read();
202
207 string readln();
208
213 char read_char();
214
220 template <typename... Args>
221 void print(Args&&... args) {
222 lock<mutex> lock(mutex_);
223 this->print_string_unsafe(_NEFORCE concatenate(_NEFORCE forward<Args>(args)...));
224 }
225
232 template <typename... Args>
233 void printf(const string_view fmt, Args&&... args) {
234 lock<mutex> lock(mutex_);
235 this->print_string_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
236 }
237
244 template <typename... Args>
245 void printc(const color& color, Args&&... args) {
246 lock<mutex> lock(mutex_);
247 this->set_color_unsafe(color, false);
248 this->print_string_unsafe(_NEFORCE to_string(_NEFORCE forward<Args>(args)...));
249 this->print_string_unsafe("\033[0m");
250 }
251
259 template <typename... Args>
260 void printcf(const color& color, const string_view fmt, Args&&... args) {
261 lock<mutex> lock(mutex_);
262 this->set_color_unsafe(color, false);
263 this->print_string_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
264 this->print_string_unsafe("\033[0m");
265 }
266
269 void println();
270
276 template <typename... Args, enable_if_t<(sizeof...(Args) > 0), int> = 0>
277 void println(Args&&... args) {
278 lock<mutex> lock(mutex_);
279 this->print_string_unsafe(_NEFORCE concatenate(_NEFORCE forward<Args>(args)...));
280 this->print_string_unsafe("\n");
281 }
282
289 template <typename... Args>
290 void printfln(const string_view fmt, Args&&... args) {
291 lock<mutex> lock(mutex_);
292 this->print_string_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
293 this->print_string_unsafe("\n");
294 }
295
302 template <typename... Args>
303 void printcln(const color& color, Args&&... args) {
304 lock<mutex> lock(mutex_);
305 this->set_color_unsafe(color, false);
306 this->print_string_unsafe(_NEFORCE concatenate(_NEFORCE forward<Args>(args)...));
307 this->print_string_unsafe("\033[0m\n");
308 }
309
317 template <typename... Args>
318 void printcfln(const color& color, const string_view fmt, Args&&... args) {
319 lock<mutex> lock(mutex_);
320 this->set_color_unsafe(color, false);
321 this->print_string_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
322 this->print_string_unsafe("\033[0m\n");
323 }
324
330 template <typename... Args>
331 void eprint(Args&&... args) {
332 lock<mutex> lock(mutex_);
333 this->print_error_unsafe(_NEFORCE to_string(_NEFORCE forward<Args>(args)...));
334 }
335
342 template <typename... Args>
343 void eprintf(const string_view fmt, Args&&... args) {
344 lock<mutex> lock(mutex_);
345 this->print_error_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
346 }
347
351 void eprintln();
352
358 template <typename... Args, enable_if_t<(sizeof...(Args) > 0), int> = 0>
359 void eprintln(Args&&... args) {
360 lock<mutex> lock(mutex_);
361 this->print_error_unsafe(_NEFORCE concatenate(_NEFORCE forward<Args>(args)...));
362 this->print_error_unsafe("\n");
363 }
364
371 template <typename... Args>
372 void eprintfln(const string_view fmt, Args&&... args) {
373 lock<mutex> lock(mutex_);
374 this->print_error_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
375 this->print_error_unsafe("\n");
376 }
377
381 void clear();
382
387 void pause(string_view msg = "Press enter to continue...");
388
396 bool confirmation(string_view prompt = "Are you sure? (y/n): ", char yes = 'y', char no = 'n');
397
406 string password(string_view prompt = "Password: ", char mask = '*', bool show_length = false);
407
413
419 void set_color(const color& color, bool use_256_color = true);
420
426 void set_background_color(const color& color, bool use_256_color = true);
427
432
437 void set_bold(bool enable = true);
438
443 void set_underline(bool enable = true);
444
449 void set_blink(bool enable = true);
450
455 void set_reverse(bool enable = true);
456
461
467
472
477 void enable_virtual_terminal_processing(bool enable = true);
478
483 void enable_alternate_screen_buffer(bool enable = true);
484
490 void set_scroll_region(int top, int bottom);
491
496
502 void enable_mouse(bool enable = true);
503
508 NEFORCE_NODISCARD bool is_mouse_enabled() const;
509
514 NEFORCE_NODISCARD bool kbhit();
515
520 int getch();
521
530 void progress_bar(double percentage, int width = 50, bool show_percentage = true, char fill_char = '#',
531 char empty_char = ' ');
532
538 void set_cursor_position(int row, int column);
539
544
549
554 void hide_cursor(bool enable = true);
555
560 NEFORCE_NODISCARD console_size get_console_size() const;
561
566 NEFORCE_NODISCARD bool is_terminal_resized();
567
572 NEFORCE_NODISCARD bool supports_colors() const;
573
578 NEFORCE_NODISCARD bool supports_truecolor() const;
579
584 NEFORCE_NODISCARD bool supports_unicode() const;
585
590 NEFORCE_NODISCARD bool is_interactive() const;
591
596 NEFORCE_NODISCARD string console_type() const;
597
607
614 void typewriter_print(string_view text, milliseconds delay_per_char = milliseconds(50), bool with_sound = false);
615
622 void typewriter_println(string_view text, milliseconds delay_per_char = milliseconds(50), bool with_sound = false);
623
627 void beep();
628
633
640 void notification(string_view message, milliseconds duration = milliseconds(2000), bool play_sound = true);
641
650 const color& start_color = color::black(), const color& end_color = color::white());
651
660 const color& start_color = color::white(), const color& end_color = color::black());
661
669 void fade_in_out(string_view text, milliseconds in_duration = milliseconds(500),
670 milliseconds hold_duration = milliseconds(1000), milliseconds out_duration = milliseconds(500));
671};
672
676NEFORCE_API extern sys_console& console;
677
678
682template <typename... Args>
683void print(Args&&... args) {
684 console.print(_NEFORCE forward<Args>(args)...);
685}
686
690template <typename... Args>
691void printc(const color& color, Args&&... args) {
692 console.printc(color, _NEFORCE forward<Args>(args)...);
693}
694
698template <typename... Args>
699void println(Args&&... args) {
700 console.println(_NEFORCE forward<Args>(args)...);
701}
702
706template <typename... Args>
707void printcln(const color& color, Args&&... args) {
708 console.printcln(color, _NEFORCE forward<Args>(args)...);
709}
710
714template <typename... Args>
715void printf(const string_view fmt, Args&&... args) {
716 console.printf(fmt, _NEFORCE forward<Args>(args)...);
717}
718
722template <typename... Args>
723void printfln(const string_view fmt, Args&&... args) {
724 console.printfln(fmt, _NEFORCE forward<Args>(args)...);
725}
726
730template <typename... Args>
731void printcf(const color& color, const string_view fmt, Args&&... args) {
732 console.printcf(color, fmt, _NEFORCE forward<Args>(args)...);
733}
734
738template <typename... Args>
739void printcfln(const color& color, const string_view fmt, Args&&... args) {
740 console.printcfln(color, fmt, _NEFORCE forward<Args>(args)...);
741}
742
746template <typename... Args>
747void eprint(Args&&... args) {
748 console.eprint(_NEFORCE forward<Args>(args)...);
749}
750
754template <typename... Args>
755void eprintf(const string_view fmt, Args&&... args) {
756 console.eprintf(fmt, _NEFORCE forward<Args>(args)...);
757}
758
762template <typename... Args>
763void eprintln(Args&&... args) {
764 console.eprintln(_NEFORCE forward<Args>(args)...);
765}
766
770template <typename... Args>
771void eprintfln(const string_view fmt, Args&&... args) {
772 console.eprintfln(fmt, _NEFORCE forward<Args>(args)...);
773}
774 // ConsoleIO
776
777NEFORCE_END_NAMESPACE__
778#endif // NEFORCE_CORE_SYSTEM_CONSOLE_HPP__
RGB颜色类
static constexpr color black() noexcept
黑色
static constexpr color white() noexcept
白色
锁管理器模板
系统控制台单例类
void eprintln()
打印换行到错误流
void set_reverse(bool enable=true)
设置反色(交换前景色与背景色)
void beep()
发出蜂鸣声
void set_underline(bool enable=true)
设置下划线
void set_cursor_position(int row, int column)
设置光标位置
void hide_cursor(bool enable=true)
隐藏光标
void clear()
清空屏幕
bool supports_unicode() const
检查是否支持Unicode
string read()
读取输入(直到空白字符)
bool confirmation(string_view prompt="Are you sure? (y/n): ", char yes='y', char no='n')
用户确认对话框
void eprintln(Args &&... args)
打印任意类型的值到错误流并换行
void print_string(const char *str)
打印C风格字符串
void fade_in(string_view text, milliseconds duration=milliseconds(1000), const color &start_color=color::black(), const color &end_color=color::white())
淡入效果
void set_window_title(string_view title)
设置控制台窗口标题
void reset_text_attributes()
重置所有文本属性
void printf(const string_view fmt, Args &&... args)
格式化打印
void println()
打印换行
void set_scroll_region(int top, int bottom)
设置滚动区域
console_size query_cursor_position()
查询光标位置
void set_background_color(const color &color, bool use_256_color=true)
设置背景色
console_size get_console_size() const
获取控制台尺寸
void eprint(Args &&... args)
打印任意类型的值到错误流
bool kbhit()
检查是否有键盘输入可读(非阻塞)
void notification(string_view message, milliseconds duration=milliseconds(2000), bool play_sound=true)
显示通知
void printcln(const color &color, Args &&... args)
带颜色的打印并换行
void set_color(const color &color, bool use_256_color=true)
设置颜色
void eprintfln(const string_view fmt, Args &&... args)
格式化打印到错误流并换行
void enable_alternate_screen_buffer(bool enable=true)
启用或禁用交替屏幕缓冲区
void restore_cursor_position()
恢复光标位置
char read_char()
读取单个字符
bool supports_colors() const
检查是否支持颜色
void print_string(const string &str)
打印字符串
void print_string(const string_view &view)
打印字符串视图
void pause(string_view msg="Press enter to continue...")
暂停并等待用户按键
bool supports_truecolor() const
检查是否支持真彩色
void printc(const color &color, Args &&... args)
带颜色的打印
void fade_out(string_view text, milliseconds duration=milliseconds(1000), const color &start_color=color::white(), const color &end_color=color::black())
淡出效果
void printcfln(const color &color, const string_view fmt, Args &&... args)
带颜色的格式化打印并换行
void typewriter_println(string_view text, milliseconds delay_per_char=milliseconds(50), bool with_sound=false)
打字机效果打印并换行
void printfln(const string_view fmt, Args &&... args)
格式化打印并换行
void enable_mouse(bool enable=true)
启用或禁用鼠标输入捕获
void typewriter_print(string_view text, milliseconds delay_per_char=milliseconds(50), bool with_sound=false)
打字机效果打印
void reset_color()
重置颜色
void set_output_utf8()
设置控制台输出代码页为 UTF-8
bool is_interactive() const
检查是否是交互式终端
void save_cursor_position()
保存光标位置
void ignore()
抛弃输入缓冲区中的一行
void progress_bar(double percentage, int width=50, bool show_percentage=true, char fill_char='#', char empty_char=' ')
显示进度条
void print_error(const string_view &view)
打印字符串视图到错误流
bool is_mouse_enabled() const
检测当前是否已启用鼠标输入
void eprintf(const string_view fmt, Args &&... args)
格式化打印到错误流
void set_blink(bool enable=true)
设置闪烁
void flash_screen()
屏幕闪烁
void print_error(const string &str)
打印字符串到错误流
void flush()
刷新输出缓冲区
string console_type() const
获取终端类型
void print_error(const char *str)
打印C风格字符串到错误流
string readln()
读取一行输入
string password(string_view prompt="Password: ", char mask=' *', bool show_length=false)
密码输入
void set_color(const integer32 &color)
设置颜色(使用ANSI代码)
void print(Args &&... args)
打印任意类型的值
void set_bold(bool enable=true)
设置粗体
void reset_scroll_region()
重置滚动区域为整个屏幕
void printcf(const color &color, const string_view fmt, Args &&... args)
带颜色的格式化打印
void fade_in_out(string_view text, milliseconds in_duration=milliseconds(500), milliseconds hold_duration=milliseconds(1000), milliseconds out_duration=milliseconds(500))
淡入-保持-淡出效果
int getch()
读取一个字符(无回显,若无按键则阻塞)
bool is_terminal_resized()
检查终端是否已调整大小
void println(Args &&... args)
打印任意类型的值并换行
void enable_virtual_terminal_processing(bool enable=true)
启用虚拟终端处理
static sys_console & instance() noexcept
获取单例实例
颜色类
持续时间类型
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
void printf(const string_view fmt, Args &&... args)
格式化打印
void printcf(const color &color, const string_view fmt, Args &&... args)
格式化颜色打印
void eprint(Args &&... args)
打印多个值到错误流
void eprintf(const string_view fmt, Args &&... args)
格式化打印到错误流
void printc(const color &color, Args &&... args)
带颜色打印多个值
void printcln(const color &color, Args &&... args)
带颜色打印多个值并换行
void print(Args &&... args)
打印多个值
void eprintln(Args &&... args)
打印多个值到错误流并换行
sys_console & console
全局控制台实例
void printcfln(const color &color, const string_view fmt, Args &&... args)
格式化颜色打印并换行
void eprintfln(const string_view fmt, Args &&... args)
格式化打印到错误流并换行
void println(Args &&... args)
打印多个值并换行
void printfln(const string_view fmt, Args &&... args)
格式化打印并换行
void * native_handle_type
系统句柄类型
duration< int64_t, milli > milliseconds
毫秒持续时间
error_code last_error() noexcept
获取当前系统错误码
constexpr string format(const string_view fmt, Args &&... args)
格式化字符串
string concatenate(Args &&... args)
拼接参数
basic_string_view< char > string_view
字符字符串视图
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
constexpr string to_string(const CharT &c)
将字符转换为普通字符串
互斥锁
字符串构建器
const char * type() const noexcept override
获取异常类型
持续时间类模板
32位整数包装类
bool operator!=(const console_size &other) const noexcept
不等比较
bool operator==(const console_size &other) const noexcept
相等比较