| 73 | // Returns a bijective mix of several enum values. This can be used to emulate 2D switch/case statements. |
| 74 | template <typename... Es> |
| 75 | [[nodiscard]] constexpr auto enum_fuse(Es... values) noexcept { |
| 76 | static_assert((std::is_enum_v<std::decay_t<Es>> && ...), "magic_enum::enum_fuse requires enum type."); |
| 77 | static_assert(sizeof...(Es) >= 2, "magic_enum::enum_fuse requires at least 2 values."); |
| 78 | static_assert((detail::log2(enum_count<std::decay_t<Es>>() + 1) + ...) <= (sizeof(std::uintmax_t) * 8), "magic_enum::enum_fuse does not work for large enums"); |
| 79 | #if defined(MAGIC_ENUM_NO_TYPESAFE_ENUM_FUSE) |
| 80 | const auto fuse = detail::fuse_enum<std::decay_t<Es>...>(values...); |
| 81 | #else |
| 82 | const auto fuse = detail::typesafe_fuse_enum<std::decay_t<Es>...>(values...); |
| 83 | #endif |
| 84 | return MAGIC_ENUM_ASSERT(fuse), fuse; |
| 85 | } |
| 86 | |
| 87 | } // namespace magic_enum |
| 88 | |