Skip to content

Commit 59411bf

Browse files
committed
add nameof_enum_or
1 parent f32bbb0 commit 59411bf

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

include/nameof.hpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -979,7 +979,7 @@ inline constexpr bool is_nameof_member_supported = detail::nameof_member_support
979979
// Checks is nameof_enum supported compiler.
980980
inline constexpr bool is_nameof_enum_supported = detail::nameof_enum_supported<void>::value;
981981

982-
// Obtains simple (unqualified) name of enum variable.
982+
// Obtains name of enum variable.
983983
template <typename E>
984984
[[nodiscard]] constexpr auto nameof_enum(E value) noexcept -> detail::enable_if_enum_t<E, string_view> {
985985
using D = std::decay_t<E>;
@@ -998,11 +998,22 @@ template <typename E>
998998
}
999999
}
10001000

1001-
assert(valid && "enum variable does not have a name.");
10021001
return {}; // Value out of range.
10031002
}
10041003

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.
10061017
template <typename E>
10071018
[[nodiscard]] auto nameof_enum_flag(E value) -> detail::enable_if_enum_t<E, string> {
10081019
using D = std::decay_t<E>;
@@ -1032,11 +1043,10 @@ template <typename E>
10321043
return name;
10331044
}
10341045

1035-
assert(valid && "enum-flags variable does not have a name.");
10361046
return {}; // Invalid value or out of range.
10371047
}
10381048

1039-
// Obtains simple (unqualified) name of static storage enum variable.
1049+
// Obtains name of static storage enum variable.
10401050
// This version is much lighter on the compile times and is not restricted to the enum_range limitation.
10411051
template <auto V>
10421052
[[nodiscard]] constexpr auto nameof_enum() noexcept -> detail::enable_if_enum_t<decltype(V), string_view> {
@@ -1123,6 +1133,9 @@ template <auto V>
11231133
// Obtains name of enum variable.
11241134
#define NAMEOF_ENUM(...) ::nameof::nameof_enum<::std::decay_t<decltype(__VA_ARGS__)>>(__VA_ARGS__)
11251135

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+
11261139
// Obtains name of static storage enum variable.
11271140
// This version is much lighter on the compile times and is not restricted to the enum_range limitation.
11281141
#define NAMEOF_ENUM_CONST(...) ::nameof::nameof_enum<__VA_ARGS__>()

test/test.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ struct nameof::customize::enum_range<number> {
107107
static_assert(max > min, "nameof::enum_range<number> requires max > min.");
108108
};
109109

110+
enum class OutOfRange {
111+
too_low = NAMEOF_ENUM_RANGE_MIN - 1,
112+
required_to_work = 0,
113+
too_high = NAMEOF_ENUM_RANGE_MAX + 1
114+
};
115+
110116
struct TestRtti{
111117
struct Base { virtual ~Base() = default; };
112118
struct Derived : Base {};
@@ -442,6 +448,28 @@ TEST_CASE("NAMEOF_ENUM_FLAG") {
442448
NAMEOF_DEBUG_REQUIRE(NAMEOF_ENUM_FLAG(static_cast<BigFlags>((static_cast<std::uint64_t>(0x1) << 63) | 2)).empty());
443449
}
444450

451+
TEST_CASE("nameof_enum_or") {
452+
OutOfRange low = OutOfRange::too_low;
453+
OutOfRange high = OutOfRange::too_high;
454+
auto low_name = nameof::nameof_enum_or(low, "-121");
455+
auto high_name = nameof::nameof_enum_or(high, "121");
456+
constexpr OutOfRange oor[] = {OutOfRange::too_high, OutOfRange::too_low};
457+
REQUIRE(low_name == "-121");
458+
REQUIRE(high_name == "121");
459+
REQUIRE(nameof::nameof_enum_or(oor[0], "121") == "121");
460+
}
461+
462+
TEST_CASE("NAMEOF_ENUM_OR") {
463+
OutOfRange low = OutOfRange::too_low;
464+
OutOfRange high = OutOfRange::too_high;
465+
auto low_name = NAMEOF_ENUM_OR(low, "-121");
466+
auto high_name = NAMEOF_ENUM_OR(high, "121");
467+
constexpr OutOfRange oor[] = {OutOfRange::too_high, OutOfRange::too_low};
468+
REQUIRE(low_name == "-121");
469+
REQUIRE(high_name == "121");
470+
REQUIRE(NAMEOF_ENUM_OR(oor[0], "121") == "121");
471+
}
472+
445473
#endif
446474

447475
#if defined(NAMEOF_TYPE_SUPPORTED)

0 commit comments

Comments
 (0)