NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
console.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_SYSTEM_CONSOLE_HPP__
2#define NEFORCE_CORE_SYSTEM_CONSOLE_HPP__
3
8
12NEFORCE_BEGIN_NAMESPACE__
13
19
24struct console_exception final : device_exception {
25 explicit console_exception(const char* info = "Pipe Operation Failed.", const char* type = static_type,
26 const int code = 0) noexcept :
27 device_exception(info, type, code) {}
28
29 explicit console_exception(const exception& e) :
30 device_exception(e) {}
31
32 ~console_exception() override = default;
33 static constexpr auto static_type = "console_exception";
34};
35 // Exceptions
37
43
59class NEFORCE_API sys_console {
60public:
65 struct console_size {
66 int width;
67 int height;
68
69 explicit console_size(const int w = 0, const int h = 0) :
70 width(w),
71 height(h) {}
72
76 NEFORCE_NODISCARD bool operator==(const console_size& other) const noexcept {
77 return width == other.width && height == other.height;
78 }
79
83 NEFORCE_NODISCARD bool operator!=(const console_size& other) const noexcept { return !(*this == other); }
84 };
85
86private:
90
91#ifdef NEFORCE_PLATFORM_WINDOWS
92 console_size saved_cursor_pos_{0, 0};
93#endif
94
95 mutable mutex mutex_;
96 console_size last_size_{0, 0};
97
98 bool alt_buffer_active_ = false; // 交替缓冲区是否激活
99 bool mouse_enabled_ = false; // 鼠标输入是否开启
100 int pending_char_ = -1; // kbhit 预读的字符,-1 表示无待处理字符
101
102private:
103 void print_string_unsafe(const string& str) const { print_string_unsafe(str.view()); }
104 void print_string_unsafe(string_view str) const;
105 void print_string_unsafe(const char* str) const { print_string_unsafe(string_view{str}); }
106
107 void print_error_unsafe(const string& str) const { print_error_unsafe(str.view()); }
108 void print_error_unsafe(string_view str) const;
109 void print_error_unsafe(const char* str) const { print_error_unsafe(string_view{str}); }
110
111 void set_color_unsafe(const color& color, bool use_256_color) const;
112 void typewriter_print_unsafe(string_view text, milliseconds delay_per_char, bool with_sound) const;
113
114 string readln_unsafe() const;
115 string read_unsafe() const;
116 char read_char_unsafe() const;
117 console_size get_console_size_unsafe() const;
118
119 void flush_unsafe() const;
120 void ignore_unsafe() const;
121
122 void beep_unsafe() const;
123 void flash_screen_unsafe() const;
124
125 void fade_effect_unsafe(string_view text, const color& from, const color& to, milliseconds duration,
126 bool is_fade_in) const;
127
128private:
129 sys_console() noexcept;
130
131public:
132 sys_console(const sys_console&) = delete;
133 sys_console& operator=(const sys_console&) = delete;
134 sys_console(sys_console&&) = delete;
135 sys_console& operator=(sys_console&&) = delete;
136
137 ~sys_console() = default;
138
143 static sys_console& instance() noexcept {
144 static sys_console console;
145 return console;
146 }
147
151 void flush();
152
156 void ignore();
157
162 void print_string(const string& str);
163
168 void print_string(const string_view& view);
169
174 void print_string(const char* str);
175
180 void print_error(const string& str);
181
186 void print_error(const string_view& view);
187
192 void print_error(const char* str);
193
198 string read();
199
204 string readln();
205
210 char read_char();
211
217 template <typename... Args>
218 void print(Args&&... args) {
219 lock<mutex> lock(mutex_);
220 this->print_string_unsafe(_NEFORCE to_string(_NEFORCE forward<Args>(args)...));
221 }
222
229 template <typename... Args>
230 void printf(const string_view fmt, Args&&... args) {
231 lock<mutex> lock(mutex_);
232 this->print_string_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
233 }
234
241 template <typename... Args>
242 void printc(const color& color, Args&&... args) {
243 lock<mutex> lock(mutex_);
244 this->set_color_unsafe(color, false);
245 this->print_string_unsafe(_NEFORCE to_string(_NEFORCE forward<Args>(args)...));
246 this->print_string_unsafe("\033[0m");
247 }
248
256 template <typename... Args>
257 void printcf(const color& color, const string_view fmt, Args&&... args) {
258 lock<mutex> lock(mutex_);
259 this->set_color_unsafe(color, false);
260 this->print_string_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
261 this->print_string_unsafe("\033[0m");
262 }
263
266 void println();
267
273 template <typename... Args, enable_if_t<(sizeof...(Args) > 0), int> = 0>
274 void println(Args&&... args) {
275 lock<mutex> lock(mutex_);
276 this->print_string_unsafe(_NEFORCE to_string(_NEFORCE forward<Args>(args)...));
277 this->print_string_unsafe("\n");
278 }
279
286 template <typename... Args>
287 void printfln(const string_view fmt, Args&&... args) {
288 lock<mutex> lock(mutex_);
289 this->print_string_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
290 this->print_string_unsafe("\n");
291 }
292
299 template <typename... Args>
300 void printcln(const color& color, Args&&... args) {
301 lock<mutex> lock(mutex_);
302 this->set_color_unsafe(color, false);
303 this->print_string_unsafe(_NEFORCE to_string(_NEFORCE forward<Args>(args)...));
304 this->print_string_unsafe("\033[0m\n");
305 }
306
314 template <typename... Args>
315 void printcfln(const color& color, const string_view fmt, Args&&... args) {
316 lock<mutex> lock(mutex_);
317 this->set_color_unsafe(color, false);
318 this->print_string_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
319 this->print_string_unsafe("\033[0m\n");
320 }
321
327 template <typename... Args>
328 void eprint(Args&&... args) {
329 lock<mutex> lock(mutex_);
330 this->print_error_unsafe(_NEFORCE to_string(_NEFORCE forward<Args>(args)...));
331 }
332
339 template <typename... Args>
340 void eprintf(const string_view fmt, Args&&... args) {
341 lock<mutex> lock(mutex_);
342 this->print_error_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
343 }
344
348 void eprintln();
349
355 template <typename... Args, enable_if_t<(sizeof...(Args) > 0), int> = 0>
356 void eprintln(Args&&... args) {
357 lock<mutex> lock(mutex_);
358 this->print_error_unsafe(_NEFORCE to_string(_NEFORCE forward<Args>(args)...));
359 this->print_error_unsafe("\n");
360 }
361
368 template <typename... Args>
369 void eprintfln(const string_view fmt, Args&&... args) {
370 lock<mutex> lock(mutex_);
371 this->print_error_unsafe(_NEFORCE format(fmt, _NEFORCE forward<Args>(args)...));
372 this->print_error_unsafe("\n");
373 }
374
378 void clear();
379
384 void pause(string_view msg = "Press any char to continue...");
385
393 bool confirmation(string_view prompt = "Are you sure? (y/n): ", char yes = 'y', char no = 'n');
394
403 string password(string_view prompt = "Password: ", char mask = '*', bool show_length = false);
404
410
416 void set_color(const color& color, bool use_256_color = true);
417
423 void set_background_color(const color& color, bool use_256_color = true);
424
429
434 void set_bold(bool enable = true);
435
440 void set_underline(bool enable = true);
441
446 void set_blink(bool enable = true);
447
452 void set_reverse(bool enable = true);
453
458
464
469 void enable_alternate_screen_buffer(bool enable = true);
470
475
481 void set_scroll_region(int top, int bottom);
482
487
493 void enable_mouse(bool enable = true);
494
499
504 NEFORCE_NODISCARD bool is_mouse_enabled() const;
505
510 NEFORCE_NODISCARD bool kbhit();
511
516 int getch();
517
526 void progress_bar(double percentage, int width = 50, bool show_percentage = true, char fill_char = '#',
527 char empty_char = ' ');
528
534 void set_cursor_position(int row, int column);
535
540
545
550
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
604 void typewriter_print(string_view text, milliseconds delay_per_char = milliseconds(50), bool with_sound = false);
605
612 void typewriter_println(string_view text, milliseconds delay_per_char = milliseconds(50), bool with_sound = false);
613
617 void beep();
618
623
630 void notification(string_view message, milliseconds duration = milliseconds(2000), bool play_sound = true);
631
640 const color& start_color = color::black(), const color& end_color = color::white());
641
650 const color& start_color = color::white(), const color& end_color = color::black());
651
659 void fade_in_out(string_view text, milliseconds in_duration = milliseconds(500),
660 milliseconds hold_duration = milliseconds(1000), milliseconds out_duration = milliseconds(500));
661};
662
666NEFORCE_API extern sys_console& console;
667
668
672template <typename... Args>
673void print(Args&&... args) {
674 console.print(_NEFORCE forward<Args>(args)...);
675}
676
680template <typename... Args>
681void printc(const color& color, Args&&... args) {
682 console.printc(color, _NEFORCE forward<Args>(args)...);
683}
684
688template <typename... Args>
689void println(Args&&... args) {
690 console.println(_NEFORCE forward<Args>(args)...);
691}
692
696template <typename... Args>
697void printcln(const color& color, Args&&... args) {
698 console.printcln(color, _NEFORCE forward<Args>(args)...);
699}
700
704template <typename... Args>
705void printf(const string_view fmt, Args&&... args) {
706 console.printf(fmt, _NEFORCE forward<Args>(args)...);
707}
708
712template <typename... Args>
713void printfln(const string_view fmt, Args&&... args) {
714 console.printfln(fmt, _NEFORCE forward<Args>(args)...);
715}
716
720template <typename... Args>
721void printcf(const color& color, const string_view fmt, Args&&... args) {
722 console.printcf(color, fmt, _NEFORCE forward<Args>(args)...);
723}
724
728template <typename... Args>
729void printcfln(const color& color, const string_view fmt, Args&&... args) {
730 console.printcfln(color, fmt, _NEFORCE forward<Args>(args)...);
731}
732
736template <typename... Args>
737void eprint(Args&&... args) {
738 console.eprint(_NEFORCE forward<Args>(args)...);
739}
740
744template <typename... Args>
745void eprintf(const string_view fmt, Args&&... args) {
746 console.eprintf(fmt, _NEFORCE forward<Args>(args)...);
747}
748
752template <typename... Args>
753void eprintln(Args&&... args) {
754 console.eprintln(_NEFORCE forward<Args>(args)...);
755}
756
760template <typename... Args>
761void eprintfln(const string_view fmt, Args&&... args) {
762 console.eprintfln(fmt, _NEFORCE forward<Args>(args)...);
763}
764 // ConsoleIO
766
767NEFORCE_END_NAMESPACE__
768#endif // NEFORCE_CORE_SYSTEM_CONSOLE_HPP__
constexpr view_type view() const noexcept
获取字符串视图
RGB颜色类
static constexpr color black() noexcept
黑色
static constexpr color white() noexcept
白色
锁管理器模板
系统控制台单例类
void set_color(const color &color, bool use_256_color=true)
设置颜色
void set_window_title(string_view title)
设置控制台窗口标题
void printfln(const string_view fmt, Args &&... args)
格式化打印并换行
void printf(const string_view fmt, Args &&... args)
格式化打印
void show_cursor()
显示光标
string read()
读取输入(直到空白字符)
void progress_bar(double percentage, int width=50, bool show_percentage=true, char fill_char='#', char empty_char=' ')
显示进度条
void beep()
发出蜂鸣声
void reset_scroll_region()
重置滚动区域为整个屏幕
void set_color(const integer32 &color)
设置颜色(使用ANSI代码)
void fade_in(string_view text, milliseconds duration=milliseconds(1000), const color &start_color=color::black(), const color &end_color=color::white())
淡入效果
void fade_out(string_view text, milliseconds duration=milliseconds(1000), const color &start_color=color::white(), const color &end_color=color::black())
淡出效果
void eprintfln(const string_view fmt, Args &&... args)
格式化打印到错误流并换行
void ignore()
抛弃输入缓冲区中的一行
void printcfln(const color &color, const string_view fmt, Args &&... args)
带颜色的格式化打印并换行
bool supports_truecolor() const
检查是否支持真彩色
bool is_mouse_enabled() const
检测当前是否已启用鼠标输入
void printc(const color &color, Args &&... args)
带颜色的打印
string password(string_view prompt="Password: ", char mask=' *', bool show_length=false)
密码输入
void enable_mouse(bool enable=true)
启用或禁用鼠标输入捕获
void print_string(const char *str)
打印C风格字符串
void typewriter_print(string_view text, milliseconds delay_per_char=milliseconds(50), bool with_sound=false)
打字机效果打印
void disable_alternate_screen_buffer()
禁用交替屏幕缓冲区
void notification(string_view message, milliseconds duration=milliseconds(2000), bool play_sound=true)
显示通知
void enable_alternate_screen_buffer(bool enable=true)
启用或禁用交替屏幕缓冲区
void set_cursor_position(int row, int column)
设置光标位置
void print(Args &&... args)
打印任意类型的值
bool confirmation(string_view prompt="Are you sure? (y/n): ", char yes='y', char no='n')
用户确认对话框
void save_cursor_position()
保存光标位置
void set_reverse(bool enable=true)
设置反色(交换前景色与背景色)
void set_bold(bool enable=true)
设置粗体
void print_error(const char *str)
打印C风格字符串到错误流
void flash_screen()
屏幕闪烁
string readln()
读取一行输入
void eprintf(const string_view fmt, Args &&... args)
格式化打印到错误流
static sys_console & instance() noexcept
获取单例实例
void reset_text_attributes()
重置所有文本属性
void set_blink(bool enable=true)
设置闪烁
void reset_color()
重置颜色
string console_type() const
获取终端类型
void println()
打印换行
void clear()
清空屏幕
void hide_cursor()
隐藏光标
void pause(string_view msg="Press any char to continue...")
暂停并等待用户按键
void set_background_color(const color &color, bool use_256_color=true)
设置背景色
char read_char()
读取单个字符
void fade_in_out(string_view text, milliseconds in_duration=milliseconds(500), milliseconds hold_duration=milliseconds(1000), milliseconds out_duration=milliseconds(500))
淡入-保持-淡出效果
void set_underline(bool enable=true)
设置下划线
bool supports_unicode() const
检查是否支持Unicode
void typewriter_println(string_view text, milliseconds delay_per_char=milliseconds(50), bool with_sound=false)
打字机效果打印并换行
void print_string(const string &str)
打印字符串
bool is_terminal_resized()
检查终端是否已调整大小
void flush()
刷新输出缓冲区
void set_scroll_region(int top, int bottom)
设置滚动区域
void eprintln(Args &&... args)
打印任意类型的值到错误流并换行
void disable_mouse()
禁用鼠标输入捕获
void eprintln()
打印换行到错误流
void eprint(Args &&... args)
打印任意类型的值到错误流
void restore_cursor_position()
恢复光标位置
int getch()
读取一个字符(无回显,若无按键则阻塞)
console_size get_console_size() const
获取控制台尺寸
bool supports_colors() const
检查是否支持颜色
bool kbhit()
检查是否有键盘输入可读(非阻塞)
bool is_interactive() const
检查是否是交互式终端
void print_string(const string_view &view)
打印字符串视图
void print_error(const string_view &view)
打印字符串视图到错误流
void print_error(const string &str)
打印字符串到错误流
void printcln(const color &color, Args &&... args)
带颜色的打印并换行
void printcf(const color &color, const string_view fmt, Args &&... args)
带颜色的格式化打印
void println(Args &&... args)
打印任意类型的值并换行
颜色类
持续时间类型
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
void printcf(const color &color, const string_view fmt, Args &&... args)
格式化颜色打印
void printfln(const string_view fmt, Args &&... args)
格式化打印并换行
void eprintfln(const string_view fmt, Args &&... args)
格式化打印到错误流并换行
void printc(const color &color, Args &&... args)
带颜色打印多个值
void eprint(Args &&... args)
打印多个值到错误流
void eprintln(Args &&... args)
打印多个值到错误流并换行
void print(Args &&... args)
打印多个值
void printf(const string_view fmt, Args &&... args)
格式化打印
void printcfln(const color &color, const string_view fmt, Args &&... args)
格式化颜色打印并换行
sys_console & console
全局控制台实例
void eprintf(const string_view fmt, Args &&... args)
格式化打印到错误流
void println(Args &&... args)
打印多个值并换行
void printcln(const color &color, Args &&... args)
带颜色打印多个值并换行
void * native_handle_type
系统句柄类型
duration< int64_t, milli > milliseconds
毫秒持续时间
constexpr string format(const string_view fmt, 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)
将字符转换为普通字符串
互斥锁
持续时间类模板
exception(const char *info=static_type, const char *type=static_type, const int code=0)
构造函数
const char * type() const noexcept
获取异常类型
int code() const noexcept
获取异常码
32位整数包装类
控制台尺寸结构
int height
高度(行数)
bool operator!=(const console_size &other) const noexcept
不等比较
bool operator==(const console_size &other) const noexcept
相等比较
int width
宽度(列数)