diff --git a/include/magic_enum/magic_enum_fuse.hpp b/include/magic_enum/magic_enum_fuse.hpp index 7c3daec67..bec36e6c2 100644 --- a/include/magic_enum/magic_enum_fuse.hpp +++ b/include/magic_enum/magic_enum_fuse.hpp @@ -38,33 +38,30 @@ namespace magic_enum { namespace detail { -template -inline constexpr auto subtypes_v = subtype_v; - -template +template constexpr optional fuse_one_enum(optional hash, E value) noexcept { if (hash) { if (const auto index = enum_index(value)) { - return (*hash << log2(enum_count() + 1)) | *index; + return (*hash << log2(enum_count() + 1)) | *index; } } return {}; } -template +template constexpr optional fuse_enum(E value) noexcept { - return fuse_one_enum(0, value); + return fuse_one_enum(0, value); } -template +template constexpr optional fuse_enum(E head, Es... tail) noexcept { - return fuse_one_enum(fuse_enum(tail...), head); + return fuse_one_enum(fuse_enum(tail...), head); } -template +template constexpr auto typesafe_fuse_enum(Es... values) noexcept { enum class enum_fuse_t : std::uintmax_t; - const auto fuse = fuse_enum(values...); + const auto fuse = fuse_enum(values...); if (fuse) { return optional{static_cast(*fuse)}; } @@ -74,26 +71,19 @@ constexpr auto typesafe_fuse_enum(Es... values) noexcept { } // namespace magic_enum::detail // Returns a bijective mix of several enum values. This can be used to emulate 2D switch/case statements. -template +template [[nodiscard]] constexpr auto enum_fuse(Es... values) noexcept { static_assert((std::is_enum_v> && ...), "magic_enum::enum_fuse requires enum type."); static_assert(sizeof...(Es) >= 2, "magic_enum::enum_fuse requires at least 2 values."); - static_assert((detail::log2(enum_count, S>() + 1) + ...) <= (sizeof(std::uintmax_t) * 8), "magic_enum::enum_fuse does not work for large enums"); + static_assert((detail::log2(enum_count>() + 1) + ...) <= (sizeof(std::uintmax_t) * 8), "magic_enum::enum_fuse does not work for large enums"); #if defined(MAGIC_ENUM_NO_TYPESAFE_ENUM_FUSE) - const auto fuse = detail::fuse_enum...>(values...); + const auto fuse = detail::fuse_enum...>(values...); #else - const auto fuse = detail::typesafe_fuse_enum...>(values...); + const auto fuse = detail::typesafe_fuse_enum...>(values...); #endif return MAGIC_ENUM_ASSERT(fuse), fuse; } -// Returns a bijective mix of several enum values. This can be used to emulate 2D switch/case statements. -template -[[nodiscard]] constexpr auto enum_fuse(Es... values) noexcept { - static_assert((std::is_enum_v> && ...), "magic_enum::enum_fuse requires enum type."); - return enum_fuse...>>(values...); -} - } // namespace magic_enum #endif // NEARGYE_MAGIC_ENUM_FUSE_HPP