32 #ifndef NEARGYE_MAGIC_ENUM_FUSE_HPP
33 #define NEARGYE_MAGIC_ENUM_FUSE_HPP
42 constexpr optional<std::uintmax_t>
fuse_one_enum(optional<std::uintmax_t> hash, E
value) noexcept {
45 return (*hash <<
log2((enum_count<E>() << 1) - 1)) | *index;
56 template <
typename E,
typename... Es>
57 constexpr optional<std::uintmax_t>
fuse_enum(E head, Es... tail) noexcept {
61 template <
typename... Es>
63 enum class enum_fuse_t : std::uintmax_t;
66 return optional<enum_fuse_t>{
static_cast<enum_fuse_t
>(*fuse)};
68 return optional<enum_fuse_t>{};
74 template <
typename... Es>
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...);
82 const auto fuse = detail::typesafe_fuse_enum<std::decay_t<Es>...>(
values...);
89 #endif // NEARGYE_MAGIC_ENUM_FUSE_HPP