diff --git a/docs/utils/fmt.md b/docs/utils/fmt.md new file mode 100644 index 0000000000000000000000000000000000000000..28a488c4bb613c40077a2008117141868caf91f5 --- /dev/null +++ b/docs/utils/fmt.md @@ -0,0 +1,63 @@ +# æ ¼å¼åŒ–输出 + +## Writer 虚类 + +```cpp +class Writer +{ +public: + virtual void write(Slice<const char> s) = 0; + void write(char c) { + write(Slice<const char>(&c, 1)); + } +}; +``` + +我们定义了一个虚类 `Writer` , åªè¦å®žçŽ°äº†ç›¸åº”çš„æŽ¥å£ `write` å°±èƒ½ä½¿ç”¨æ ¼å¼åŒ–输出的功能,利用 C++ 的模æ¿ï¼Œç±»ä¼¼äºŽ `printf, sprintf, fprintf` 的功能å‡å¯å®žçŽ°ã€‚ç›®å‰é»˜è®¤çš„输出使用的是 `Sbi::putchar` 未æ¥å¯èƒ½æ›¿æ¢ä¸º `Uart::putchar` . + +## fmt::print + +```cpp +template <typename T, typename ...Ts> +void print(Writer *writer, Slice<const char> fmt, const T &arg, const Ts &...args) +``` + +`print` 函数接å—一个 `Writer` , ä¸€ä¸ªæ ¼å¼åŒ–å—符串 `fmt` , 以åŠç›¸åº”傿•°ã€‚å½“åœ¨æ ¼å¼åŒ–å—符串ä¸é‡åˆ° `{` 时,若还有一个 `{` ç´§è·Ÿç€ï¼Œåˆ™è¾“出一个 `{` ,å¦åˆ™æ‰«æåˆ° `}` 为æ¢ï¼Œæ ¹æ®å‚æ•°çš„ç±»åž‹è°ƒç”¨ç›¸åº”çš„æ ¼å¼åŒ–函数。 + +对æ¯ç§éœ€è¦æ ¼å¼åŒ–的类型应当实例化 `fmt::format` å¹¶å®žçŽ°é™æ€æˆå‘˜å‡½æ•° + +```cpp +static void parse(const T &value, Slice<const char> fmt, format_options options, Writer *writer); +``` + +æ¤å¤„çš„ `fmt` 是 `{}` 之间的内容,`format_options` ç›®å‰ä¸ºç©ºç»“构,未æ¥å¯èƒ½ç”¨äºŽç±»åž‹æ— å…³çš„æ ¼å¼åŒ–å—符串解æžï¼ˆä¾‹å¦‚对é½ï¼‰ã€‚ + +## fmt::log + +```cpp +enum class LogLevel { + Verbose, + Debug, + Info, + Warn, + Err, + Never, +}; + + +template <typename ...Ts> +static inline void log(LogLevel level, Writer *writer, Slice<const char> fmt, const Ts &...args) +{ + if (level >= log_level) { + if (level <= LogLevel::Debug) writer->write("\033[1;30m"); + if (level == LogLevel::Warn) writer->write("\033[1;35m"); + if (level == LogLevel::Err) writer->write("\033[1;31m"); + print(writer, fmt, args...); + if (level != LogLevel::Info) writer->write("\033[0m"); + } +} +``` + +`log` 函数在 `print` å‡½æ•°çš„åŸºç¡€ä¸Šå¢žåŠ äº†æ ¹æ® `LogLevel` 决定是å¦è¾“出,并自动设置颜色以便快速找到更为é‡è¦çš„ä¿¡æ¯ã€‚ + +