From 0ce670e45aa2791d299ee1eaa6ca19ef0a2006b3 Mon Sep 17 00:00:00 2001 From: gabime Date: Sun, 25 Nov 2018 00:36:14 +0200 Subject: [PATCH] Store level names as string_views --- include/spdlog/common.h | 27 +++++++++++----------- include/spdlog/details/pattern_formatter.h | 4 ++-- tests/test_misc.cpp | 16 ++++++------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/include/spdlog/common.h b/include/spdlog/common.h index 63e3df4e..49ebf1c0 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -107,13 +107,13 @@ enum level_enum "trace", "debug", "info", "warning", "error", "critical", "off" \ } #endif -static const char *level_names[] SPDLOG_LEVEL_NAMES; +static string_view_t level_string_views[] SPDLOG_LEVEL_NAMES; static const char *short_level_names[]{"T", "D", "I", "W", "E", "C", "O"}; -inline const char *to_c_str(spdlog::level::level_enum l) SPDLOG_NOEXCEPT +inline string_view_t& to_string_view(spdlog::level::level_enum l) SPDLOG_NOEXCEPT { - return level_names[l]; + return level_string_views[l]; } inline const char *to_short_c_str(spdlog::level::level_enum l) SPDLOG_NOEXCEPT @@ -123,17 +123,16 @@ inline const char *to_short_c_str(spdlog::level::level_enum l) SPDLOG_NOEXCEPT inline spdlog::level::level_enum from_str(const std::string &name) SPDLOG_NOEXCEPT { - static std::unordered_map name_to_level = // map string->level - {{level_names[0], level::trace}, // trace - {level_names[1], level::debug}, // debug - {level_names[2], level::info}, // info - {level_names[3], level::warn}, // warn - {level_names[4], level::err}, // err - {level_names[5], level::critical}, // critical - {level_names[6], level::off}}; // off - - auto lvl_it = name_to_level.find(name); - return lvl_it != name_to_level.end() ? lvl_it->second : level::off; + int level = 0; + for(const auto &level_str : level_string_views) + { + if(level_str == name) + { + return static_cast(level); + } + level++; + } + return level::off; } using level_hasher = std::hash; diff --git a/include/spdlog/details/pattern_formatter.h b/include/spdlog/details/pattern_formatter.h index e89a5416..d31d5d1c 100644 --- a/include/spdlog/details/pattern_formatter.h +++ b/include/spdlog/details/pattern_formatter.h @@ -159,7 +159,7 @@ public: void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { - string_view_t level_name{level::to_c_str(msg.level)}; + string_view_t &level_name = level::to_string_view(msg.level); if (padinfo_.enabled()) { scoped_pad p(level_name, padinfo_, dest); @@ -969,7 +969,7 @@ public: // wrap the level name with color msg.color_range_start = dest.size(); // fmt_helper::append_string_view(level::to_c_str(msg.level), dest); - fmt_helper::append_string_view(level::to_c_str(msg.level), dest); + fmt_helper::append_string_view(level::to_string_view(msg.level), dest); msg.color_range_end = dest.size(); dest.push_back(']'); dest.push_back(' '); diff --git a/tests/test_misc.cpp b/tests/test_misc.cpp index f46410b5..9e097a45 100644 --- a/tests/test_misc.cpp +++ b/tests/test_misc.cpp @@ -43,15 +43,15 @@ TEST_CASE("log_levels", "[log_levels]") REQUIRE(log_info("Hello", spdlog::level::trace) == "Hello"); } -TEST_CASE("to_c_str", "[convert_to_c_str]") +TEST_CASE("level_to_string_view", "[convert_to_string_view") { - REQUIRE(std::string(spdlog::level::to_c_str(spdlog::level::trace)) == "trace"); - REQUIRE(std::string(spdlog::level::to_c_str(spdlog::level::debug)) == "debug"); - REQUIRE(std::string(spdlog::level::to_c_str(spdlog::level::info)) == "info"); - REQUIRE(std::string(spdlog::level::to_c_str(spdlog::level::warn)) == "warning"); - REQUIRE(std::string(spdlog::level::to_c_str(spdlog::level::err)) == "error"); - REQUIRE(std::string(spdlog::level::to_c_str(spdlog::level::critical)) == "critical"); - REQUIRE(std::string(spdlog::level::to_c_str(spdlog::level::off)) == "off"); + REQUIRE(spdlog::level::to_string_view(spdlog::level::trace) == "trace"); + REQUIRE(spdlog::level::to_string_view(spdlog::level::debug) == "debug"); + REQUIRE(spdlog::level::to_string_view(spdlog::level::info) == "info"); + REQUIRE(spdlog::level::to_string_view(spdlog::level::warn) == "warning"); + REQUIRE(spdlog::level::to_string_view(spdlog::level::err) == "error"); + REQUIRE(spdlog::level::to_string_view(spdlog::level::critical) == "critical"); + REQUIRE(spdlog::level::to_string_view(spdlog::level::off) == "off"); } TEST_CASE("to_short_c_str", "[convert_to_short_c_str]")