@@ -979,7 +979,7 @@ inline constexpr bool is_nameof_member_supported = detail::nameof_member_support
979
979
// Checks is nameof_enum supported compiler.
980
980
inline constexpr bool is_nameof_enum_supported = detail::nameof_enum_supported<void >::value;
981
981
982
- // Obtains simple (unqualified) name of enum variable.
982
+ // Obtains name of enum variable.
983
983
template <typename E>
984
984
[[nodiscard]] constexpr auto nameof_enum (E value) noexcept -> detail::enable_if_enum_t<E, string_view> {
985
985
using D = std::decay_t <E>;
@@ -998,11 +998,22 @@ template <typename E>
998
998
}
999
999
}
1000
1000
1001
- assert (valid && " enum variable does not have a name." );
1002
1001
return {}; // Value out of range.
1003
1002
}
1004
1003
1005
- // Obtains simple (unqualified) name of enum-flags variable.
1004
+ // Obtains name of enum variable or default value if enum variable out of range.
1005
+ template <typename E>
1006
+ [[nodiscard]] auto nameof_enum_or (E value, string_view default_value) noexcept -> detail::enable_if_enum_t<E, string> {
1007
+ using D = std::decay_t <E>;
1008
+
1009
+ if (auto v = nameof_enum<D>(value); !v.empty ()) {
1010
+ return string{v.data (), v.size ()};
1011
+ }
1012
+
1013
+ return string{default_value.data (), default_value.size ()};
1014
+ }
1015
+
1016
+ // Obtains name of enum-flags variable.
1006
1017
template <typename E>
1007
1018
[[nodiscard]] auto nameof_enum_flag (E value) -> detail::enable_if_enum_t<E, string> {
1008
1019
using D = std::decay_t <E>;
@@ -1032,11 +1043,10 @@ template <typename E>
1032
1043
return name;
1033
1044
}
1034
1045
1035
- assert (valid && " enum-flags variable does not have a name." );
1036
1046
return {}; // Invalid value or out of range.
1037
1047
}
1038
1048
1039
- // Obtains simple (unqualified) name of static storage enum variable.
1049
+ // Obtains name of static storage enum variable.
1040
1050
// This version is much lighter on the compile times and is not restricted to the enum_range limitation.
1041
1051
template <auto V>
1042
1052
[[nodiscard]] constexpr auto nameof_enum () noexcept -> detail::enable_if_enum_t<decltype(V), string_view> {
@@ -1123,6 +1133,9 @@ template <auto V>
1123
1133
// Obtains name of enum variable.
1124
1134
#define NAMEOF_ENUM (...) ::nameof::nameof_enum<::std::decay_t <decltype(__VA_ARGS__)>>(__VA_ARGS__)
1125
1135
1136
+ // Obtains name of enum variable or default value if enum variable out of range.
1137
+ #define NAMEOF_ENUM_OR (...) ::nameof::nameof_enum_or(__VA_ARGS__)
1138
+
1126
1139
// Obtains name of static storage enum variable.
1127
1140
// This version is much lighter on the compile times and is not restricted to the enum_range limitation.
1128
1141
#define NAMEOF_ENUM_CONST (...) ::nameof::nameof_enum<__VA_ARGS__>()
0 commit comments