diff options
Diffstat (limited to 'libcxx/include/variant')
| -rw-r--r-- | libcxx/include/variant | 67 |
1 files changed, 36 insertions, 31 deletions
diff --git a/libcxx/include/variant b/libcxx/include/variant index 88a625df71e..98a62c992fa 100644 --- a/libcxx/include/variant +++ b/libcxx/include/variant @@ -1098,59 +1098,64 @@ struct __narrowing_check { template <class _Dest> static auto __test_impl(_Dest (&&)[1]) -> __identity<_Dest>; template <class _Dest, class _Source> - using _Apply = decltype(__test_impl<_Dest>({std::declval<_Source>()})); + using _Apply _LIBCPP_NODEBUG_TYPE = decltype(__test_impl<_Dest>({std::declval<_Source>()})); }; template <class _Dest, class _Source> -using __check_for_narrowing = typename _If< +using __check_for_narrowing _LIBCPP_NODEBUG_TYPE = + typename _If< #ifdef _LIBCPP_ENABLE_NARROWING_CONVERSIONS_IN_VARIANT false && #endif is_arithmetic<_Dest>::value, __narrowing_check, __no_narrowing_check - >::template _Apply<_Dest, _Source>; - - -template <class... _Types> -struct __overload; - -template <> -struct __overload<> { void operator()() const; }; - -template <class _Tp, class... _Types> -struct __overload<_Tp, _Types...> : __overload<_Types...> { - using __overload<_Types...>::operator(); + >::template _Apply<_Dest, _Source>; +template <class _Tp, size_t _Idx> +struct __overload { template <class _Up> auto operator()(_Tp, _Up&&) const -> __check_for_narrowing<_Tp, _Up>; }; -template <class _Base, class _Tp> -struct __overload_bool : _Base { - using _Base::operator(); - +template <class _Tp, size_t> +struct __overload_bool { template <class _Up, class _Ap = __uncvref_t<_Up>> auto operator()(bool, _Up&&) const -> enable_if_t<is_same_v<_Ap, bool>, __identity<_Tp>>; }; -template <class... _Types> -struct __overload<bool, _Types...> - : __overload_bool<__overload<_Types...>, bool> {}; -template <class... _Types> -struct __overload<bool const, _Types...> - : __overload_bool<__overload<_Types...>, bool const> {}; -template <class... _Types> -struct __overload<bool volatile, _Types...> - : __overload_bool<__overload<_Types...>, bool volatile> {}; -template <class... _Types> -struct __overload<bool const volatile, _Types...> - : __overload_bool<__overload<_Types...>, bool const volatile> {}; +template <size_t _Idx> +struct __overload<bool, _Idx> : __overload_bool<bool, _Idx> {}; +template <size_t _Idx> +struct __overload<bool const, _Idx> : __overload_bool<bool const, _Idx> {}; +template <size_t _Idx> +struct __overload<bool volatile, _Idx> : __overload_bool<bool volatile, _Idx> {}; +template <size_t _Idx> +struct __overload<bool const volatile, _Idx> : __overload_bool<bool const volatile, _Idx> {}; + +template <class ..._Bases> +struct __all_overloads : _Bases... { + void operator()() const; + using _Bases::operator()...; +}; + +template <class IdxSeq> +struct __make_overloads_imp; + +template <size_t ..._Idx> +struct __make_overloads_imp<__tuple_indices<_Idx...> > { + template <class ..._Types> + using _Apply _LIBCPP_NODEBUG_TYPE = __all_overloads<__overload<_Types, _Idx>...>; +}; + +template <class ..._Types> +using _MakeOverloads _LIBCPP_NODEBUG_TYPE = typename __make_overloads_imp< + __make_indices_imp<sizeof...(_Types), 0> >::template _Apply<_Types...>; template <class _Tp, class... _Types> using __best_match_t = - typename invoke_result_t<__overload<_Types...>, _Tp, _Tp>::type; + typename invoke_result_t<_MakeOverloads<_Types...>, _Tp, _Tp>::type; } // __variant_detail |

