From 6fe7ffbf35d8b27cdb2591dda992858b4ee1e9b5 Mon Sep 17 00:00:00 2001 From: neargye Date: Tue, 30 May 2023 14:37:45 +0400 Subject: [PATCH] fix enum name in namespace --- include/magic_enum.hpp | 9 ++++-- test/test.cpp | 65 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/include/magic_enum.hpp b/include/magic_enum.hpp index bbd09b9..cda2c89 100644 --- a/include/magic_enum.hpp +++ b/include/magic_enum.hpp @@ -501,13 +501,16 @@ constexpr auto n() noexcept { name.size_ -= (prefix + 2); name.str_ += (prefix + 2); } + std::size_t p = 0; for (std::size_t i = 0; i < name.size_; ++i) { if (name.str_[i] == ':') { - name.size_ -= (i + 2); - name.str_ += (i + 2); - break; + p = i + 1; } } + if (p > 0) { + name.size_ -= p; + name.str_ += p; + } return name; } else { return str_view{}; // Unsupported compiler or Invalid customize. diff --git a/test/test.cpp b/test/test.cpp index e355bad..d74c44c 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -462,6 +462,38 @@ class foo2 { enum lt6 { s6, loooooooooooooooooooong6 }; }; +namespace boo1 { +enum lt1 { s1, loooooooooooooooooooong1 }; +enum lt2 : unsigned { s2, loooooooooooooooooooong2 }; +enum class lt3 { s3, loooooooooooooooooooong3 }; +enum class lt4 : unsigned { s4, loooooooooooooooooooong4 }; +class foo1 { + public: + enum class lt5 { s5, loooooooooooooooooooong5 }; +}; +class foo2 { + public: + enum lt6 { s6, loooooooooooooooooooong6 }; +}; +} // namespace boo1 + +namespace boo2 { +namespace boo3 { +enum lt1 { s1, loooooooooooooooooooong1 }; +enum lt2 : unsigned { s2, loooooooooooooooooooong2 }; +enum class lt3 { s3, loooooooooooooooooooong3 }; +enum class lt4 : unsigned { s4, loooooooooooooooooooong4 }; +class foo1 { + public: + enum class lt5 { s5, loooooooooooooooooooong5 }; +}; +class foo2 { + public: + enum lt6 { s6, loooooooooooooooooooong6 }; +}; +} // namespace boo2::boo3 +} // namespace boo2 + TEST_CASE("enum_name") { SECTION("automatic storage") { constexpr Color cr = Color::RED; @@ -501,7 +533,6 @@ TEST_CASE("enum_name") { REQUIRE(enum_name(MaxUsedAsInvalid::ONE) == "ONE"); - REQUIRE(enum_name(lt1::s1) == "s1"); REQUIRE(enum_name(lt1::loooooooooooooooooooong1) == "loooooooooooooooooooong1"); REQUIRE(enum_name(lt2::s2) == "s2"); @@ -517,6 +548,38 @@ TEST_CASE("enum_name") { REQUIRE_FALSE(enum_name((foo1::lt5)12).size()); REQUIRE_FALSE(enum_name((foo2::lt6)12).size()); + + REQUIRE(enum_name(boo1::lt1::s1) == "s1"); + REQUIRE(enum_name(boo1::lt1::loooooooooooooooooooong1) == "loooooooooooooooooooong1"); + REQUIRE(enum_name(boo1::lt2::s2) == "s2"); + REQUIRE(enum_name(boo1::lt2::loooooooooooooooooooong2) == "loooooooooooooooooooong2"); + REQUIRE(enum_name(boo1::lt3::s3) == "s3"); + REQUIRE(enum_name(boo1::lt3::loooooooooooooooooooong3) == "loooooooooooooooooooong3"); + REQUIRE(enum_name(boo1::lt4::s4) == "s4"); + REQUIRE(enum_name(boo1::lt4::loooooooooooooooooooong4) == "loooooooooooooooooooong4"); + REQUIRE(enum_name(boo1::foo1::lt5::s5) == "s5"); + REQUIRE(enum_name(boo1::foo1::lt5::loooooooooooooooooooong5) == "loooooooooooooooooooong5"); + REQUIRE(enum_name(boo1::foo2::s6) == "s6"); + REQUIRE(enum_name(boo1::foo2::loooooooooooooooooooong6) == "loooooooooooooooooooong6"); + + REQUIRE_FALSE(enum_name((boo1::foo1::lt5)12).size()); + REQUIRE_FALSE(enum_name((boo1::foo2::lt6)12).size()); + + REQUIRE(enum_name(boo2::boo3::lt1::s1) == "s1"); + REQUIRE(enum_name(boo2::boo3::lt1::loooooooooooooooooooong1) == "loooooooooooooooooooong1"); + REQUIRE(enum_name(boo2::boo3::lt2::s2) == "s2"); + REQUIRE(enum_name(boo2::boo3::lt2::loooooooooooooooooooong2) == "loooooooooooooooooooong2"); + REQUIRE(enum_name(boo2::boo3::lt3::s3) == "s3"); + REQUIRE(enum_name(boo2::boo3::lt3::loooooooooooooooooooong3) == "loooooooooooooooooooong3"); + REQUIRE(enum_name(boo2::boo3::lt4::s4) == "s4"); + REQUIRE(enum_name(boo2::boo3::lt4::loooooooooooooooooooong4) == "loooooooooooooooooooong4"); + REQUIRE(enum_name(boo2::boo3::foo1::lt5::s5) == "s5"); + REQUIRE(enum_name(boo2::boo3::foo1::lt5::loooooooooooooooooooong5) == "loooooooooooooooooooong5"); + REQUIRE(enum_name(boo2::boo3::foo2::s6) == "s6"); + REQUIRE(enum_name(boo2::boo3::foo2::loooooooooooooooooooong6) == "loooooooooooooooooooong6"); + + REQUIRE_FALSE(enum_name((boo2::boo3::foo1::lt5)12).size()); + REQUIRE_FALSE(enum_name((boo2::boo3::foo2::lt6)12).size()); } SECTION("static storage") {