mirror of
https://github.com/Neargye/magic_enum.git
synced 2026-01-10 23:44:29 +00:00
fix enum name in class
This commit is contained in:
parent
930bcf0ba2
commit
abf48fc20e
2 changed files with 26 additions and 17 deletions
|
|
@ -470,17 +470,12 @@ constexpr auto n() noexcept {
|
||||||
if constexpr (supported<decltype(V)>::value) {
|
if constexpr (supported<decltype(V)>::value) {
|
||||||
#if defined(MAGIC_ENUM_GET_ENUM_NAME_BUILTIN)
|
#if defined(MAGIC_ENUM_GET_ENUM_NAME_BUILTIN)
|
||||||
constexpr auto name_ptr = MAGIC_ENUM_GET_ENUM_NAME_BUILTIN(V);
|
constexpr auto name_ptr = MAGIC_ENUM_GET_ENUM_NAME_BUILTIN(V);
|
||||||
constexpr auto name = name_ptr ? str_view{name_ptr, std::char_traits<char>::length(name_ptr)} : str_view{};
|
auto name = name_ptr ? str_view{name_ptr, std::char_traits<char>::length(name_ptr)} : str_view{};
|
||||||
#elif defined(__clang__)
|
#elif defined(__clang__)
|
||||||
auto name = str_view{__PRETTY_FUNCTION__ + 34, sizeof(__PRETTY_FUNCTION__) - 36};
|
auto name = str_view{__PRETTY_FUNCTION__ + 34, sizeof(__PRETTY_FUNCTION__) - 36};
|
||||||
if (name.str_[0] == '(' || name.str_[0] == '-' || (name.str_[0] >= '0' && name.str_[0] <= '9')) {
|
if (name.str_[0] == '(' || name.str_[0] == '-' || (name.str_[0] >= '0' && name.str_[0] <= '9')) {
|
||||||
name = str_view{};;
|
name = str_view{};;
|
||||||
}
|
}
|
||||||
constexpr auto prefix = n<decltype(V)>().size();
|
|
||||||
if (name.size_ > prefix && name.str_[prefix] == ':') {
|
|
||||||
name.size_ -= (prefix + 2);
|
|
||||||
name.str_ += (prefix + 2);
|
|
||||||
}
|
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
auto name = str_view{__PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1};
|
auto name = str_view{__PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1};
|
||||||
if (name.str_[name.size_ - 1] == ']') {
|
if (name.str_[name.size_ - 1] == ']') {
|
||||||
|
|
@ -493,24 +488,26 @@ constexpr auto n() noexcept {
|
||||||
if (name.str_[0] == '(') {
|
if (name.str_[0] == '(') {
|
||||||
name = str_view{};
|
name = str_view{};
|
||||||
}
|
}
|
||||||
constexpr auto prefix = n<decltype(V)>().size();
|
|
||||||
if (name.size_ > prefix && name.str_[prefix] == ':') {
|
|
||||||
name.size_ -= (prefix + 2);
|
|
||||||
name.str_ += (prefix + 2);
|
|
||||||
}
|
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
str_view name;
|
str_view name;
|
||||||
if ((__FUNCSIG__[5] == '_' && __FUNCSIG__[35] != '(') || (__FUNCSIG__[5] == 'c' && __FUNCSIG__[41] != '(')) {
|
if ((__FUNCSIG__[5] == '_' && __FUNCSIG__[35] != '(') || (__FUNCSIG__[5] == 'c' && __FUNCSIG__[41] != '(')) {
|
||||||
name = str_view{__FUNCSIG__ + 35, sizeof(__FUNCSIG__) - 52};
|
name = str_view{__FUNCSIG__ + 35, sizeof(__FUNCSIG__) - 52};
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
auto name = str_view{};
|
||||||
|
#endif
|
||||||
constexpr auto prefix = n<decltype(V)>().size();
|
constexpr auto prefix = n<decltype(V)>().size();
|
||||||
if (name.size_ > prefix && name.str_[prefix] == ':') {
|
if (name.size_ > prefix && name.str_[prefix] == ':') {
|
||||||
name.size_ -= (prefix + 2);
|
name.size_ -= (prefix + 2);
|
||||||
name.str_ += (prefix + 2);
|
name.str_ += (prefix + 2);
|
||||||
}
|
}
|
||||||
|
for (std::size_t i = 0; i < name.size_; ++i) {
|
||||||
|
if (name.str_[i] == ':') {
|
||||||
|
name.size_ -= (i + 2);
|
||||||
|
name.str_ += (i + 2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
auto name = str_view{};
|
|
||||||
#endif
|
|
||||||
return name;
|
return name;
|
||||||
} else {
|
} else {
|
||||||
return str_view{}; // Unsupported compiler or Invalid customize.
|
return str_view{}; // Unsupported compiler or Invalid customize.
|
||||||
|
|
|
||||||
|
|
@ -453,6 +453,14 @@ enum lt1 { s1, loooooooooooooooooooong1 };
|
||||||
enum lt2 : unsigned { s2, loooooooooooooooooooong2 };
|
enum lt2 : unsigned { s2, loooooooooooooooooooong2 };
|
||||||
enum class lt3 { s3, loooooooooooooooooooong3 };
|
enum class lt3 { s3, loooooooooooooooooooong3 };
|
||||||
enum class lt4 : unsigned { s4, loooooooooooooooooooong4 };
|
enum class lt4 : unsigned { s4, loooooooooooooooooooong4 };
|
||||||
|
class foo1 {
|
||||||
|
public:
|
||||||
|
enum class lt5 { s5, loooooooooooooooooooong5 };
|
||||||
|
};
|
||||||
|
class foo2 {
|
||||||
|
public:
|
||||||
|
enum lt6 { s6, loooooooooooooooooooong6 };
|
||||||
|
};
|
||||||
|
|
||||||
TEST_CASE("enum_name") {
|
TEST_CASE("enum_name") {
|
||||||
SECTION("automatic storage") {
|
SECTION("automatic storage") {
|
||||||
|
|
@ -502,6 +510,10 @@ TEST_CASE("enum_name") {
|
||||||
REQUIRE(enum_name(lt3::loooooooooooooooooooong3) == "loooooooooooooooooooong3");
|
REQUIRE(enum_name(lt3::loooooooooooooooooooong3) == "loooooooooooooooooooong3");
|
||||||
REQUIRE(enum_name(lt4::s4) == "s4");
|
REQUIRE(enum_name(lt4::s4) == "s4");
|
||||||
REQUIRE(enum_name(lt4::loooooooooooooooooooong4) == "loooooooooooooooooooong4");
|
REQUIRE(enum_name(lt4::loooooooooooooooooooong4) == "loooooooooooooooooooong4");
|
||||||
|
REQUIRE(enum_name(foo1::lt5::s5) == "s5");
|
||||||
|
REQUIRE(enum_name(foo1::lt5::loooooooooooooooooooong5) == "loooooooooooooooooooong5");
|
||||||
|
REQUIRE(enum_name(foo2::s6) == "s6");
|
||||||
|
REQUIRE(enum_name(foo2::loooooooooooooooooooong6) == "loooooooooooooooooooong6");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("static storage") {
|
SECTION("static storage") {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue