Skip to content

Commit bc2e948

Browse files
committed
add enum_reflected
1 parent 2ac8152 commit bc2e948

3 files changed

Lines changed: 55 additions & 0 deletions

File tree

doc/reference.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
* [`enum_entries` obtains pair (value enum, string enum name) sequence.](#enum_entries)
1111
* [`enum_index` obtains index in enum value sequence from enum value.](#enum_index)
1212
* [`enum_contains` checks whether enum contains enumerator with such value.](#enum_contains)
13+
* [`enum_reflected` returns true if the enum value is in the range of values that can be reflected..](#enum_reflected)
1314
* [`enum_type_name` returns type name of enum.](#enum_type_name)
1415
* [`enum_fuse` returns a bijective mix of enum values.](#enum_fuse)
1516
* [`enum_switch` allows runtime enum value transformation to constexpr context.](#enum_switch)
@@ -316,6 +317,21 @@ constexpr bool enum_contains(string_view value, BinaryPredicate p) noexcept(is_n
316317
magic_enum::enum_contains<Color>("fda"); // -> false
317318
```
318319

320+
## `enum_reflected`
321+
322+
```cpp
323+
template <typename E>
324+
constexpr bool enum_contains(E value) noexcept;
325+
326+
template <typename E>
327+
constexpr bool enum_contains(underlying_type_t<E> value) noexcept;
328+
329+
template <typename E>
330+
constexpr bool enum_contains(string_view value) noexcept;
331+
```
332+
333+
* Returns true if the enum value is in the range of values that can be reflected.
334+
319335
## `enum_type_name`
320336
321337
```cpp

include/magic_enum/magic_enum.hpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,6 +1414,35 @@ template <typename E, detail::enum_subtype S = detail::subtype_v<E>, typename Bi
14141414
return static_cast<bool>(enum_cast<D, S>(value, std::move(p)));
14151415
}
14161416

1417+
// Returns true if the enum value is in the range of values that can be reflected.
1418+
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1419+
[[nodiscard]] constexpr auto enum_reflected(E value) noexcept -> detail::enable_if_t<E, bool> {
1420+
using D = std::decay_t<E>;
1421+
1422+
if constexpr (detail::is_reflected_v<D, S>) {
1423+
constexpr auto min = detail::reflected_min<E, S>();
1424+
constexpr auto max = detail::reflected_max<E, S>();
1425+
return value >= min && value <= max;
1426+
}
1427+
return false;
1428+
}
1429+
1430+
// Returns true if the enum value is in the range of values that can be reflected.
1431+
template <detail::enum_subtype S, typename E>
1432+
[[nodiscard]] constexpr auto enum_reflected(E value) noexcept -> detail::enable_if_t<E, bool> {
1433+
using D = std::decay_t<E>;
1434+
1435+
return enum_cast<D, S>(value);
1436+
}
1437+
1438+
// Returns true if the enum integer value is in the range of values that can be reflected.
1439+
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1440+
[[nodiscard]] constexpr auto enum_reflected(underlying_type_t<E> value) noexcept -> detail::enable_if_t<E, bool> {
1441+
using D = std::decay_t<E>;
1442+
1443+
return enum_cast<D, S>(value);
1444+
}
1445+
14171446
template <bool AsFlags = true>
14181447
inline constexpr auto as_flags = AsFlags ? detail::enum_subtype::flags : detail::enum_subtype::common;
14191448

test/test.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,3 +1274,13 @@ TEST_CASE("valid_enum") {
12741274
REQUIRE(magic_enum::detail::is_reflected_v<Empty4, as_flags<true>>);
12751275
REQUIRE(magic_enum::detail::is_reflected_v<Empty4, as_flags<false>>);
12761276
}
1277+
1278+
TEST_CASE("enum_reflected") {
1279+
REQUIRE(enum_reflected<number>(number::one));
1280+
REQUIRE(enum_reflected<number>(number::three));
1281+
REQUIRE_FALSE(enum_reflected<number>(number::four));
1282+
REQUIRE(enum_reflected<number>(1));
1283+
REQUIRE(enum_reflected<number>(234));
1284+
REQUIRE_FALSE(enum_reflected<number>(400));
1285+
REQUIRE_FALSE(enum_reflected<number>(500));
1286+
}

0 commit comments

Comments
 (0)