| 135 | |
| 136 | template <typename Result = detail::default_result_type, typename E, detail::enum_subtype S = detail::subtype_v<E>, typename F, typename R = detail::result_t<E, S, Result, F>> |
| 137 | constexpr decltype(auto) enum_switch(F&& f, E value) { |
| 138 | using D = std::decay_t<E>; |
| 139 | static_assert(std::is_enum_v<D>, "magic_enum::enum_switch requires enum type."); |
| 140 | static_assert(detail::is_reflected_v<D, S>, "magic_enum requires enum implementation and valid max and min."); |
| 141 | |
| 142 | #if defined(MAGIC_ENUM_ENABLE_HASH) || defined(MAGIC_ENUM_ENABLE_HASH_SWITCH) |
| 143 | return detail::constexpr_switch<&detail::values_v<D, S>, detail::case_call_t::value>( |
| 144 | std::forward<F>(f), |
| 145 | value, |
| 146 | detail::default_result_type_lambda<R>); |
| 147 | #else |
| 148 | return detail::constexpr_switch<R, D, S>( |
| 149 | std::forward<F>(f), |
| 150 | value, |
| 151 | detail::default_result_type_lambda<R>); |
| 152 | #endif |
| 153 | } |
| 154 | |
| 155 | template <typename Result = detail::default_result_type, detail::enum_subtype S, typename E, typename F, typename R = detail::result_t<E, S, Result, F>> |
| 156 | constexpr decltype(auto) enum_switch(F&& f, E value) { |