diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h index f6e32d3d..2e5675b7 100644 --- a/include/spdlog/logger.h +++ b/include/spdlog/logger.h @@ -19,6 +19,9 @@ #include #ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT +# ifndef _WIN32 +# error SPDLOG_WCHAR_TO_UTF8_SUPPORT only supported on windows +# endif # include #endif @@ -139,56 +142,6 @@ public: log(loc, lvl, "{}", msg); } -#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT -# ifndef _WIN32 -# error SPDLOG_WCHAR_TO_UTF8_SUPPORT only supported on windows -# else - - template - void log(source_loc loc, level::level_enum lvl, wstring_view_t fmt, Args &&...args) - { - bool log_enabled = should_log(lvl); - bool traceback_enabled = tracer_.enabled(); - if (!log_enabled && !traceback_enabled) - { - return; - } - SPDLOG_TRY - { - // format to wmemory_buffer and convert to utf8 - fmt::wmemory_buffer wbuf; - fmt::format_to(std::back_inserter(wbuf), fmt, std::forward(args)...); - memory_buf_t buf; - details::os::wstr_to_utf8buf(wstring_view_t(wbuf.data(), wbuf.size()), buf); - details::log_msg log_msg(loc, name_, lvl, string_view_t(buf.data(), buf.size())); - log_it_(log_msg, log_enabled, traceback_enabled); - } - SPDLOG_LOGGER_CATCH() - } - - // T can be statically converted to wstring_view - template::value, int>::type = 0> - void log(source_loc loc, level::level_enum lvl, const T &msg) - { - bool log_enabled = should_log(lvl); - bool traceback_enabled = tracer_.enabled(); - if (!log_enabled && !traceback_enabled) - { - return; - } - - SPDLOG_TRY - { - memory_buf_t buf; - details::os::wstr_to_utf8buf(msg, buf); - details::log_msg log_msg(loc, name_, lvl, string_view_t(buf.data(), buf.size())); - log_it_(log_msg, log_enabled, traceback_enabled); - } - SPDLOG_LOGGER_CATCH() - } -# endif // _WIN32 -#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT - template void trace(const FormatString &fmt, Args &&...args) { @@ -316,7 +269,9 @@ protected: details::backtracer tracer_; // common implementation for after templated public api has been resolved - template + + template, + typename std::enable_if::value, Char>::type * = nullptr> void log_(source_loc loc, level::level_enum lvl, const FormatString &fmt, Args &&...args) { bool log_enabled = should_log(lvl); @@ -328,14 +283,58 @@ protected: SPDLOG_TRY { memory_buf_t buf; - // little bit faster than fmt::format_to(std::back_inserter(buf), fmt, std::forward(args)...); - fmt::detail::vformat_to(buf, fmt::string_view(fmt), fmt::make_format_args(args...), {}); + fmt::detail::vformat_to(buf, fmt::to_string_view(fmt), fmt::make_format_args(args...)); details::log_msg log_msg(loc, name_, lvl, string_view_t(buf.data(), buf.size())); log_it_(log_msg, log_enabled, traceback_enabled); } SPDLOG_LOGGER_CATCH() } +#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT + template + void log_(source_loc loc, level::level_enum lvl, const wstring_view_t &fmt, Args &&...args) + { + bool log_enabled = should_log(lvl); + bool traceback_enabled = tracer_.enabled(); + if (!log_enabled && !traceback_enabled) + { + return; + } + SPDLOG_TRY + { + // format to wmemory_buffer and convert to utf8 + fmt::wmemory_buffer wbuf; + fmt::format_to(std::back_inserter(wbuf), fmt, std::forward(args)...); + memory_buf_t buf; + details::os::wstr_to_utf8buf(wstring_view_t(wbuf.data(), wbuf.size()), buf); + details::log_msg log_msg(loc, name_, lvl, string_view_t(buf.data(), buf.size())); + log_it_(log_msg, log_enabled, traceback_enabled); + } + SPDLOG_LOGGER_CATCH() + } + + // T can be statically converted to wstring_view, and no formatting needed. + template::value, int>::type = 0> + void log_(source_loc loc, level::level_enum lvl, const T &msg) + { + bool log_enabled = should_log(lvl); + bool traceback_enabled = tracer_.enabled(); + if (!log_enabled && !traceback_enabled) + { + return; + } + SPDLOG_TRY + { + memory_buf_t buf; + details::os::wstr_to_utf8buf(msg, buf); + details::log_msg log_msg(loc, name_, lvl, string_view_t(buf.data(), buf.size())); + log_it_(log_msg, log_enabled, traceback_enabled); + } + SPDLOG_LOGGER_CATCH() + } + +#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT + // log the given message (if the given log level is high enough), // and save backtrace (if backtrace is enabled). void log_it_(const details::log_msg &log_msg, bool log_enabled, bool traceback_enabled);