| 103 | |
| 104 | template <std::size_t I, std::size_t End, typename R, typename E, enum_subtype S, typename F, typename Def> |
| 105 | constexpr decltype(auto) constexpr_switch_impl(F&& f, E value, Def&& def) { |
| 106 | if constexpr(I < End) { |
| 107 | constexpr auto v = enum_constant<enum_value<E, I, S>()>{}; |
| 108 | if (value == v) { |
| 109 | if constexpr (std::is_invocable_r_v<R, F, decltype(v)>) { |
| 110 | return static_cast<R>(std::forward<F>(f)(v)); |
| 111 | } else { |
| 112 | return def(); |
| 113 | } |
| 114 | } else { |
| 115 | return constexpr_switch_impl<I + 1, End, R, E, S>(std::forward<F>(f), value, std::forward<Def>(def)); |
| 116 | } |
| 117 | } else { |
| 118 | return def(); |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | template <typename R, typename E, enum_subtype S, typename F, typename Def> |
| 123 | constexpr decltype(auto) constexpr_switch(F&& f, E value, Def&& def) { |
nothing calls this directly
no outgoing calls
no test coverage detected