diff options
Diffstat (limited to 'contrib/llvm-project/libcxx/include/variant')
-rw-r--r-- | contrib/llvm-project/libcxx/include/variant | 1235 |
1 files changed, 492 insertions, 743 deletions
diff --git a/contrib/llvm-project/libcxx/include/variant b/contrib/llvm-project/libcxx/include/variant index 3b01e5e126d9..6179b2a1a0ab 100644 --- a/contrib/llvm-project/libcxx/include/variant +++ b/contrib/llvm-project/libcxx/include/variant @@ -262,7 +262,7 @@ namespace std { // explicitly not using versioning namespace class _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS bad_variant_access : public exception { public: - const char* what() const _NOEXCEPT override; + const char* what() const _NOEXCEPT override; }; } // namespace std @@ -273,26 +273,21 @@ _LIBCPP_BEGIN_NAMESPACE_STD // Light N-dimensional array of function pointers. Used in place of std::array to avoid // adding a dependency. -template<class _Tp, size_t _Size> +template <class _Tp, size_t _Size> struct __farray { static_assert(_Size > 0, "N-dimensional array should never be empty in std::visit"); _Tp __buf_[_Size] = {}; - _LIBCPP_HIDE_FROM_ABI constexpr - const _Tp &operator[](size_t __n) const noexcept { - return __buf_[__n]; - } + _LIBCPP_HIDE_FROM_ABI constexpr const _Tp& operator[](size_t __n) const noexcept { return __buf_[__n]; } }; -_LIBCPP_NORETURN -inline _LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -void __throw_bad_variant_access() { -#ifndef _LIBCPP_HAS_NO_EXCEPTIONS - throw bad_variant_access(); -#else - _LIBCPP_VERBOSE_ABORT("bad_variant_access was thrown in -fno-exceptions mode"); -#endif +_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS void +__throw_bad_variant_access() { +# ifndef _LIBCPP_HAS_NO_EXCEPTIONS + throw bad_variant_access(); +# else + _LIBCPP_VERBOSE_ABORT("bad_variant_access was thrown in -fno-exceptions mode"); +# endif } template <class... _Types> @@ -311,12 +306,10 @@ template <class _Tp> struct _LIBCPP_TEMPLATE_VIS variant_size<volatile _Tp> : variant_size<_Tp> {}; template <class _Tp> -struct _LIBCPP_TEMPLATE_VIS variant_size<const volatile _Tp> - : variant_size<_Tp> {}; +struct _LIBCPP_TEMPLATE_VIS variant_size<const volatile _Tp> : variant_size<_Tp> {}; template <class... _Types> -struct _LIBCPP_TEMPLATE_VIS variant_size<variant<_Types...>> - : integral_constant<size_t, sizeof...(_Types)> {}; +struct _LIBCPP_TEMPLATE_VIS variant_size<variant<_Types...>> : integral_constant<size_t, sizeof...(_Types)> {}; template <size_t _Ip, class _Tp> struct _LIBCPP_TEMPLATE_VIS variant_alternative; @@ -325,16 +318,13 @@ template <size_t _Ip, class _Tp> using variant_alternative_t = typename variant_alternative<_Ip, _Tp>::type; template <size_t _Ip, class _Tp> -struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, const _Tp> - : add_const<variant_alternative_t<_Ip, _Tp>> {}; +struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, const _Tp> : add_const<variant_alternative_t<_Ip, _Tp>> {}; template <size_t _Ip, class _Tp> -struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, volatile _Tp> - : add_volatile<variant_alternative_t<_Ip, _Tp>> {}; +struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, volatile _Tp> : add_volatile<variant_alternative_t<_Ip, _Tp>> {}; template <size_t _Ip, class _Tp> -struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, const volatile _Tp> - : add_cv<variant_alternative_t<_Ip, _Tp>> {}; +struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, const volatile _Tp> : add_cv<variant_alternative_t<_Ip, _Tp>> {}; template <size_t _Ip, class... _Types> struct _LIBCPP_TEMPLATE_VIS variant_alternative<_Ip, variant<_Types...>> { @@ -354,14 +344,11 @@ _LIBCPP_HIDE_FROM_ABI constexpr int __choose_index_type(unsigned int __num_elem) template <size_t _NumAlts> using __variant_index_t = -#ifndef _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION - unsigned int; -#else - std::tuple_element_t< - __choose_index_type(_NumAlts), - std::tuple<unsigned char, unsigned short, unsigned int> - >; -#endif +# ifndef _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION + unsigned int; +# else + std::tuple_element_t< __choose_index_type(_NumAlts), std::tuple<unsigned char, unsigned short, unsigned int> >; +# endif template <class _IndexType> constexpr _IndexType __variant_npos = static_cast<_IndexType>(-1); @@ -370,36 +357,31 @@ template <class... _Types> class _LIBCPP_TEMPLATE_VIS variant; template <class... _Types> -_LIBCPP_HIDE_FROM_ABI constexpr variant<_Types...>& -__as_variant(variant<_Types...>& __vs) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr variant<_Types...>& __as_variant(variant<_Types...>& __vs) noexcept { return __vs; } template <class... _Types> -_LIBCPP_HIDE_FROM_ABI constexpr const variant<_Types...>& -__as_variant(const variant<_Types...>& __vs) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr const variant<_Types...>& __as_variant(const variant<_Types...>& __vs) noexcept { return __vs; } template <class... _Types> -_LIBCPP_HIDE_FROM_ABI constexpr variant<_Types...>&& -__as_variant(variant<_Types...>&& __vs) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr variant<_Types...>&& __as_variant(variant<_Types...>&& __vs) noexcept { return std::move(__vs); } template <class... _Types> -_LIBCPP_HIDE_FROM_ABI constexpr const variant<_Types...>&& -__as_variant(const variant<_Types...>&& __vs) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr const variant<_Types...>&& __as_variant(const variant<_Types...>&& __vs) noexcept { return std::move(__vs); } namespace __find_detail { template <class _Tp, class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr size_t __find_index() { +_LIBCPP_HIDE_FROM_ABI constexpr size_t __find_index() { constexpr bool __matches[] = {is_same_v<_Tp, _Types>...}; - size_t __result = __not_found; + size_t __result = __not_found; for (size_t __i = 0; __i < sizeof...(_Types); ++__i) { if (__matches[__i]) { if (__result != __not_found) { @@ -412,8 +394,7 @@ constexpr size_t __find_index() { } template <size_t _Index> -struct __find_unambiguous_index_sfinae_impl - : integral_constant<size_t, _Index> {}; +struct __find_unambiguous_index_sfinae_impl : integral_constant<size_t, _Index> {}; template <> struct __find_unambiguous_index_sfinae_impl<__not_found> {}; @@ -422,8 +403,7 @@ template <> struct __find_unambiguous_index_sfinae_impl<__ambiguous> {}; template <class _Tp, class... _Types> -struct __find_unambiguous_index_sfinae - : __find_unambiguous_index_sfinae_impl<__find_index<_Tp, _Types...>()> {}; +struct __find_unambiguous_index_sfinae : __find_unambiguous_index_sfinae_impl<__find_index<_Tp, _Types...>()> {}; } // namespace __find_detail @@ -433,16 +413,14 @@ struct __valueless_t {}; enum class _Trait { _TriviallyAvailable, _Available, _Unavailable }; -template <typename _Tp, - template <typename> class _IsTriviallyAvailable, - template <typename> class _IsAvailable> +template <typename _Tp, template <typename> class _IsTriviallyAvailable, template <typename> class _IsAvailable> constexpr _Trait __trait = - _IsTriviallyAvailable<_Tp>::value - ? _Trait::_TriviallyAvailable - : _IsAvailable<_Tp>::value ? _Trait::_Available : _Trait::_Unavailable; + _IsTriviallyAvailable<_Tp>::value ? _Trait::_TriviallyAvailable + : _IsAvailable<_Tp>::value + ? _Trait::_Available + : _Trait::_Unavailable; -_LIBCPP_HIDE_FROM_ABI -constexpr _Trait __common_trait(initializer_list<_Trait> __traits) { +_LIBCPP_HIDE_FROM_ABI constexpr _Trait __common_trait(initializer_list<_Trait> __traits) { _Trait __result = _Trait::_TriviallyAvailable; for (_Trait __t : __traits) { if (static_cast<int>(__t) > static_cast<int>(__result)) { @@ -455,56 +433,45 @@ constexpr _Trait __common_trait(initializer_list<_Trait> __traits) { template <typename... _Types> struct __traits { static constexpr _Trait __copy_constructible_trait = - __variant_detail::__common_trait({__trait<_Types, - is_trivially_copy_constructible, - is_copy_constructible>...}); + __variant_detail::__common_trait({__trait<_Types, is_trivially_copy_constructible, is_copy_constructible>...}); static constexpr _Trait __move_constructible_trait = - __variant_detail::__common_trait({__trait<_Types, - is_trivially_move_constructible, - is_move_constructible>...}); + __variant_detail::__common_trait({__trait<_Types, is_trivially_move_constructible, is_move_constructible>...}); static constexpr _Trait __copy_assignable_trait = __variant_detail::__common_trait( - {__copy_constructible_trait, - __trait<_Types, is_trivially_copy_assignable, is_copy_assignable>...}); + {__copy_constructible_trait, __trait<_Types, is_trivially_copy_assignable, is_copy_assignable>...}); static constexpr _Trait __move_assignable_trait = __variant_detail::__common_trait( - {__move_constructible_trait, - __trait<_Types, is_trivially_move_assignable, is_move_assignable>...}); + {__move_constructible_trait, __trait<_Types, is_trivially_move_assignable, is_move_assignable>...}); - static constexpr _Trait __destructible_trait = __variant_detail::__common_trait( - {__trait<_Types, is_trivially_destructible, is_destructible>...}); + static constexpr _Trait __destructible_trait = + __variant_detail::__common_trait({__trait<_Types, is_trivially_destructible, is_destructible>...}); }; namespace __access { struct __union { template <class _Vp> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto&& __get_alt(_Vp&& __v, in_place_index_t<0>) { + _LIBCPP_HIDE_FROM_ABI static constexpr auto&& __get_alt(_Vp&& __v, in_place_index_t<0>) { return std::forward<_Vp>(__v).__head; } template <class _Vp, size_t _Ip> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto&& __get_alt(_Vp&& __v, in_place_index_t<_Ip>) { + _LIBCPP_HIDE_FROM_ABI static constexpr auto&& __get_alt(_Vp&& __v, in_place_index_t<_Ip>) { return __get_alt(std::forward<_Vp>(__v).__tail, in_place_index<_Ip - 1>); } }; struct __base { template <size_t _Ip, class _Vp> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto&& __get_alt(_Vp&& __v) { - return __union::__get_alt(std::forward<_Vp>(__v).__data, - in_place_index<_Ip>); + _LIBCPP_HIDE_FROM_ABI static constexpr auto&& __get_alt(_Vp&& __v) { + return __union::__get_alt(std::forward<_Vp>(__v).__data, in_place_index<_Ip>); } }; struct __variant { template <size_t _Ip, class _Vp> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto&& __get_alt(_Vp&& __v) { + _LIBCPP_HIDE_FROM_ABI static constexpr auto&& __get_alt(_Vp&& __v) { return __base::__get_alt<_Ip>(std::forward<_Vp>(__v).__impl_); } }; @@ -515,50 +482,38 @@ namespace __visitation { struct __base { template <class _Visitor, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr decltype(auto) + _LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto) __visit_alt_at(size_t __index, _Visitor&& __visitor, _Vs&&... __vs) { - constexpr auto __fdiagonal = - __make_fdiagonal<_Visitor&&, - decltype(std::forward<_Vs>(__vs).__as_base())...>(); - return __fdiagonal[__index](std::forward<_Visitor>(__visitor), - std::forward<_Vs>(__vs).__as_base()...); + constexpr auto __fdiagonal = __make_fdiagonal<_Visitor&&, decltype(std::forward<_Vs>(__vs).__as_base())...>(); + return __fdiagonal[__index](std::forward<_Visitor>(__visitor), std::forward<_Vs>(__vs).__as_base()...); } template <class _Visitor, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr decltype(auto) __visit_alt(_Visitor&& __visitor, - _Vs&&... __vs) { - constexpr auto __fmatrix = - __make_fmatrix<_Visitor&&, - decltype(std::forward<_Vs>(__vs).__as_base())...>(); - return __at(__fmatrix, __vs.index()...)( - std::forward<_Visitor>(__visitor), - std::forward<_Vs>(__vs).__as_base()...); + _LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto) __visit_alt(_Visitor&& __visitor, _Vs&&... __vs) { + constexpr auto __fmatrix = __make_fmatrix<_Visitor&&, decltype(std::forward<_Vs>(__vs).__as_base())...>(); + return __at(__fmatrix, __vs.index()...)(std::forward<_Visitor>(__visitor), std::forward<_Vs>(__vs).__as_base()...); } private: template <class _Tp> - _LIBCPP_HIDE_FROM_ABI - static constexpr const _Tp& __at(const _Tp& __elem) { return __elem; } + _LIBCPP_HIDE_FROM_ABI static constexpr const _Tp& __at(const _Tp& __elem) { + return __elem; + } template <class _Tp, size_t _Np, typename... _Indices> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto&& __at(const __farray<_Tp, _Np>& __elems, - size_t __index, _Indices... __indices) { + _LIBCPP_HIDE_FROM_ABI static constexpr auto&& + __at(const __farray<_Tp, _Np>& __elems, size_t __index, _Indices... __indices) { return __at(__elems[__index], __indices...); } template <class _Fp, class... _Fs> static _LIBCPP_HIDE_FROM_ABI constexpr void __std_visit_visitor_return_type_check() { static_assert( - __all<is_same_v<_Fp, _Fs>...>::value, - "`std::visit` requires the visitor to have a single return type."); + __all<is_same_v<_Fp, _Fs>...>::value, "`std::visit` requires the visitor to have a single return type."); } template <class... _Fs> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto __make_farray(_Fs&&... __fs) { + _LIBCPP_HIDE_FROM_ABI static constexpr auto __make_farray(_Fs&&... __fs) { __std_visit_visitor_return_type_check<__remove_cvref_t<_Fs>...>(); using __result = __farray<common_type_t<__remove_cvref_t<_Fs>...>, sizeof...(_Fs)>; return __result{{std::forward<_Fs>(__fs)...}}; @@ -567,59 +522,46 @@ private: template <size_t... _Is> struct __dispatcher { template <class _Fp, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr decltype(auto) __dispatch(_Fp __f, _Vs... __vs) { - return std::__invoke( - static_cast<_Fp>(__f), - __access::__base::__get_alt<_Is>(static_cast<_Vs>(__vs))...); + _LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto) __dispatch(_Fp __f, _Vs... __vs) { + return std::__invoke(static_cast<_Fp>(__f), __access::__base::__get_alt<_Is>(static_cast<_Vs>(__vs))...); } }; template <class _Fp, class... _Vs, size_t... _Is> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto __make_dispatch(index_sequence<_Is...>) { + _LIBCPP_HIDE_FROM_ABI static constexpr auto __make_dispatch(index_sequence<_Is...>) { return __dispatcher<_Is...>::template __dispatch<_Fp, _Vs...>; } template <size_t _Ip, class _Fp, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto __make_fdiagonal_impl() { - return __make_dispatch<_Fp, _Vs...>( - index_sequence<((void)__type_identity<_Vs>{}, _Ip)...>{}); + _LIBCPP_HIDE_FROM_ABI static constexpr auto __make_fdiagonal_impl() { + return __make_dispatch<_Fp, _Vs...>(index_sequence<((void)__type_identity<_Vs>{}, _Ip)...>{}); } template <class _Fp, class... _Vs, size_t... _Is> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto __make_fdiagonal_impl(index_sequence<_Is...>) { + _LIBCPP_HIDE_FROM_ABI static constexpr auto __make_fdiagonal_impl(index_sequence<_Is...>) { return __base::__make_farray(__make_fdiagonal_impl<_Is, _Fp, _Vs...>()...); } template <class _Fp, class _Vp, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto __make_fdiagonal() { + _LIBCPP_HIDE_FROM_ABI static constexpr auto __make_fdiagonal() { constexpr size_t __np = __remove_cvref_t<_Vp>::__size(); static_assert(__all<(__np == __remove_cvref_t<_Vs>::__size())...>::value); return __make_fdiagonal_impl<_Fp, _Vp, _Vs...>(make_index_sequence<__np>{}); } template <class _Fp, class... _Vs, size_t... _Is> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto __make_fmatrix_impl(index_sequence<_Is...> __is) { + _LIBCPP_HIDE_FROM_ABI static constexpr auto __make_fmatrix_impl(index_sequence<_Is...> __is) { return __make_dispatch<_Fp, _Vs...>(__is); } template <class _Fp, class... _Vs, size_t... _Is, size_t... _Js, class... _Ls> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto __make_fmatrix_impl(index_sequence<_Is...>, - index_sequence<_Js...>, - _Ls... __ls) { - return __base::__make_farray(__make_fmatrix_impl<_Fp, _Vs...>( - index_sequence<_Is..., _Js>{}, __ls...)...); + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __make_fmatrix_impl(index_sequence<_Is...>, index_sequence<_Js...>, _Ls... __ls) { + return __base::__make_farray(__make_fmatrix_impl<_Fp, _Vs...>(index_sequence<_Is..., _Js>{}, __ls...)...); } template <class _Fp, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto __make_fmatrix() { + _LIBCPP_HIDE_FROM_ABI static constexpr auto __make_fmatrix() { return __make_fmatrix_impl<_Fp, _Vs...>( index_sequence<>{}, make_index_sequence<__remove_cvref_t<_Vs>::__size()>{}...); } @@ -627,110 +569,79 @@ private: struct __variant { template <class _Visitor, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr decltype(auto) + _LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto) __visit_alt_at(size_t __index, _Visitor&& __visitor, _Vs&&... __vs) { - return __base::__visit_alt_at(__index, - std::forward<_Visitor>(__visitor), - std::forward<_Vs>(__vs).__impl_...); + return __base::__visit_alt_at(__index, std::forward<_Visitor>(__visitor), std::forward<_Vs>(__vs).__impl_...); } template <class _Visitor, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr decltype(auto) __visit_alt(_Visitor&& __visitor, - _Vs&&... __vs) { + _LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto) __visit_alt(_Visitor&& __visitor, _Vs&&... __vs) { return __base::__visit_alt( - std::forward<_Visitor>(__visitor), - std::__as_variant(std::forward<_Vs>(__vs)).__impl_...); + std::forward<_Visitor>(__visitor), std::__as_variant(std::forward<_Vs>(__vs)).__impl_...); } template <class _Visitor, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr decltype(auto) + _LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto) __visit_value_at(size_t __index, _Visitor&& __visitor, _Vs&&... __vs) { - return __visit_alt_at( - __index, - __make_value_visitor(std::forward<_Visitor>(__visitor)), - std::forward<_Vs>(__vs)...); + return __visit_alt_at(__index, __make_value_visitor(std::forward<_Visitor>(__visitor)), std::forward<_Vs>(__vs)...); } template <class _Visitor, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr decltype(auto) __visit_value(_Visitor&& __visitor, - _Vs&&... __vs) { - return __visit_alt( - __make_value_visitor(std::forward<_Visitor>(__visitor)), - std::forward<_Vs>(__vs)...); + _LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto) __visit_value(_Visitor&& __visitor, _Vs&&... __vs) { + return __visit_alt(__make_value_visitor(std::forward<_Visitor>(__visitor)), std::forward<_Vs>(__vs)...); } -#if _LIBCPP_STD_VER >= 20 +# if _LIBCPP_STD_VER >= 20 template <class _Rp, class _Visitor, class... _Vs> - _LIBCPP_HIDE_FROM_ABI - static constexpr _Rp __visit_value(_Visitor&& __visitor, - _Vs&&... __vs) { - return __visit_alt( - __make_value_visitor<_Rp>(std::forward<_Visitor>(__visitor)), - std::forward<_Vs>(__vs)...); + _LIBCPP_HIDE_FROM_ABI static constexpr _Rp __visit_value(_Visitor&& __visitor, _Vs&&... __vs) { + return __visit_alt(__make_value_visitor<_Rp>(std::forward<_Visitor>(__visitor)), std::forward<_Vs>(__vs)...); } -#endif +# endif private: template <class _Visitor, class... _Values> static _LIBCPP_HIDE_FROM_ABI constexpr void __std_visit_exhaustive_visitor_check() { - static_assert(is_invocable_v<_Visitor, _Values...>, - "`std::visit` requires the visitor to be exhaustive."); + static_assert(is_invocable_v<_Visitor, _Values...>, "`std::visit` requires the visitor to be exhaustive."); } template <class _Visitor> struct __value_visitor { template <class... _Alts> - _LIBCPP_HIDE_FROM_ABI - constexpr decltype(auto) operator()(_Alts&&... __alts) const { - __std_visit_exhaustive_visitor_check< - _Visitor, - decltype((std::forward<_Alts>(__alts).__value))...>(); - return std::__invoke(std::forward<_Visitor>(__visitor), - std::forward<_Alts>(__alts).__value...); + _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator()(_Alts&&... __alts) const { + __std_visit_exhaustive_visitor_check< _Visitor, decltype((std::forward<_Alts>(__alts).__value))...>(); + return std::__invoke(std::forward<_Visitor>(__visitor), std::forward<_Alts>(__alts).__value...); } _Visitor&& __visitor; }; -#if _LIBCPP_STD_VER >= 20 +# if _LIBCPP_STD_VER >= 20 template <class _Rp, class _Visitor> struct __value_visitor_return_type { template <class... _Alts> - _LIBCPP_HIDE_FROM_ABI - constexpr _Rp operator()(_Alts&&... __alts) const { - __std_visit_exhaustive_visitor_check< - _Visitor, - decltype((std::forward<_Alts>(__alts).__value))...>(); + _LIBCPP_HIDE_FROM_ABI constexpr _Rp operator()(_Alts&&... __alts) const { + __std_visit_exhaustive_visitor_check< _Visitor, decltype((std::forward<_Alts>(__alts).__value))...>(); if constexpr (is_void_v<_Rp>) { - std::__invoke(std::forward<_Visitor>(__visitor), - std::forward<_Alts>(__alts).__value...); - } - else { - return std::__invoke(std::forward<_Visitor>(__visitor), - std::forward<_Alts>(__alts).__value...); + std::__invoke(std::forward<_Visitor>(__visitor), std::forward<_Alts>(__alts).__value...); + } else { + return std::__invoke(std::forward<_Visitor>(__visitor), std::forward<_Alts>(__alts).__value...); } } _Visitor&& __visitor; }; -#endif +# endif template <class _Visitor> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto __make_value_visitor(_Visitor&& __visitor) { + _LIBCPP_HIDE_FROM_ABI static constexpr auto __make_value_visitor(_Visitor&& __visitor) { return __value_visitor<_Visitor>{std::forward<_Visitor>(__visitor)}; } -#if _LIBCPP_STD_VER >= 20 +# if _LIBCPP_STD_VER >= 20 template <class _Rp, class _Visitor> - _LIBCPP_HIDE_FROM_ABI - static constexpr auto __make_value_visitor(_Visitor&& __visitor) { + _LIBCPP_HIDE_FROM_ABI static constexpr auto __make_value_visitor(_Visitor&& __visitor) { return __value_visitor_return_type<_Rp, _Visitor>{std::forward<_Visitor>(__visitor)}; } -#endif +# endif }; } // namespace __visitation @@ -740,8 +651,7 @@ struct _LIBCPP_TEMPLATE_VIS __alt { using __value_type = _Tp; template <class... _Args> - _LIBCPP_HIDE_FROM_ABI - explicit constexpr __alt(in_place_t, _Args&&... __args) + _LIBCPP_HIDE_FROM_ABI explicit constexpr __alt(in_place_t, _Args&&... __args) : __value(std::forward<_Args>(__args)...) {} __value_type __value; @@ -753,89 +663,71 @@ union _LIBCPP_TEMPLATE_VIS __union; template <_Trait _DestructibleTrait, size_t _Index> union _LIBCPP_TEMPLATE_VIS __union<_DestructibleTrait, _Index> {}; -#define _LIBCPP_VARIANT_UNION(destructible_trait, destructor) \ - template <size_t _Index, class _Tp, class... _Types> \ - union _LIBCPP_TEMPLATE_VIS __union<destructible_trait, \ - _Index, \ - _Tp, \ - _Types...> { \ - public: \ - _LIBCPP_HIDE_FROM_ABI \ - explicit constexpr __union(__valueless_t) noexcept : __dummy{} {} \ - \ - template <class... _Args> \ - _LIBCPP_HIDE_FROM_ABI \ - explicit constexpr __union(in_place_index_t<0>, _Args&&... __args) \ - : __head(in_place, std::forward<_Args>(__args)...) {} \ - \ - template <size_t _Ip, class... _Args> \ - _LIBCPP_HIDE_FROM_ABI \ - explicit constexpr __union(in_place_index_t<_Ip>, _Args&&... __args) \ - : __tail(in_place_index<_Ip - 1>, std::forward<_Args>(__args)...) {} \ - \ - __union(const __union&) = default; \ - __union(__union&&) = default; \ - \ - destructor \ - \ - __union& operator=(const __union&) = default; \ - __union& operator=(__union&&) = default; \ - \ - private: \ - char __dummy; \ - __alt<_Index, _Tp> __head; \ - __union<destructible_trait, _Index + 1, _Types...> __tail; \ - \ - friend struct __access::__union; \ - } +# define _LIBCPP_VARIANT_UNION(destructible_trait, destructor) \ + template <size_t _Index, class _Tp, class... _Types> \ + union _LIBCPP_TEMPLATE_VIS __union<destructible_trait, _Index, _Tp, _Types...> { \ + public: \ + _LIBCPP_HIDE_FROM_ABI explicit constexpr __union(__valueless_t) noexcept : __dummy{} {} \ + \ + template <class... _Args> \ + _LIBCPP_HIDE_FROM_ABI explicit constexpr __union(in_place_index_t<0>, _Args&&... __args) \ + : __head(in_place, std::forward<_Args>(__args)...) {} \ + \ + template <size_t _Ip, class... _Args> \ + _LIBCPP_HIDE_FROM_ABI explicit constexpr __union(in_place_index_t<_Ip>, _Args&&... __args) \ + : __tail(in_place_index<_Ip - 1>, std::forward<_Args>(__args)...) {} \ + \ + __union(const __union&) = default; \ + __union(__union&&) = default; \ + \ + destructor \ + \ + __union& \ + operator=(const __union&) = default; \ + __union& operator=(__union&&) = default; \ + \ + private: \ + char __dummy; \ + __alt<_Index, _Tp> __head; \ + __union<destructible_trait, _Index + 1, _Types...> __tail; \ + \ + friend struct __access::__union; \ + } _LIBCPP_VARIANT_UNION(_Trait::_TriviallyAvailable, ~__union() = default;); -_LIBCPP_VARIANT_UNION(_Trait::_Available, ~__union() {}); +_LIBCPP_VARIANT_UNION(_Trait::_Available, ~__union(){}); _LIBCPP_VARIANT_UNION(_Trait::_Unavailable, ~__union() = delete;); -#undef _LIBCPP_VARIANT_UNION +# undef _LIBCPP_VARIANT_UNION template <_Trait _DestructibleTrait, class... _Types> class _LIBCPP_TEMPLATE_VIS __base { public: using __index_t = __variant_index_t<sizeof...(_Types)>; - _LIBCPP_HIDE_FROM_ABI - explicit constexpr __base(__valueless_t __tag) noexcept + _LIBCPP_HIDE_FROM_ABI explicit constexpr __base(__valueless_t __tag) noexcept : __data(__tag), __index(__variant_npos<__index_t>) {} template <size_t _Ip, class... _Args> - _LIBCPP_HIDE_FROM_ABI - explicit constexpr __base(in_place_index_t<_Ip>, _Args&&... __args) - : - __data(in_place_index<_Ip>, std::forward<_Args>(__args)...), - __index(_Ip) {} - - _LIBCPP_HIDE_FROM_ABI - constexpr bool valueless_by_exception() const noexcept { - return index() == variant_npos; - } + _LIBCPP_HIDE_FROM_ABI explicit constexpr __base(in_place_index_t<_Ip>, _Args&&... __args) + : __data(in_place_index<_Ip>, std::forward<_Args>(__args)...), __index(_Ip) {} + + _LIBCPP_HIDE_FROM_ABI constexpr bool valueless_by_exception() const noexcept { return index() == variant_npos; } - _LIBCPP_HIDE_FROM_ABI - constexpr size_t index() const noexcept { + _LIBCPP_HIDE_FROM_ABI constexpr size_t index() const noexcept { return __index == __variant_npos<__index_t> ? variant_npos : __index; } protected: - _LIBCPP_HIDE_FROM_ABI - constexpr auto&& __as_base() & { return *this; } + _LIBCPP_HIDE_FROM_ABI constexpr auto&& __as_base() & { return *this; } - _LIBCPP_HIDE_FROM_ABI - constexpr auto&& __as_base() && { return std::move(*this); } + _LIBCPP_HIDE_FROM_ABI constexpr auto&& __as_base() && { return std::move(*this); } - _LIBCPP_HIDE_FROM_ABI - constexpr auto&& __as_base() const & { return *this; } + _LIBCPP_HIDE_FROM_ABI constexpr auto&& __as_base() const& { return *this; } - _LIBCPP_HIDE_FROM_ABI - constexpr auto&& __as_base() const && { return std::move(*this); } + _LIBCPP_HIDE_FROM_ABI constexpr auto&& __as_base() const&& { return std::move(*this); } - _LIBCPP_HIDE_FROM_ABI - static constexpr size_t __size() { return sizeof...(_Types); } + _LIBCPP_HIDE_FROM_ABI static constexpr size_t __size() { return sizeof...(_Types); } __union<_DestructibleTrait, 0, _Types...> __data; __index_t __index; @@ -847,33 +739,29 @@ protected: template <class _Traits, _Trait = _Traits::__destructible_trait> class _LIBCPP_TEMPLATE_VIS __dtor; -#define _LIBCPP_VARIANT_DESTRUCTOR(destructible_trait, destructor, destroy) \ - template <class... _Types> \ - class _LIBCPP_TEMPLATE_VIS __dtor<__traits<_Types...>, \ - destructible_trait> \ - : public __base<destructible_trait, _Types...> { \ - using __base_type = __base<destructible_trait, _Types...>; \ - using __index_t = typename __base_type::__index_t; \ - \ - public: \ - using __base_type::__base_type; \ - using __base_type::operator=; \ - \ - __dtor(const __dtor&) = default; \ - __dtor(__dtor&&) = default; \ - destructor \ - __dtor& operator=(const __dtor&) = default; \ - __dtor& operator=(__dtor&&) = default; \ - \ - protected: \ - inline _LIBCPP_HIDE_FROM_ABI \ - destroy \ - } +# define _LIBCPP_VARIANT_DESTRUCTOR(destructible_trait, destructor, destroy) \ + template <class... _Types> \ + class _LIBCPP_TEMPLATE_VIS __dtor<__traits<_Types...>, destructible_trait> \ + : public __base<destructible_trait, _Types...> { \ + using __base_type = __base<destructible_trait, _Types...>; \ + using __index_t = typename __base_type::__index_t; \ + \ + public: \ + using __base_type::__base_type; \ + using __base_type::operator=; \ + \ + __dtor(const __dtor&) = default; \ + __dtor(__dtor&&) = default; \ + destructor __dtor& operator=(const __dtor&) = default; \ + __dtor& operator=(__dtor&&) = default; \ + \ + protected: \ + inline _LIBCPP_HIDE_FROM_ABI destroy \ + } _LIBCPP_VARIANT_DESTRUCTOR( - _Trait::_TriviallyAvailable, - ~__dtor() = default;, - void __destroy() noexcept { this->__index = __variant_npos<__index_t>; }); + _Trait::_TriviallyAvailable, ~__dtor() = default; + , void __destroy() noexcept { this->__index = __variant_npos<__index_t>; }); _LIBCPP_VARIANT_DESTRUCTOR( _Trait::_Available, @@ -890,12 +778,9 @@ _LIBCPP_VARIANT_DESTRUCTOR( this->__index = __variant_npos<__index_t>; }); -_LIBCPP_VARIANT_DESTRUCTOR( - _Trait::_Unavailable, - ~__dtor() = delete;, - void __destroy() noexcept = delete;); +_LIBCPP_VARIANT_DESTRUCTOR(_Trait::_Unavailable, ~__dtor() = delete;, void __destroy() noexcept = delete;); -#undef _LIBCPP_VARIANT_DESTRUCTOR +# undef _LIBCPP_VARIANT_DESTRUCTOR template <class _Traits> class _LIBCPP_TEMPLATE_VIS __ctor : public __dtor<_Traits> { @@ -907,26 +792,22 @@ public: protected: template <size_t _Ip, class _Tp, class... _Args> - _LIBCPP_HIDE_FROM_ABI - static _Tp& __construct_alt(__alt<_Ip, _Tp>& __a, _Args&&... __args) { - ::new ((void*)std::addressof(__a)) - __alt<_Ip, _Tp>(in_place, std::forward<_Args>(__args)...); + _LIBCPP_HIDE_FROM_ABI static _Tp& __construct_alt(__alt<_Ip, _Tp>& __a, _Args&&... __args) { + ::new ((void*)std::addressof(__a)) __alt<_Ip, _Tp>(in_place, std::forward<_Args>(__args)...); return __a.__value; } template <class _Rhs> - _LIBCPP_HIDE_FROM_ABI - static void __generic_construct(__ctor& __lhs, _Rhs&& __rhs) { + _LIBCPP_HIDE_FROM_ABI static void __generic_construct(__ctor& __lhs, _Rhs&& __rhs) { __lhs.__destroy(); if (!__rhs.valueless_by_exception()) { __visitation::__base::__visit_alt_at( __rhs.index(), [](auto& __lhs_alt, auto&& __rhs_alt) { - __construct_alt( - __lhs_alt, - std::forward<decltype(__rhs_alt)>(__rhs_alt).__value); + __construct_alt(__lhs_alt, std::forward<decltype(__rhs_alt)>(__rhs_alt).__value); }, - __lhs, std::forward<_Rhs>(__rhs)); + __lhs, + std::forward<_Rhs>(__rhs)); __lhs.__index = __rhs.index(); } } @@ -935,81 +816,63 @@ protected: template <class _Traits, _Trait = _Traits::__move_constructible_trait> class _LIBCPP_TEMPLATE_VIS __move_constructor; -#define _LIBCPP_VARIANT_MOVE_CONSTRUCTOR(move_constructible_trait, \ - move_constructor) \ - template <class... _Types> \ - class _LIBCPP_TEMPLATE_VIS __move_constructor<__traits<_Types...>, \ - move_constructible_trait> \ - : public __ctor<__traits<_Types...>> { \ - using __base_type = __ctor<__traits<_Types...>>; \ - \ - public: \ - using __base_type::__base_type; \ - using __base_type::operator=; \ - \ - __move_constructor(const __move_constructor&) = default; \ - move_constructor \ - ~__move_constructor() = default; \ - __move_constructor& operator=(const __move_constructor&) = default; \ - __move_constructor& operator=(__move_constructor&&) = default; \ - } +# define _LIBCPP_VARIANT_MOVE_CONSTRUCTOR(move_constructible_trait, move_constructor) \ + template <class... _Types> \ + class _LIBCPP_TEMPLATE_VIS __move_constructor<__traits<_Types...>, move_constructible_trait> \ + : public __ctor<__traits<_Types...>> { \ + using __base_type = __ctor<__traits<_Types...>>; \ + \ + public: \ + using __base_type::__base_type; \ + using __base_type::operator=; \ + \ + __move_constructor(const __move_constructor&) = default; \ + move_constructor ~__move_constructor() = default; \ + __move_constructor& operator=(const __move_constructor&) = default; \ + __move_constructor& operator=(__move_constructor&&) = default; \ + } -_LIBCPP_VARIANT_MOVE_CONSTRUCTOR( - _Trait::_TriviallyAvailable, - __move_constructor(__move_constructor&& __that) = default;); +_LIBCPP_VARIANT_MOVE_CONSTRUCTOR(_Trait::_TriviallyAvailable, + __move_constructor(__move_constructor&& __that) = default;); _LIBCPP_VARIANT_MOVE_CONSTRUCTOR( _Trait::_Available, - __move_constructor(__move_constructor&& __that) noexcept( - __all<is_nothrow_move_constructible_v<_Types>...>::value) - : __move_constructor(__valueless_t{}) { - this->__generic_construct(*this, std::move(__that)); - }); + __move_constructor(__move_constructor&& __that) noexcept(__all<is_nothrow_move_constructible_v<_Types>...>::value) + : __move_constructor(__valueless_t{}) { this->__generic_construct(*this, std::move(__that)); }); -_LIBCPP_VARIANT_MOVE_CONSTRUCTOR( - _Trait::_Unavailable, - __move_constructor(__move_constructor&&) = delete;); +_LIBCPP_VARIANT_MOVE_CONSTRUCTOR(_Trait::_Unavailable, __move_constructor(__move_constructor&&) = delete;); -#undef _LIBCPP_VARIANT_MOVE_CONSTRUCTOR +# undef _LIBCPP_VARIANT_MOVE_CONSTRUCTOR template <class _Traits, _Trait = _Traits::__copy_constructible_trait> class _LIBCPP_TEMPLATE_VIS __copy_constructor; -#define _LIBCPP_VARIANT_COPY_CONSTRUCTOR(copy_constructible_trait, \ - copy_constructor) \ - template <class... _Types> \ - class _LIBCPP_TEMPLATE_VIS __copy_constructor<__traits<_Types...>, \ - copy_constructible_trait> \ - : public __move_constructor<__traits<_Types...>> { \ - using __base_type = __move_constructor<__traits<_Types...>>; \ - \ - public: \ - using __base_type::__base_type; \ - using __base_type::operator=; \ - \ - copy_constructor \ - __copy_constructor(__copy_constructor&&) = default; \ - ~__copy_constructor() = default; \ - __copy_constructor& operator=(const __copy_constructor&) = default; \ - __copy_constructor& operator=(__copy_constructor&&) = default; \ - } +# define _LIBCPP_VARIANT_COPY_CONSTRUCTOR(copy_constructible_trait, copy_constructor) \ + template <class... _Types> \ + class _LIBCPP_TEMPLATE_VIS __copy_constructor<__traits<_Types...>, copy_constructible_trait> \ + : public __move_constructor<__traits<_Types...>> { \ + using __base_type = __move_constructor<__traits<_Types...>>; \ + \ + public: \ + using __base_type::__base_type; \ + using __base_type::operator=; \ + \ + copy_constructor __copy_constructor(__copy_constructor&&) = default; \ + ~__copy_constructor() = default; \ + __copy_constructor& operator=(const __copy_constructor&) = default; \ + __copy_constructor& operator=(__copy_constructor&&) = default; \ + } -_LIBCPP_VARIANT_COPY_CONSTRUCTOR( - _Trait::_TriviallyAvailable, - __copy_constructor(const __copy_constructor& __that) = default;); +_LIBCPP_VARIANT_COPY_CONSTRUCTOR(_Trait::_TriviallyAvailable, + __copy_constructor(const __copy_constructor& __that) = default;); _LIBCPP_VARIANT_COPY_CONSTRUCTOR( - _Trait::_Available, - __copy_constructor(const __copy_constructor& __that) - : __copy_constructor(__valueless_t{}) { - this->__generic_construct(*this, __that); - }); + _Trait::_Available, __copy_constructor(const __copy_constructor& __that) + : __copy_constructor(__valueless_t{}) { this->__generic_construct(*this, __that); }); -_LIBCPP_VARIANT_COPY_CONSTRUCTOR( - _Trait::_Unavailable, - __copy_constructor(const __copy_constructor&) = delete;); +_LIBCPP_VARIANT_COPY_CONSTRUCTOR(_Trait::_Unavailable, __copy_constructor(const __copy_constructor&) = delete;); -#undef _LIBCPP_VARIANT_COPY_CONSTRUCTOR +# undef _LIBCPP_VARIANT_COPY_CONSTRUCTOR template <class _Traits> class _LIBCPP_TEMPLATE_VIS __assignment : public __copy_constructor<_Traits> { @@ -1020,40 +883,33 @@ public: using __base_type::operator=; template <size_t _Ip, class... _Args> - _LIBCPP_HIDE_FROM_ABI - auto& __emplace(_Args&&... __args) { + _LIBCPP_HIDE_FROM_ABI auto& __emplace(_Args&&... __args) { this->__destroy(); - auto& __res = this->__construct_alt(__access::__base::__get_alt<_Ip>(*this), - std::forward<_Args>(__args)...); + auto& __res = this->__construct_alt(__access::__base::__get_alt<_Ip>(*this), std::forward<_Args>(__args)...); this->__index = _Ip; return __res; } protected: template <size_t _Ip, class _Tp, class _Arg> - _LIBCPP_HIDE_FROM_ABI - void __assign_alt(__alt<_Ip, _Tp>& __a, _Arg&& __arg) { + _LIBCPP_HIDE_FROM_ABI void __assign_alt(__alt<_Ip, _Tp>& __a, _Arg&& __arg) { if (this->index() == _Ip) { __a.__value = std::forward<_Arg>(__arg); } else { struct { - _LIBCPP_HIDE_FROM_ABI void operator()(true_type) const { - __this->__emplace<_Ip>(std::forward<_Arg>(__arg)); - } + _LIBCPP_HIDE_FROM_ABI void operator()(true_type) const { __this->__emplace<_Ip>(std::forward<_Arg>(__arg)); } _LIBCPP_HIDE_FROM_ABI void operator()(false_type) const { __this->__emplace<_Ip>(_Tp(std::forward<_Arg>(__arg))); } __assignment* __this; _Arg&& __arg; } __impl{this, std::forward<_Arg>(__arg)}; - __impl(bool_constant<is_nothrow_constructible_v<_Tp, _Arg> || - !is_nothrow_move_constructible_v<_Tp>>{}); + __impl(bool_constant < is_nothrow_constructible_v<_Tp, _Arg> || !is_nothrow_move_constructible_v < _Tp >> {}); } } template <class _That> - _LIBCPP_HIDE_FROM_ABI - void __generic_assign(_That&& __that) { + _LIBCPP_HIDE_FROM_ABI void __generic_assign(_That&& __that) { if (this->valueless_by_exception() && __that.valueless_by_exception()) { // do nothing. } else if (__that.valueless_by_exception()) { @@ -1062,11 +918,10 @@ protected: __visitation::__base::__visit_alt_at( __that.index(), [this](auto& __this_alt, auto&& __that_alt) { - this->__assign_alt( - __this_alt, - std::forward<decltype(__that_alt)>(__that_alt).__value); + this->__assign_alt(__this_alt, std::forward<decltype(__that_alt)>(__that_alt).__value); }, - *this, std::forward<_That>(__that)); + *this, + std::forward<_That>(__that)); } } }; @@ -1074,104 +929,88 @@ protected: template <class _Traits, _Trait = _Traits::__move_assignable_trait> class _LIBCPP_TEMPLATE_VIS __move_assignment; -#define _LIBCPP_VARIANT_MOVE_ASSIGNMENT(move_assignable_trait, \ - move_assignment) \ - template <class... _Types> \ - class _LIBCPP_TEMPLATE_VIS __move_assignment<__traits<_Types...>, \ - move_assignable_trait> \ - : public __assignment<__traits<_Types...>> { \ - using __base_type = __assignment<__traits<_Types...>>; \ - \ - public: \ - using __base_type::__base_type; \ - using __base_type::operator=; \ - \ - __move_assignment(const __move_assignment&) = default; \ - __move_assignment(__move_assignment&&) = default; \ - ~__move_assignment() = default; \ - __move_assignment& operator=(const __move_assignment&) = default; \ - move_assignment \ - } +# define _LIBCPP_VARIANT_MOVE_ASSIGNMENT(move_assignable_trait, move_assignment) \ + template <class... _Types> \ + class _LIBCPP_TEMPLATE_VIS __move_assignment<__traits<_Types...>, move_assignable_trait> \ + : public __assignment<__traits<_Types...>> { \ + using __base_type = __assignment<__traits<_Types...>>; \ + \ + public: \ + using __base_type::__base_type; \ + using __base_type::operator=; \ + \ + __move_assignment(const __move_assignment&) = default; \ + __move_assignment(__move_assignment&&) = default; \ + ~__move_assignment() = default; \ + __move_assignment& operator=(const __move_assignment&) = default; \ + move_assignment \ + } -_LIBCPP_VARIANT_MOVE_ASSIGNMENT( - _Trait::_TriviallyAvailable, - __move_assignment& operator=(__move_assignment&& __that) = default;); +_LIBCPP_VARIANT_MOVE_ASSIGNMENT(_Trait::_TriviallyAvailable, + __move_assignment& operator=(__move_assignment&& __that) = default;); _LIBCPP_VARIANT_MOVE_ASSIGNMENT( _Trait::_Available, - __move_assignment& operator=(__move_assignment&& __that) noexcept( - __all<(is_nothrow_move_constructible_v<_Types> && - is_nothrow_move_assignable_v<_Types>)...>::value) { + __move_assignment& + operator=(__move_assignment&& __that) noexcept( + __all<(is_nothrow_move_constructible_v<_Types> && is_nothrow_move_assignable_v<_Types>)...>::value) { this->__generic_assign(std::move(__that)); return *this; }); -_LIBCPP_VARIANT_MOVE_ASSIGNMENT( - _Trait::_Unavailable, - __move_assignment& operator=(__move_assignment&&) = delete;); +_LIBCPP_VARIANT_MOVE_ASSIGNMENT(_Trait::_Unavailable, __move_assignment& operator=(__move_assignment&&) = delete;); -#undef _LIBCPP_VARIANT_MOVE_ASSIGNMENT +# undef _LIBCPP_VARIANT_MOVE_ASSIGNMENT template <class _Traits, _Trait = _Traits::__copy_assignable_trait> class _LIBCPP_TEMPLATE_VIS __copy_assignment; -#define _LIBCPP_VARIANT_COPY_ASSIGNMENT(copy_assignable_trait, \ - copy_assignment) \ - template <class... _Types> \ - class _LIBCPP_TEMPLATE_VIS __copy_assignment<__traits<_Types...>, \ - copy_assignable_trait> \ - : public __move_assignment<__traits<_Types...>> { \ - using __base_type = __move_assignment<__traits<_Types...>>; \ - \ - public: \ - using __base_type::__base_type; \ - using __base_type::operator=; \ - \ - __copy_assignment(const __copy_assignment&) = default; \ - __copy_assignment(__copy_assignment&&) = default; \ - ~__copy_assignment() = default; \ - copy_assignment \ - __copy_assignment& operator=(__copy_assignment&&) = default; \ - } +# define _LIBCPP_VARIANT_COPY_ASSIGNMENT(copy_assignable_trait, copy_assignment) \ + template <class... _Types> \ + class _LIBCPP_TEMPLATE_VIS __copy_assignment<__traits<_Types...>, copy_assignable_trait> \ + : public __move_assignment<__traits<_Types...>> { \ + using __base_type = __move_assignment<__traits<_Types...>>; \ + \ + public: \ + using __base_type::__base_type; \ + using __base_type::operator=; \ + \ + __copy_assignment(const __copy_assignment&) = default; \ + __copy_assignment(__copy_assignment&&) = default; \ + ~__copy_assignment() = default; \ + copy_assignment __copy_assignment& operator=(__copy_assignment&&) = default; \ + } -_LIBCPP_VARIANT_COPY_ASSIGNMENT( - _Trait::_TriviallyAvailable, - __copy_assignment& operator=(const __copy_assignment& __that) = default;); +_LIBCPP_VARIANT_COPY_ASSIGNMENT(_Trait::_TriviallyAvailable, + __copy_assignment& operator=(const __copy_assignment& __that) = default;); _LIBCPP_VARIANT_COPY_ASSIGNMENT( - _Trait::_Available, - __copy_assignment& operator=(const __copy_assignment& __that) { + _Trait::_Available, __copy_assignment& operator=(const __copy_assignment& __that) { this->__generic_assign(__that); return *this; }); -_LIBCPP_VARIANT_COPY_ASSIGNMENT( - _Trait::_Unavailable, - __copy_assignment& operator=(const __copy_assignment&) = delete;); +_LIBCPP_VARIANT_COPY_ASSIGNMENT(_Trait::_Unavailable, __copy_assignment& operator=(const __copy_assignment&) = delete;); -#undef _LIBCPP_VARIANT_COPY_ASSIGNMENT +# undef _LIBCPP_VARIANT_COPY_ASSIGNMENT template <class... _Types> -class _LIBCPP_TEMPLATE_VIS __impl - : public __copy_assignment<__traits<_Types...>> { +class _LIBCPP_TEMPLATE_VIS __impl : public __copy_assignment<__traits<_Types...>> { using __base_type = __copy_assignment<__traits<_Types...>>; public: using __base_type::__base_type; // get in_place_index_t constructor & friends - _LIBCPP_HIDE_FROM_ABI __impl(__impl const&) = default; - _LIBCPP_HIDE_FROM_ABI __impl(__impl&&) = default; + _LIBCPP_HIDE_FROM_ABI __impl(__impl const&) = default; + _LIBCPP_HIDE_FROM_ABI __impl(__impl&&) = default; _LIBCPP_HIDE_FROM_ABI __impl& operator=(__impl const&) = default; - _LIBCPP_HIDE_FROM_ABI __impl& operator=(__impl&&) = default; + _LIBCPP_HIDE_FROM_ABI __impl& operator=(__impl&&) = default; template <size_t _Ip, class _Arg> - _LIBCPP_HIDE_FROM_ABI - void __assign(_Arg&& __arg) { - this->__assign_alt(__access::__base::__get_alt<_Ip>(*this), - std::forward<_Arg>(__arg)); + _LIBCPP_HIDE_FROM_ABI void __assign(_Arg&& __arg) { + this->__assign_alt(__access::__base::__get_alt<_Ip>(*this), std::forward<_Arg>(__arg)); } - inline _LIBCPP_HIDE_FROM_ABI - void __swap(__impl& __that) { + inline _LIBCPP_HIDE_FROM_ABI void __swap(__impl& __that) { if (this->valueless_by_exception() && __that.valueless_by_exception()) { // do nothing. } else if (this->index() == __that.index()) { @@ -1190,7 +1029,7 @@ public: std::swap(__lhs, __rhs); } __impl __tmp(std::move(*__rhs)); -#ifndef _LIBCPP_HAS_NO_EXCEPTIONS +# ifndef _LIBCPP_HAS_NO_EXCEPTIONS if constexpr (__all<is_nothrow_move_constructible_v<_Types>...>::value) { this->__generic_construct(*__rhs, std::move(*__lhs)); } else { @@ -1206,18 +1045,17 @@ public: throw; } } -#else +# else // this isn't consolidated with the `if constexpr` branch above due to // `throw` being ill-formed with exceptions disabled even when discarded. this->__generic_construct(*__rhs, std::move(*__lhs)); -#endif +# endif this->__generic_construct(*__lhs, std::move(__tmp)); } } private: - inline _LIBCPP_HIDE_FROM_ABI - bool __move_nothrow() const { + inline _LIBCPP_HIDE_FROM_ABI bool __move_nothrow() const { constexpr bool __results[] = {is_nothrow_move_constructible_v<_Types>...}; return this->valueless_by_exception() || __results[this->index()]; } @@ -1236,15 +1074,13 @@ struct __narrowing_check { }; template <class _Dest, class _Source> -using __check_for_narrowing _LIBCPP_NODEBUG = - typename _If< -#ifdef _LIBCPP_ENABLE_NARROWING_CONVERSIONS_IN_VARIANT +using __check_for_narrowing _LIBCPP_NODEBUG = typename _If< +# ifdef _LIBCPP_ENABLE_NARROWING_CONVERSIONS_IN_VARIANT false && -#endif - is_arithmetic<_Dest>::value, +# endif + is_arithmetic<_Dest>::value, __narrowing_check, - __no_narrowing_check - >::template _Apply<_Dest, _Source>; + __no_narrowing_check >::template _Apply<_Dest, _Source>; template <class _Tp, size_t _Idx> struct __overload { @@ -1253,12 +1089,11 @@ struct __overload { }; // TODO(LLVM-19): Remove all occurrences of this macro. -#ifdef _LIBCPP_ENABLE_NARROWING_CONVERSIONS_IN_VARIANT +# ifdef _LIBCPP_ENABLE_NARROWING_CONVERSIONS_IN_VARIANT template <class _Tp, size_t> -struct __overload_bool { +struct __overload_bool { template <class _Up, class _Ap = __remove_cvref_t<_Up>> - auto operator()(bool, _Up&&) const - -> enable_if_t<is_same_v<_Ap, bool>, __type_identity<_Tp>>; + auto operator()(bool, _Up&&) const -> enable_if_t<is_same_v<_Ap, bool>, __type_identity<_Tp>>; }; template <size_t _Idx> @@ -1269,9 +1104,9 @@ 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> {}; -#endif +# endif -template <class ..._Bases> +template <class... _Bases> struct __all_overloads : _Bases... { void operator()() const; using _Bases::operator()...; @@ -1280,213 +1115,161 @@ struct __all_overloads : _Bases... { template <class _IdxSeq> struct __make_overloads_imp; -template <size_t ..._Idx> +template <size_t... _Idx> struct __make_overloads_imp<__tuple_indices<_Idx...> > { - template <class ..._Types> + template <class... _Types> using _Apply _LIBCPP_NODEBUG = __all_overloads<__overload<_Types, _Idx>...>; }; -template <class ..._Types> -using _MakeOverloads _LIBCPP_NODEBUG = typename __make_overloads_imp< - __make_indices_imp<sizeof...(_Types), 0> >::template _Apply<_Types...>; +template <class... _Types> +using _MakeOverloads _LIBCPP_NODEBUG = + 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<_MakeOverloads<_Types...>, _Tp, _Tp>::type; +using __best_match_t = typename invoke_result_t<_MakeOverloads<_Types...>, _Tp, _Tp>::type; } // namespace __variant_detail template <class... _Types> class _LIBCPP_TEMPLATE_VIS _LIBCPP_DECLSPEC_EMPTY_BASES variant - : private __sfinae_ctor_base< - __all<is_copy_constructible_v<_Types>...>::value, - __all<is_move_constructible_v<_Types>...>::value>, + : private __sfinae_ctor_base< __all<is_copy_constructible_v<_Types>...>::value, + __all<is_move_constructible_v<_Types>...>::value>, private __sfinae_assign_base< - __all<(is_copy_constructible_v<_Types> && - is_copy_assignable_v<_Types>)...>::value, - __all<(is_move_constructible_v<_Types> && - is_move_assignable_v<_Types>)...>::value> { - static_assert(0 < sizeof...(_Types), - "variant must consist of at least one alternative."); + __all<(is_copy_constructible_v<_Types> && is_copy_assignable_v<_Types>)...>::value, + __all<(is_move_constructible_v<_Types> && is_move_assignable_v<_Types>)...>::value> { + static_assert(0 < sizeof...(_Types), "variant must consist of at least one alternative."); - static_assert(__all<!is_array_v<_Types>...>::value, - "variant can not have an array type as an alternative."); + static_assert(__all<!is_array_v<_Types>...>::value, "variant can not have an array type as an alternative."); - static_assert(__all<!is_reference_v<_Types>...>::value, - "variant can not have a reference type as an alternative."); + static_assert(__all<!is_reference_v<_Types>...>::value, "variant can not have a reference type as an alternative."); - static_assert(__all<!is_void_v<_Types>...>::value, - "variant can not have a void type as an alternative."); + static_assert(__all<!is_void_v<_Types>...>::value, "variant can not have a void type as an alternative."); using __first_type = variant_alternative_t<0, variant>; public: - template <bool _Dummy = true, - enable_if_t<__dependent_type<is_default_constructible<__first_type>, - _Dummy>::value, - int> = 0> - _LIBCPP_HIDE_FROM_ABI - constexpr variant() noexcept(is_nothrow_default_constructible_v<__first_type>) + template <bool _Dummy = true, + enable_if_t<__dependent_type<is_default_constructible<__first_type>, _Dummy>::value, int> = 0> + _LIBCPP_HIDE_FROM_ABI constexpr variant() noexcept(is_nothrow_default_constructible_v<__first_type>) : __impl_(in_place_index<0>) {} _LIBCPP_HIDE_FROM_ABI constexpr variant(const variant&) = default; - _LIBCPP_HIDE_FROM_ABI constexpr variant(variant&&) = default; - - template < - class _Arg, - enable_if_t<!is_same_v<__remove_cvref_t<_Arg>, variant>, int> = 0, - enable_if_t<!__is_inplace_type<__remove_cvref_t<_Arg>>::value, int> = 0, - enable_if_t<!__is_inplace_index<__remove_cvref_t<_Arg>>::value, int> = 0, - class _Tp = __variant_detail::__best_match_t<_Arg, _Types...>, - size_t _Ip = - __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, - enable_if_t<is_constructible_v<_Tp, _Arg>, int> = 0> - _LIBCPP_HIDE_FROM_ABI - constexpr variant(_Arg&& __arg) noexcept( - is_nothrow_constructible_v<_Tp, _Arg>) + _LIBCPP_HIDE_FROM_ABI constexpr variant(variant&&) = default; + + template < class _Arg, + enable_if_t<!is_same_v<__remove_cvref_t<_Arg>, variant>, int> = 0, + enable_if_t<!__is_inplace_type<__remove_cvref_t<_Arg>>::value, int> = 0, + enable_if_t<!__is_inplace_index<__remove_cvref_t<_Arg>>::value, int> = 0, + class _Tp = __variant_detail::__best_match_t<_Arg, _Types...>, + size_t _Ip = __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, + enable_if_t<is_constructible_v<_Tp, _Arg>, int> = 0> + _LIBCPP_HIDE_FROM_ABI constexpr variant(_Arg&& __arg) noexcept(is_nothrow_constructible_v<_Tp, _Arg>) : __impl_(in_place_index<_Ip>, std::forward<_Arg>(__arg)) {} - template <size_t _Ip, class... _Args, - class = enable_if_t<(_Ip < sizeof...(_Types)), int>, - class _Tp = variant_alternative_t<_Ip, variant<_Types...>>, + template <size_t _Ip, + class... _Args, + class = enable_if_t<(_Ip < sizeof...(_Types)), int>, + class _Tp = variant_alternative_t<_Ip, variant<_Types...>>, enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0> - _LIBCPP_HIDE_FROM_ABI - explicit constexpr variant( - in_place_index_t<_Ip>, - _Args&&... __args) noexcept(is_nothrow_constructible_v<_Tp, _Args...>) + _LIBCPP_HIDE_FROM_ABI explicit constexpr variant(in_place_index_t<_Ip>, _Args&&... __args) noexcept( + is_nothrow_constructible_v<_Tp, _Args...>) : __impl_(in_place_index<_Ip>, std::forward<_Args>(__args)...) {} - template < - size_t _Ip, - class _Up, - class... _Args, - enable_if_t<(_Ip < sizeof...(_Types)), int> = 0, - class _Tp = variant_alternative_t<_Ip, variant<_Types...>>, - enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>, - int> = 0> - _LIBCPP_HIDE_FROM_ABI - explicit constexpr variant( + template < size_t _Ip, + class _Up, + class... _Args, + enable_if_t<(_Ip < sizeof...(_Types)), int> = 0, + class _Tp = variant_alternative_t<_Ip, variant<_Types...>>, + enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>, int> = 0> + _LIBCPP_HIDE_FROM_ABI explicit constexpr variant( in_place_index_t<_Ip>, initializer_list<_Up> __il, - _Args&&... __args) noexcept( - is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>) + _Args&&... __args) noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>) : __impl_(in_place_index<_Ip>, __il, std::forward<_Args>(__args)...) {} - template < - class _Tp, - class... _Args, - size_t _Ip = - __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, - enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0> - _LIBCPP_HIDE_FROM_ABI - explicit constexpr variant(in_place_type_t<_Tp>, _Args&&... __args) noexcept( + template < class _Tp, + class... _Args, + size_t _Ip = __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, + enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0> + _LIBCPP_HIDE_FROM_ABI explicit constexpr variant(in_place_type_t<_Tp>, _Args&&... __args) noexcept( is_nothrow_constructible_v<_Tp, _Args...>) : __impl_(in_place_index<_Ip>, std::forward<_Args>(__args)...) {} - template < - class _Tp, - class _Up, - class... _Args, - size_t _Ip = - __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, - enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>, - int> = 0> - _LIBCPP_HIDE_FROM_ABI - explicit constexpr variant( + template < class _Tp, + class _Up, + class... _Args, + size_t _Ip = __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, + enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>, int> = 0> + _LIBCPP_HIDE_FROM_ABI explicit constexpr variant( in_place_type_t<_Tp>, initializer_list<_Up> __il, - _Args&&... __args) noexcept( - is_nothrow_constructible_v<_Tp, initializer_list< _Up>&, _Args...>) + _Args&&... __args) noexcept(is_nothrow_constructible_v<_Tp, initializer_list< _Up>&, _Args...>) : __impl_(in_place_index<_Ip>, __il, std::forward<_Args>(__args)...) {} _LIBCPP_HIDE_FROM_ABI ~variant() = default; _LIBCPP_HIDE_FROM_ABI constexpr variant& operator=(const variant&) = default; - _LIBCPP_HIDE_FROM_ABI constexpr variant& operator=(variant&&) = default; - - template < - class _Arg, - enable_if_t<!is_same_v<__remove_cvref_t<_Arg>, variant>, int> = 0, - class _Tp = __variant_detail::__best_match_t<_Arg, _Types...>, - size_t _Ip = - __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, - enable_if_t<is_assignable_v<_Tp&, _Arg> && is_constructible_v<_Tp, _Arg>, - int> = 0> - _LIBCPP_HIDE_FROM_ABI - variant& operator=(_Arg&& __arg) noexcept( - is_nothrow_assignable_v<_Tp&, _Arg> && - is_nothrow_constructible_v<_Tp, _Arg>) { + _LIBCPP_HIDE_FROM_ABI constexpr variant& operator=(variant&&) = default; + + template < class _Arg, + enable_if_t<!is_same_v<__remove_cvref_t<_Arg>, variant>, int> = 0, + class _Tp = __variant_detail::__best_match_t<_Arg, _Types...>, + size_t _Ip = __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, + enable_if_t<is_assignable_v<_Tp&, _Arg> && is_constructible_v<_Tp, _Arg>, int> = 0> + _LIBCPP_HIDE_FROM_ABI variant& + operator=(_Arg&& __arg) noexcept(is_nothrow_assignable_v<_Tp&, _Arg> && is_nothrow_constructible_v<_Tp, _Arg>) { __impl_.template __assign<_Ip>(std::forward<_Arg>(__arg)); return *this; } - template < - size_t _Ip, - class... _Args, - enable_if_t<(_Ip < sizeof...(_Types)), int> = 0, - class _Tp = variant_alternative_t<_Ip, variant<_Types...>>, - enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0> - _LIBCPP_HIDE_FROM_ABI - _Tp& emplace(_Args&&... __args) { + template < size_t _Ip, + class... _Args, + enable_if_t<(_Ip < sizeof...(_Types)), int> = 0, + class _Tp = variant_alternative_t<_Ip, variant<_Types...>>, + enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0> + _LIBCPP_HIDE_FROM_ABI _Tp& emplace(_Args&&... __args) { return __impl_.template __emplace<_Ip>(std::forward<_Args>(__args)...); } - template < - size_t _Ip, - class _Up, - class... _Args, - enable_if_t<(_Ip < sizeof...(_Types)), int> = 0, - class _Tp = variant_alternative_t<_Ip, variant<_Types...>>, - enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>, - int> = 0> - _LIBCPP_HIDE_FROM_ABI - _Tp& emplace(initializer_list<_Up> __il, _Args&&... __args) { + template < size_t _Ip, + class _Up, + class... _Args, + enable_if_t<(_Ip < sizeof...(_Types)), int> = 0, + class _Tp = variant_alternative_t<_Ip, variant<_Types...>>, + enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>, int> = 0> + _LIBCPP_HIDE_FROM_ABI _Tp& emplace(initializer_list<_Up> __il, _Args&&... __args) { return __impl_.template __emplace<_Ip>(__il, std::forward<_Args>(__args)...); } - template < - class _Tp, - class... _Args, - size_t _Ip = - __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, - enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0> - _LIBCPP_HIDE_FROM_ABI - _Tp& emplace(_Args&&... __args) { + template < class _Tp, + class... _Args, + size_t _Ip = __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, + enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0> + _LIBCPP_HIDE_FROM_ABI _Tp& emplace(_Args&&... __args) { return __impl_.template __emplace<_Ip>(std::forward<_Args>(__args)...); } - template < - class _Tp, - class _Up, - class... _Args, - size_t _Ip = - __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, - enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>, - int> = 0> - _LIBCPP_HIDE_FROM_ABI - _Tp& emplace(initializer_list<_Up> __il, _Args&&... __args) { + template < class _Tp, + class _Up, + class... _Args, + size_t _Ip = __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::value, + enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>, int> = 0> + _LIBCPP_HIDE_FROM_ABI _Tp& emplace(initializer_list<_Up> __il, _Args&&... __args) { return __impl_.template __emplace<_Ip>(__il, std::forward<_Args>(__args)...); } - _LIBCPP_HIDE_FROM_ABI - constexpr bool valueless_by_exception() const noexcept { + _LIBCPP_HIDE_FROM_ABI constexpr bool valueless_by_exception() const noexcept { return __impl_.valueless_by_exception(); } - _LIBCPP_HIDE_FROM_ABI - constexpr size_t index() const noexcept { return __impl_.index(); } - - template < - bool _Dummy = true, - enable_if_t< - __all<( - __dependent_type<is_move_constructible<_Types>, _Dummy>::value && - __dependent_type<is_swappable<_Types>, _Dummy>::value)...>::value, - int> = 0> - _LIBCPP_HIDE_FROM_ABI - void swap(variant& __that) noexcept( - __all<(is_nothrow_move_constructible_v<_Types> && - is_nothrow_swappable_v<_Types>)...>::value) { + _LIBCPP_HIDE_FROM_ABI constexpr size_t index() const noexcept { return __impl_.index(); } + + template < bool _Dummy = true, + enable_if_t< __all<(__dependent_type<is_move_constructible<_Types>, _Dummy>::value && + __dependent_type<is_swappable<_Types>, _Dummy>::value)...>::value, + int> = 0> + _LIBCPP_HIDE_FROM_ABI void swap(variant& __that) noexcept( + __all<(is_nothrow_move_constructible_v<_Types> && is_nothrow_swappable_v<_Types>)...>::value) { __impl_.__swap(__that.__impl_); } @@ -1498,21 +1281,17 @@ private: }; template <size_t _Ip, class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr bool __holds_alternative(const variant<_Types...>& __v) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr bool __holds_alternative(const variant<_Types...>& __v) noexcept { return __v.index() == _Ip; } template <class _Tp, class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr bool holds_alternative(const variant<_Types...>& __v) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr bool holds_alternative(const variant<_Types...>& __v) noexcept { return std::__holds_alternative<__find_exactly_one_t<_Tp, _Types...>::value>(__v); } template <size_t _Ip, class _Vp> -_LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr auto&& __generic_get(_Vp&& __v) { +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr auto&& __generic_get(_Vp&& __v) { using __variant_detail::__access::__variant; if (!std::__holds_alternative<_Ip>(__v)) { __throw_bad_variant_access(); @@ -1522,9 +1301,8 @@ constexpr auto&& __generic_get(_Vp&& __v) { template <size_t _Ip, class... _Types> _LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr variant_alternative_t<_Ip, variant<_Types...>>& get( - variant<_Types...>& __v) { + _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr variant_alternative_t<_Ip, variant<_Types...>>& + get(variant<_Types...>& __v) { static_assert(_Ip < sizeof...(_Types)); static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>); return std::__generic_get<_Ip>(__v); @@ -1532,9 +1310,8 @@ constexpr variant_alternative_t<_Ip, variant<_Types...>>& get( template <size_t _Ip, class... _Types> _LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr variant_alternative_t<_Ip, variant<_Types...>>&& get( - variant<_Types...>&& __v) { + _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr variant_alternative_t<_Ip, variant<_Types...>>&& + get(variant<_Types...>&& __v) { static_assert(_Ip < sizeof...(_Types)); static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>); return std::__generic_get<_Ip>(std::move(__v)); @@ -1542,9 +1319,8 @@ constexpr variant_alternative_t<_Ip, variant<_Types...>>&& get( template <size_t _Ip, class... _Types> _LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr const variant_alternative_t<_Ip, variant<_Types...>>& get( - const variant<_Types...>& __v) { + _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr const variant_alternative_t<_Ip, variant<_Types...>>& + get(const variant<_Types...>& __v) { static_assert(_Ip < sizeof...(_Types)); static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>); return std::__generic_get<_Ip>(__v); @@ -1552,60 +1328,47 @@ constexpr const variant_alternative_t<_Ip, variant<_Types...>>& get( template <size_t _Ip, class... _Types> _LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr const variant_alternative_t<_Ip, variant<_Types...>>&& get( - const variant<_Types...>&& __v) { + _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr const variant_alternative_t<_Ip, variant<_Types...>>&& + get(const variant<_Types...>&& __v) { static_assert(_Ip < sizeof...(_Types)); static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>); return std::__generic_get<_Ip>(std::move(__v)); } template <class _Tp, class... _Types> -_LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr _Tp& get(variant<_Types...>& __v) { +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr _Tp& get(variant<_Types...>& __v) { static_assert(!is_void_v<_Tp>); return std::get<__find_exactly_one_t<_Tp, _Types...>::value>(__v); } template <class _Tp, class... _Types> -_LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr _Tp&& get(variant<_Types...>&& __v) { +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr _Tp&& get(variant<_Types...>&& __v) { static_assert(!is_void_v<_Tp>); - return std::get<__find_exactly_one_t<_Tp, _Types...>::value>( - std::move(__v)); + return std::get<__find_exactly_one_t<_Tp, _Types...>::value>(std::move(__v)); } template <class _Tp, class... _Types> -_LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr const _Tp& get(const variant<_Types...>& __v) { +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr const _Tp& +get(const variant<_Types...>& __v) { static_assert(!is_void_v<_Tp>); return std::get<__find_exactly_one_t<_Tp, _Types...>::value>(__v); } template <class _Tp, class... _Types> -_LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr const _Tp&& get(const variant<_Types...>&& __v) { +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr const _Tp&& +get(const variant<_Types...>&& __v) { static_assert(!is_void_v<_Tp>); - return std::get<__find_exactly_one_t<_Tp, _Types...>::value>( - std::move(__v)); + return std::get<__find_exactly_one_t<_Tp, _Types...>::value>(std::move(__v)); } template <size_t _Ip, class _Vp> -_LIBCPP_HIDE_FROM_ABI -constexpr auto* __generic_get_if(_Vp* __v) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr auto* __generic_get_if(_Vp* __v) noexcept { using __variant_detail::__access::__variant; - return __v && std::__holds_alternative<_Ip>(*__v) - ? std::addressof(__variant::__get_alt<_Ip>(*__v).__value) - : nullptr; + return __v && std::__holds_alternative<_Ip>(*__v) ? std::addressof(__variant::__get_alt<_Ip>(*__v).__value) : nullptr; } template <size_t _Ip, class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr add_pointer_t<variant_alternative_t<_Ip, variant<_Types...>>> +_LIBCPP_HIDE_FROM_ABI constexpr add_pointer_t<variant_alternative_t<_Ip, variant<_Types...>>> get_if(variant<_Types...>* __v) noexcept { static_assert(_Ip < sizeof...(_Types)); static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>); @@ -1613,8 +1376,7 @@ get_if(variant<_Types...>* __v) noexcept { } template <size_t _Ip, class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr add_pointer_t<const variant_alternative_t<_Ip, variant<_Types...>>> +_LIBCPP_HIDE_FROM_ABI constexpr add_pointer_t<const variant_alternative_t<_Ip, variant<_Types...>>> get_if(const variant<_Types...>* __v) noexcept { static_assert(_Ip < sizeof...(_Types)); static_assert(!is_void_v<variant_alternative_t<_Ip, variant<_Types...>>>); @@ -1622,17 +1384,13 @@ get_if(const variant<_Types...>* __v) noexcept { } template <class _Tp, class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr add_pointer_t<_Tp> -get_if(variant<_Types...>* __v) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr add_pointer_t<_Tp> get_if(variant<_Types...>* __v) noexcept { static_assert(!is_void_v<_Tp>); return std::get_if<__find_exactly_one_t<_Tp, _Types...>::value>(__v); } template <class _Tp, class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr add_pointer_t<const _Tp> -get_if(const variant<_Types...>* __v) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr add_pointer_t<const _Tp> get_if(const variant<_Types...>* __v) noexcept { static_assert(!is_void_v<_Tp>); return std::get_if<__find_exactly_one_t<_Tp, _Types...>::value>(__v); } @@ -1640,27 +1398,27 @@ get_if(const variant<_Types...>* __v) noexcept { template <class _Operator> struct __convert_to_bool { template <class _T1, class _T2> - _LIBCPP_HIDE_FROM_ABI - constexpr bool operator()(_T1 && __t1, _T2&& __t2) const { + _LIBCPP_HIDE_FROM_ABI constexpr bool operator()(_T1&& __t1, _T2&& __t2) const { static_assert(is_convertible<decltype(_Operator{}(std::forward<_T1>(__t1), std::forward<_T2>(__t2))), bool>::value, - "the relational operator does not return a type which is implicitly convertible to bool"); + "the relational operator does not return a type which is implicitly convertible to bool"); return _Operator{}(std::forward<_T1>(__t1), std::forward<_T2>(__t2)); } }; template <class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr bool operator==(const variant<_Types...>& __lhs, - const variant<_Types...>& __rhs) { +_LIBCPP_HIDE_FROM_ABI constexpr bool operator==(const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { using __variant_detail::__visitation::__variant; - if (__lhs.index() != __rhs.index()) return false; - if (__lhs.valueless_by_exception()) return true; + if (__lhs.index() != __rhs.index()) + return false; + if (__lhs.valueless_by_exception()) + return true; return __variant::__visit_value_at(__lhs.index(), __convert_to_bool<equal_to<>>{}, __lhs, __rhs); } # if _LIBCPP_STD_VER >= 20 -template <class... _Types> requires (three_way_comparable<_Types> && ...) +template <class... _Types> + requires(three_way_comparable<_Types> && ...) _LIBCPP_HIDE_FROM_ABI constexpr common_comparison_category_t<compare_three_way_result_t<_Types>...> operator<=>(const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { using __variant_detail::__visitation::__variant; @@ -1680,130 +1438,124 @@ operator<=>(const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { # endif // _LIBCPP_STD_VER >= 20 template <class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr bool operator!=(const variant<_Types...>& __lhs, - const variant<_Types...>& __rhs) { +_LIBCPP_HIDE_FROM_ABI constexpr bool operator!=(const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { using __variant_detail::__visitation::__variant; - if (__lhs.index() != __rhs.index()) return true; - if (__lhs.valueless_by_exception()) return false; - return __variant::__visit_value_at( - __lhs.index(), __convert_to_bool<not_equal_to<>>{}, __lhs, __rhs); + if (__lhs.index() != __rhs.index()) + return true; + if (__lhs.valueless_by_exception()) + return false; + return __variant::__visit_value_at(__lhs.index(), __convert_to_bool<not_equal_to<>>{}, __lhs, __rhs); } template <class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr bool operator<(const variant<_Types...>& __lhs, - const variant<_Types...>& __rhs) { +_LIBCPP_HIDE_FROM_ABI constexpr bool operator<(const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { using __variant_detail::__visitation::__variant; - if (__rhs.valueless_by_exception()) return false; - if (__lhs.valueless_by_exception()) return true; - if (__lhs.index() < __rhs.index()) return true; - if (__lhs.index() > __rhs.index()) return false; + if (__rhs.valueless_by_exception()) + return false; + if (__lhs.valueless_by_exception()) + return true; + if (__lhs.index() < __rhs.index()) + return true; + if (__lhs.index() > __rhs.index()) + return false; return __variant::__visit_value_at(__lhs.index(), __convert_to_bool<less<>>{}, __lhs, __rhs); } template <class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr bool operator>(const variant<_Types...>& __lhs, - const variant<_Types...>& __rhs) { +_LIBCPP_HIDE_FROM_ABI constexpr bool operator>(const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { using __variant_detail::__visitation::__variant; - if (__lhs.valueless_by_exception()) return false; - if (__rhs.valueless_by_exception()) return true; - if (__lhs.index() > __rhs.index()) return true; - if (__lhs.index() < __rhs.index()) return false; + if (__lhs.valueless_by_exception()) + return false; + if (__rhs.valueless_by_exception()) + return true; + if (__lhs.index() > __rhs.index()) + return true; + if (__lhs.index() < __rhs.index()) + return false; return __variant::__visit_value_at(__lhs.index(), __convert_to_bool<greater<>>{}, __lhs, __rhs); } template <class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr bool operator<=(const variant<_Types...>& __lhs, - const variant<_Types...>& __rhs) { +_LIBCPP_HIDE_FROM_ABI constexpr bool operator<=(const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { using __variant_detail::__visitation::__variant; - if (__lhs.valueless_by_exception()) return true; - if (__rhs.valueless_by_exception()) return false; - if (__lhs.index() < __rhs.index()) return true; - if (__lhs.index() > __rhs.index()) return false; - return __variant::__visit_value_at( - __lhs.index(), __convert_to_bool<less_equal<>>{}, __lhs, __rhs); + if (__lhs.valueless_by_exception()) + return true; + if (__rhs.valueless_by_exception()) + return false; + if (__lhs.index() < __rhs.index()) + return true; + if (__lhs.index() > __rhs.index()) + return false; + return __variant::__visit_value_at(__lhs.index(), __convert_to_bool<less_equal<>>{}, __lhs, __rhs); } template <class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr bool operator>=(const variant<_Types...>& __lhs, - const variant<_Types...>& __rhs) { +_LIBCPP_HIDE_FROM_ABI constexpr bool operator>=(const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { using __variant_detail::__visitation::__variant; - if (__rhs.valueless_by_exception()) return true; - if (__lhs.valueless_by_exception()) return false; - if (__lhs.index() > __rhs.index()) return true; - if (__lhs.index() < __rhs.index()) return false; - return __variant::__visit_value_at( - __lhs.index(), __convert_to_bool<greater_equal<>>{}, __lhs, __rhs); + if (__rhs.valueless_by_exception()) + return true; + if (__lhs.valueless_by_exception()) + return false; + if (__lhs.index() > __rhs.index()) + return true; + if (__lhs.index() < __rhs.index()) + return false; + return __variant::__visit_value_at(__lhs.index(), __convert_to_bool<greater_equal<>>{}, __lhs, __rhs); } template <class... _Vs> -_LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr void __throw_if_valueless(_Vs&&... __vs) { - const bool __valueless = - (... || std::__as_variant(__vs).valueless_by_exception()); +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr void __throw_if_valueless(_Vs&&... __vs) { + const bool __valueless = (... || std::__as_variant(__vs).valueless_by_exception()); if (__valueless) { __throw_bad_variant_access(); } } -template < - class _Visitor, class... _Vs, - typename = void_t<decltype(std::__as_variant(std::declval<_Vs>()))...> > -_LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr decltype(auto) visit(_Visitor&& __visitor, _Vs&&... __vs) { +template < class _Visitor, class... _Vs, typename = void_t<decltype(std::__as_variant(std::declval<_Vs>()))...> > +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr decltype(auto) +visit(_Visitor&& __visitor, _Vs&&... __vs) { using __variant_detail::__visitation::__variant; std::__throw_if_valueless(std::forward<_Vs>(__vs)...); - return __variant::__visit_value(std::forward<_Visitor>(__visitor), - std::forward<_Vs>(__vs)...); + return __variant::__visit_value(std::forward<_Visitor>(__visitor), std::forward<_Vs>(__vs)...); } -#if _LIBCPP_STD_VER >= 20 -template < - class _Rp, class _Visitor, class... _Vs, - typename = void_t<decltype(std::__as_variant(std::declval<_Vs>()))...> > -_LIBCPP_HIDE_FROM_ABI -_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -constexpr _Rp visit(_Visitor&& __visitor, _Vs&&... __vs) { +# if _LIBCPP_STD_VER >= 20 +template < class _Rp, + class _Visitor, + class... _Vs, + typename = void_t<decltype(std::__as_variant(std::declval<_Vs>()))...> > +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr _Rp +visit(_Visitor&& __visitor, _Vs&&... __vs) { using __variant_detail::__visitation::__variant; std::__throw_if_valueless(std::forward<_Vs>(__vs)...); - return __variant::__visit_value<_Rp>(std::forward<_Visitor>(__visitor), - std::forward<_Vs>(__vs)...); + return __variant::__visit_value<_Rp>(std::forward<_Visitor>(__visitor), std::forward<_Vs>(__vs)...); } -#endif +# endif template <class... _Types> -_LIBCPP_HIDE_FROM_ABI -auto swap(variant<_Types...>& __lhs, variant<_Types...>& __rhs) - noexcept(noexcept(__lhs.swap(__rhs))) - -> decltype( __lhs.swap(__rhs)) - { return __lhs.swap(__rhs); } +_LIBCPP_HIDE_FROM_ABI auto +swap(variant<_Types...>& __lhs, variant<_Types...>& __rhs) noexcept(noexcept(__lhs.swap(__rhs))) + -> decltype(__lhs.swap(__rhs)) { + return __lhs.swap(__rhs); +} template <class... _Types> -struct _LIBCPP_TEMPLATE_VIS hash< - __enable_hash_helper<variant<_Types...>, remove_const_t<_Types>...>> { +struct _LIBCPP_TEMPLATE_VIS hash< __enable_hash_helper<variant<_Types...>, remove_const_t<_Types>...>> { using argument_type = variant<_Types...>; - using result_type = size_t; + using result_type = size_t; - _LIBCPP_HIDE_FROM_ABI - result_type operator()(const argument_type& __v) const { + _LIBCPP_HIDE_FROM_ABI result_type operator()(const argument_type& __v) const { using __variant_detail::__visitation::__variant; size_t __res = __v.valueless_by_exception() - ? 299792458 // Random value chosen by the universe upon creation - : __variant::__visit_alt( - [](const auto& __alt) { - using __alt_type = __remove_cvref_t<decltype(__alt)>; - using __value_type = remove_const_t< - typename __alt_type::__value_type>; - return hash<__value_type>{}(__alt.__value); - }, - __v); + ? 299792458 // Random value chosen by the universe upon creation + : __variant::__visit_alt( + [](const auto& __alt) { + using __alt_type = __remove_cvref_t<decltype(__alt)>; + using __value_type = remove_const_t< typename __alt_type::__value_type>; + return hash<__value_type>{}(__alt.__value); + }, + __v); return std::__hash_combine(__res, hash<size_t>{}(__v.index())); } }; @@ -1812,21 +1564,18 @@ struct _LIBCPP_TEMPLATE_VIS hash< // type whereas std::get will throw or returning nullptr. This makes it faster than // std::get. template <size_t _Ip, class _Vp> -_LIBCPP_HIDE_FROM_ABI -constexpr auto&& __unchecked_get(_Vp&& __v) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr auto&& __unchecked_get(_Vp&& __v) noexcept { using __variant_detail::__access::__variant; return __variant::__get_alt<_Ip>(std::forward<_Vp>(__v)).__value; } template <class _Tp, class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr auto&& __unchecked_get(const variant<_Types...>& __v) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr auto&& __unchecked_get(const variant<_Types...>& __v) noexcept { return std::__unchecked_get<__find_exactly_one_t<_Tp, _Types...>::value>(__v); } template <class _Tp, class... _Types> -_LIBCPP_HIDE_FROM_ABI -constexpr auto&& __unchecked_get(variant<_Types...>& __v) noexcept { +_LIBCPP_HIDE_FROM_ABI constexpr auto&& __unchecked_get(variant<_Types...>& __v) noexcept { return std::__unchecked_get<__find_exactly_one_t<_Tp, _Types...>::value>(__v); } |