From 8696ad8739ae35b9caf290c6905c713d5fd00378 Mon Sep 17 00:00:00 2001 From: fegomes Date: Wed, 24 Jan 2018 23:08:46 -0200 Subject: [PATCH 1/4] new function to convert level_enum from string --- include/spdlog/common.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/include/spdlog/common.h b/include/spdlog/common.h index ea0b0567..339e8b29 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -51,6 +51,9 @@ namespace spdlog class formatter; +template +constexpr size_t size(T(&)[N]) { return N; } + namespace sinks { class sink; @@ -98,6 +101,18 @@ inline const char* to_short_str(spdlog::level::level_enum l) { return short_level_names[l]; } +inline spdlog::level::level_enum to_level_enum(const char* name) +{ + for (size_t level = 0; level < size(level_names); level++) + { + if (!strcmp(level_names[level], name)) + { + return (spdlog::level::level_enum) level; + } + } + return (spdlog::level::level_enum) 0; +} + } //level From 48c8755d06bfa56e5771832078d23628da7db03e Mon Sep 17 00:00:00 2001 From: fegomes Date: Thu, 8 Mar 2018 19:08:24 -0300 Subject: [PATCH 2/4] include test to convert functions and change suggested by @gabime --- include/spdlog/common.h | 34 ++++++++++++++++++++++++---------- tests/test_misc.cpp | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/include/spdlog/common.h b/include/spdlog/common.h index cad705f9..2ef4d24c 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -15,7 +15,8 @@ #include #include #include -#include +#include +#include #if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) #include @@ -89,6 +90,17 @@ enum level_enum off = 6 }; +static std::unordered_map name_to_level = { + { "trace" , level::trace }, + { "debug" , level::debug }, + { "info" , level::info }, + { "warning" , level::warn }, + { "error" , level::err }, + { "critical", level::critical }, + { "off" , level::off } + }; + + #if !defined(SPDLOG_LEVEL_NAMES) #define SPDLOG_LEVEL_NAMES { "trace", "debug", "info", "warning", "error", "critical", "off" } #endif @@ -105,17 +117,19 @@ inline const char* to_short_str(spdlog::level::level_enum l) { return short_level_names[l]; } -inline spdlog::level::level_enum to_level_enum(const char* name) +inline spdlog::level::level_enum to_level_enum(const std::string& name) { - for (size_t level = 0; level < size(level_names); level++) - { - if (!strcmp(level_names[level], name)) - { - return (spdlog::level::level_enum) level; - } - } - return (spdlog::level::level_enum) 0; + auto ci = name_to_level.find(name); + if (ci != name_to_level.end()) + { + return ci->second; + } + else + { + return level::off; + } } + using level_hasher = std::hash; } //level diff --git a/tests/test_misc.cpp b/tests/test_misc.cpp index 9afaa932..9f97a9d8 100644 --- a/tests/test_misc.cpp +++ b/tests/test_misc.cpp @@ -42,6 +42,39 @@ TEST_CASE("log_levels", "[log_levels]") REQUIRE(log_info("Hello", spdlog::level::trace) == "Hello"); } +TEST_CASE("to_str", "[convert_to_str]") +{ + REQUIRE(std::string(spdlog::level::to_str(spdlog::level::trace)) == "trace"); + REQUIRE(std::string(spdlog::level::to_str(spdlog::level::debug)) == "debug"); + REQUIRE(std::string(spdlog::level::to_str(spdlog::level::info)) == "info"); + REQUIRE(std::string(spdlog::level::to_str(spdlog::level::warn)) == "warning"); + REQUIRE(std::string(spdlog::level::to_str(spdlog::level::err)) == "error"); + REQUIRE(std::string(spdlog::level::to_str(spdlog::level::critical)) == "critical"); + REQUIRE(std::string(spdlog::level::to_str(spdlog::level::off)) == "off"); +} + +TEST_CASE("to_short_str", "[convert_to_short_str]") +{ + REQUIRE(std::string(spdlog::level::to_short_str(spdlog::level::trace)) == "T"); + REQUIRE(std::string(spdlog::level::to_short_str(spdlog::level::debug)) == "D"); + REQUIRE(std::string(spdlog::level::to_short_str(spdlog::level::info)) == "I"); + REQUIRE(std::string(spdlog::level::to_short_str(spdlog::level::warn)) == "W"); + REQUIRE(std::string(spdlog::level::to_short_str(spdlog::level::err)) == "E"); + REQUIRE(std::string(spdlog::level::to_short_str(spdlog::level::critical)) == "C"); + REQUIRE(std::string(spdlog::level::to_short_str(spdlog::level::off)) == "O"); +} + +TEST_CASE("to_level_enum", "[convert_to_level_enum]") +{ + REQUIRE(spdlog::level::to_level_enum("trace") == spdlog::level::trace); + REQUIRE(spdlog::level::to_level_enum("debug") == spdlog::level::debug); + REQUIRE(spdlog::level::to_level_enum("info") == spdlog::level::info); + REQUIRE(spdlog::level::to_level_enum("warning") == spdlog::level::warn); + REQUIRE(spdlog::level::to_level_enum("error") == spdlog::level::err); + REQUIRE(spdlog::level::to_level_enum("critical") == spdlog::level::critical); + REQUIRE(spdlog::level::to_level_enum("off") == spdlog::level::off); + REQUIRE(spdlog::level::to_level_enum("null") == spdlog::level::off); +} From c21dd874d1bea2a7d692409144dd499f848ba4a6 Mon Sep 17 00:00:00 2001 From: fegomes Date: Thu, 8 Mar 2018 19:09:46 -0300 Subject: [PATCH 3/4] removed class to return size of array. --- include/spdlog/common.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/include/spdlog/common.h b/include/spdlog/common.h index 2ef4d24c..bad9c317 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -56,9 +56,6 @@ namespace spdlog class formatter; -template -constexpr size_t size(T(&)[N]) { return N; } - namespace sinks { class sink; From 46f97685994b96b91301dfe5a5e21a80062a23e2 Mon Sep 17 00:00:00 2001 From: fegomes Date: Fri, 9 Mar 2018 09:04:44 -0300 Subject: [PATCH 4/4] change of scope the name_to_level variable --- include/spdlog/common.h | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/include/spdlog/common.h b/include/spdlog/common.h index bad9c317..cb656386 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -87,16 +87,6 @@ enum level_enum off = 6 }; -static std::unordered_map name_to_level = { - { "trace" , level::trace }, - { "debug" , level::debug }, - { "info" , level::info }, - { "warning" , level::warn }, - { "error" , level::err }, - { "critical", level::critical }, - { "off" , level::off } - }; - #if !defined(SPDLOG_LEVEL_NAMES) #define SPDLOG_LEVEL_NAMES { "trace", "debug", "info", "warning", "error", "critical", "off" } @@ -116,6 +106,15 @@ inline const char* to_short_str(spdlog::level::level_enum l) } inline spdlog::level::level_enum to_level_enum(const std::string& name) { + static std::unordered_map name_to_level = { + { level_names[0], level::trace }, + { level_names[1], level::debug }, + { level_names[2], level::info }, + { level_names[3], level::warn }, + { level_names[4], level::err }, + { level_names[5], level::critical }, + { level_names[6], level::off } + }; auto ci = name_to_level.find(name); if (ci != name_to_level.end()) {