176d0caaeSpatrick //===----------------------------------------------------------------------===// 276d0caaeSpatrick // 376d0caaeSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 476d0caaeSpatrick // See https://llvm.org/LICENSE.txt for license information. 576d0caaeSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 676d0caaeSpatrick // 776d0caaeSpatrick //===----------------------------------------------------------------------===// 876d0caaeSpatrick 976d0caaeSpatrick #ifndef _LIBCPP___UTILITY_PAIR_H 1076d0caaeSpatrick #define _LIBCPP___UTILITY_PAIR_H 1176d0caaeSpatrick 12*4bdff4beSrobert #include <__compare/common_comparison_category.h> 13*4bdff4beSrobert #include <__compare/synth_three_way.h> 1476d0caaeSpatrick #include <__config> 1576d0caaeSpatrick #include <__functional/unwrap_ref.h> 16*4bdff4beSrobert #include <__fwd/get.h> 17*4bdff4beSrobert #include <__fwd/tuple.h> 18*4bdff4beSrobert #include <__tuple_dir/sfinae_helpers.h> 19*4bdff4beSrobert #include <__tuple_dir/tuple_element.h> 20*4bdff4beSrobert #include <__tuple_dir/tuple_indices.h> 21*4bdff4beSrobert #include <__tuple_dir/tuple_size.h> 22*4bdff4beSrobert #include <__type_traits/common_reference.h> 23*4bdff4beSrobert #include <__type_traits/common_type.h> 24*4bdff4beSrobert #include <__type_traits/conditional.h> 25*4bdff4beSrobert #include <__type_traits/is_assignable.h> 26*4bdff4beSrobert #include <__type_traits/is_constructible.h> 27*4bdff4beSrobert #include <__type_traits/is_convertible.h> 28*4bdff4beSrobert #include <__type_traits/is_copy_assignable.h> 29*4bdff4beSrobert #include <__type_traits/is_default_constructible.h> 30*4bdff4beSrobert #include <__type_traits/is_implicitly_default_constructible.h> 31*4bdff4beSrobert #include <__type_traits/is_move_assignable.h> 32*4bdff4beSrobert #include <__type_traits/is_nothrow_assignable.h> 33*4bdff4beSrobert #include <__type_traits/is_nothrow_constructible.h> 34*4bdff4beSrobert #include <__type_traits/is_nothrow_copy_assignable.h> 35*4bdff4beSrobert #include <__type_traits/is_nothrow_copy_constructible.h> 36*4bdff4beSrobert #include <__type_traits/is_nothrow_default_constructible.h> 37*4bdff4beSrobert #include <__type_traits/is_nothrow_move_assignable.h> 38*4bdff4beSrobert #include <__type_traits/is_same.h> 39*4bdff4beSrobert #include <__type_traits/is_swappable.h> 40*4bdff4beSrobert #include <__type_traits/nat.h> 4176d0caaeSpatrick #include <__utility/forward.h> 4276d0caaeSpatrick #include <__utility/move.h> 4376d0caaeSpatrick #include <__utility/piecewise_construct.h> 4476d0caaeSpatrick #include <cstddef> 4576d0caaeSpatrick 4676d0caaeSpatrick #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 4776d0caaeSpatrick # pragma GCC system_header 4876d0caaeSpatrick #endif 4976d0caaeSpatrick 5076d0caaeSpatrick _LIBCPP_BEGIN_NAMESPACE_STD 5176d0caaeSpatrick 5276d0caaeSpatrick #if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR) 5376d0caaeSpatrick template <class, class> 5476d0caaeSpatrick struct __non_trivially_copyable_base { 5576d0caaeSpatrick _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY __non_trivially_copyable_base__non_trivially_copyable_base5676d0caaeSpatrick __non_trivially_copyable_base() _NOEXCEPT {} 57*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY __non_trivially_copyable_base__non_trivially_copyable_base5876d0caaeSpatrick __non_trivially_copyable_base(__non_trivially_copyable_base const&) _NOEXCEPT {} 5976d0caaeSpatrick }; 6076d0caaeSpatrick #endif 6176d0caaeSpatrick 6276d0caaeSpatrick template <class _T1, class _T2> 6376d0caaeSpatrick struct _LIBCPP_TEMPLATE_VIS pair 6476d0caaeSpatrick #if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR) 6576d0caaeSpatrick : private __non_trivially_copyable_base<_T1, _T2> 6676d0caaeSpatrick #endif 6776d0caaeSpatrick { 6876d0caaeSpatrick typedef _T1 first_type; 6976d0caaeSpatrick typedef _T2 second_type; 7076d0caaeSpatrick 7176d0caaeSpatrick _T1 first; 7276d0caaeSpatrick _T2 second; 7376d0caaeSpatrick 7476d0caaeSpatrick pair(pair const&) = default; 7576d0caaeSpatrick pair(pair&&) = default; 7676d0caaeSpatrick 7776d0caaeSpatrick #ifdef _LIBCPP_CXX03_LANG 7876d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY pairpair7976d0caaeSpatrick pair() : first(), second() {} 8076d0caaeSpatrick 8176d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY pairpair8276d0caaeSpatrick pair(_T1 const& __t1, _T2 const& __t2) : first(__t1), second(__t2) {} 8376d0caaeSpatrick 8476d0caaeSpatrick template <class _U1, class _U2> 8576d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY pairpair8676d0caaeSpatrick pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {} 8776d0caaeSpatrick 8876d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY 8976d0caaeSpatrick pair& operator=(pair const& __p) { 9076d0caaeSpatrick first = __p.first; 9176d0caaeSpatrick second = __p.second; 9276d0caaeSpatrick return *this; 9376d0caaeSpatrick } 9476d0caaeSpatrick #else 9576d0caaeSpatrick struct _CheckArgs { 9676d0caaeSpatrick template <int&...> __enable_explicit_defaultpair::_CheckArgs9776d0caaeSpatrick static constexpr bool __enable_explicit_default() { 9876d0caaeSpatrick return is_default_constructible<_T1>::value 9976d0caaeSpatrick && is_default_constructible<_T2>::value 10076d0caaeSpatrick && !__enable_implicit_default<>(); 10176d0caaeSpatrick } 10276d0caaeSpatrick 10376d0caaeSpatrick template <int&...> __enable_implicit_defaultpair::_CheckArgs10476d0caaeSpatrick static constexpr bool __enable_implicit_default() { 10576d0caaeSpatrick return __is_implicitly_default_constructible<_T1>::value 10676d0caaeSpatrick && __is_implicitly_default_constructible<_T2>::value; 10776d0caaeSpatrick } 10876d0caaeSpatrick 10976d0caaeSpatrick template <class _U1, class _U2> __is_pair_constructiblepair::_CheckArgs110*4bdff4beSrobert static constexpr bool __is_pair_constructible() { 11176d0caaeSpatrick return is_constructible<first_type, _U1>::value 112*4bdff4beSrobert && is_constructible<second_type, _U2>::value; 113*4bdff4beSrobert } 114*4bdff4beSrobert 115*4bdff4beSrobert template <class _U1, class _U2> __is_implicitpair::_CheckArgs116*4bdff4beSrobert static constexpr bool __is_implicit() { 117*4bdff4beSrobert return is_convertible<_U1, first_type>::value 118*4bdff4beSrobert && is_convertible<_U2, second_type>::value; 119*4bdff4beSrobert } 120*4bdff4beSrobert 121*4bdff4beSrobert template <class _U1, class _U2> __enable_explicitpair::_CheckArgs122*4bdff4beSrobert static constexpr bool __enable_explicit() { 123*4bdff4beSrobert return __is_pair_constructible<_U1, _U2>() && !__is_implicit<_U1, _U2>(); 12476d0caaeSpatrick } 12576d0caaeSpatrick 12676d0caaeSpatrick template <class _U1, class _U2> __enable_implicitpair::_CheckArgs12776d0caaeSpatrick static constexpr bool __enable_implicit() { 128*4bdff4beSrobert return __is_pair_constructible<_U1, _U2>() && __is_implicit<_U1, _U2>(); 12976d0caaeSpatrick } 13076d0caaeSpatrick }; 13176d0caaeSpatrick 13276d0caaeSpatrick template <bool _MaybeEnable> 133*4bdff4beSrobert using _CheckArgsDep _LIBCPP_NODEBUG = typename conditional< 13476d0caaeSpatrick _MaybeEnable, _CheckArgs, __check_tuple_constructor_fail>::type; 13576d0caaeSpatrick 13676d0caaeSpatrick struct _CheckTupleLikeConstructor { 13776d0caaeSpatrick template <class _Tuple> __enable_implicitpair::_CheckTupleLikeConstructor13876d0caaeSpatrick static constexpr bool __enable_implicit() { 13976d0caaeSpatrick return __tuple_convertible<_Tuple, pair>::value; 14076d0caaeSpatrick } 14176d0caaeSpatrick 14276d0caaeSpatrick template <class _Tuple> __enable_explicitpair::_CheckTupleLikeConstructor14376d0caaeSpatrick static constexpr bool __enable_explicit() { 14476d0caaeSpatrick return __tuple_constructible<_Tuple, pair>::value 14576d0caaeSpatrick && !__tuple_convertible<_Tuple, pair>::value; 14676d0caaeSpatrick } 14776d0caaeSpatrick 14876d0caaeSpatrick template <class _Tuple> __enable_assignpair::_CheckTupleLikeConstructor14976d0caaeSpatrick static constexpr bool __enable_assign() { 15076d0caaeSpatrick return __tuple_assignable<_Tuple, pair>::value; 15176d0caaeSpatrick } 15276d0caaeSpatrick }; 15376d0caaeSpatrick 15476d0caaeSpatrick template <class _Tuple> 155*4bdff4beSrobert using _CheckTLC _LIBCPP_NODEBUG = __conditional_t< 15676d0caaeSpatrick __tuple_like_with_size<_Tuple, 2>::value 15776d0caaeSpatrick && !is_same<typename decay<_Tuple>::type, pair>::value, 15876d0caaeSpatrick _CheckTupleLikeConstructor, 15976d0caaeSpatrick __check_tuple_constructor_fail 160*4bdff4beSrobert >; 16176d0caaeSpatrick 162*4bdff4beSrobert template<bool _Dummy = true, typename enable_if< 16376d0caaeSpatrick _CheckArgsDep<_Dummy>::__enable_explicit_default() 164*4bdff4beSrobert >::type* = nullptr> 16576d0caaeSpatrick explicit _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pairpair16676d0caaeSpatrick pair() _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value && 16776d0caaeSpatrick is_nothrow_default_constructible<second_type>::value) 16876d0caaeSpatrick : first(), second() {} 16976d0caaeSpatrick 170*4bdff4beSrobert template<bool _Dummy = true, typename enable_if< 17176d0caaeSpatrick _CheckArgsDep<_Dummy>::__enable_implicit_default() 172*4bdff4beSrobert >::type* = nullptr> 17376d0caaeSpatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pairpair17476d0caaeSpatrick pair() _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value && 17576d0caaeSpatrick is_nothrow_default_constructible<second_type>::value) 17676d0caaeSpatrick : first(), second() {} 17776d0caaeSpatrick 178*4bdff4beSrobert template <bool _Dummy = true, typename enable_if< 17976d0caaeSpatrick _CheckArgsDep<_Dummy>::template __enable_explicit<_T1 const&, _T2 const&>() 180*4bdff4beSrobert >::type* = nullptr> 181*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 pairpair18276d0caaeSpatrick explicit pair(_T1 const& __t1, _T2 const& __t2) 18376d0caaeSpatrick _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value && 18476d0caaeSpatrick is_nothrow_copy_constructible<second_type>::value) 18576d0caaeSpatrick : first(__t1), second(__t2) {} 18676d0caaeSpatrick 187*4bdff4beSrobert template<bool _Dummy = true, typename enable_if< 18876d0caaeSpatrick _CheckArgsDep<_Dummy>::template __enable_implicit<_T1 const&, _T2 const&>() 189*4bdff4beSrobert >::type* = nullptr> 190*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 pairpair19176d0caaeSpatrick pair(_T1 const& __t1, _T2 const& __t2) 19276d0caaeSpatrick _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value && 19376d0caaeSpatrick is_nothrow_copy_constructible<second_type>::value) 19476d0caaeSpatrick : first(__t1), second(__t2) {} 19576d0caaeSpatrick 196*4bdff4beSrobert template < 197*4bdff4beSrobert #if _LIBCPP_STD_VER > 20 // http://wg21.link/P1951 198*4bdff4beSrobert class _U1 = _T1, class _U2 = _T2, 199*4bdff4beSrobert #else 200*4bdff4beSrobert class _U1, class _U2, 201*4bdff4beSrobert #endif 202*4bdff4beSrobert typename enable_if<_CheckArgs::template __enable_explicit<_U1, _U2>()>::type* = nullptr 203*4bdff4beSrobert > 204*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 pairpair20576d0caaeSpatrick explicit pair(_U1&& __u1, _U2&& __u2) 20676d0caaeSpatrick _NOEXCEPT_((is_nothrow_constructible<first_type, _U1>::value && 20776d0caaeSpatrick is_nothrow_constructible<second_type, _U2>::value)) 20876d0caaeSpatrick : first(_VSTD::forward<_U1>(__u1)), second(_VSTD::forward<_U2>(__u2)) {} 20976d0caaeSpatrick 210*4bdff4beSrobert template < 211*4bdff4beSrobert #if _LIBCPP_STD_VER > 20 // http://wg21.link/P1951 212*4bdff4beSrobert class _U1 = _T1, class _U2 = _T2, 213*4bdff4beSrobert #else 214*4bdff4beSrobert class _U1, class _U2, 215*4bdff4beSrobert #endif 216*4bdff4beSrobert typename enable_if<_CheckArgs::template __enable_implicit<_U1, _U2>()>::type* = nullptr 217*4bdff4beSrobert > 218*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 pairpair21976d0caaeSpatrick pair(_U1&& __u1, _U2&& __u2) 22076d0caaeSpatrick _NOEXCEPT_((is_nothrow_constructible<first_type, _U1>::value && 22176d0caaeSpatrick is_nothrow_constructible<second_type, _U2>::value)) 22276d0caaeSpatrick : first(_VSTD::forward<_U1>(__u1)), second(_VSTD::forward<_U2>(__u2)) {} 22376d0caaeSpatrick 224*4bdff4beSrobert #if _LIBCPP_STD_VER > 20 225*4bdff4beSrobert template<class _U1, class _U2, __enable_if_t< 226*4bdff4beSrobert _CheckArgs::template __is_pair_constructible<_U1&, _U2&>() 227*4bdff4beSrobert >* = nullptr> 228*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr pairpair229*4bdff4beSrobert explicit(!_CheckArgs::template __is_implicit<_U1&, _U2&>()) pair(pair<_U1, _U2>& __p) 230*4bdff4beSrobert noexcept((is_nothrow_constructible<first_type, _U1&>::value && 231*4bdff4beSrobert is_nothrow_constructible<second_type, _U2&>::value)) 232*4bdff4beSrobert : first(__p.first), second(__p.second) {} 233*4bdff4beSrobert #endif 234*4bdff4beSrobert 235*4bdff4beSrobert template<class _U1, class _U2, typename enable_if< 23676d0caaeSpatrick _CheckArgs::template __enable_explicit<_U1 const&, _U2 const&>() 237*4bdff4beSrobert >::type* = nullptr> 238*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 pairpair23976d0caaeSpatrick explicit pair(pair<_U1, _U2> const& __p) 24076d0caaeSpatrick _NOEXCEPT_((is_nothrow_constructible<first_type, _U1 const&>::value && 24176d0caaeSpatrick is_nothrow_constructible<second_type, _U2 const&>::value)) 24276d0caaeSpatrick : first(__p.first), second(__p.second) {} 24376d0caaeSpatrick 244*4bdff4beSrobert template<class _U1, class _U2, typename enable_if< 24576d0caaeSpatrick _CheckArgs::template __enable_implicit<_U1 const&, _U2 const&>() 246*4bdff4beSrobert >::type* = nullptr> 247*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 pairpair24876d0caaeSpatrick pair(pair<_U1, _U2> const& __p) 24976d0caaeSpatrick _NOEXCEPT_((is_nothrow_constructible<first_type, _U1 const&>::value && 25076d0caaeSpatrick is_nothrow_constructible<second_type, _U2 const&>::value)) 25176d0caaeSpatrick : first(__p.first), second(__p.second) {} 25276d0caaeSpatrick 253*4bdff4beSrobert template<class _U1, class _U2, typename enable_if< 25476d0caaeSpatrick _CheckArgs::template __enable_explicit<_U1, _U2>() 255*4bdff4beSrobert >::type* = nullptr> 256*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 pairpair25776d0caaeSpatrick explicit pair(pair<_U1, _U2>&&__p) 25876d0caaeSpatrick _NOEXCEPT_((is_nothrow_constructible<first_type, _U1&&>::value && 25976d0caaeSpatrick is_nothrow_constructible<second_type, _U2&&>::value)) 26076d0caaeSpatrick : first(_VSTD::forward<_U1>(__p.first)), second(_VSTD::forward<_U2>(__p.second)) {} 26176d0caaeSpatrick 262*4bdff4beSrobert template<class _U1, class _U2, typename enable_if< 26376d0caaeSpatrick _CheckArgs::template __enable_implicit<_U1, _U2>() 264*4bdff4beSrobert >::type* = nullptr> 265*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 pairpair26676d0caaeSpatrick pair(pair<_U1, _U2>&& __p) 26776d0caaeSpatrick _NOEXCEPT_((is_nothrow_constructible<first_type, _U1&&>::value && 26876d0caaeSpatrick is_nothrow_constructible<second_type, _U2&&>::value)) 26976d0caaeSpatrick : first(_VSTD::forward<_U1>(__p.first)), second(_VSTD::forward<_U2>(__p.second)) {} 27076d0caaeSpatrick 271*4bdff4beSrobert #if _LIBCPP_STD_VER > 20 272*4bdff4beSrobert template<class _U1, class _U2, __enable_if_t< 273*4bdff4beSrobert _CheckArgs::template __is_pair_constructible<const _U1&&, const _U2&&>() 274*4bdff4beSrobert >* = nullptr> 275*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 276*4bdff4beSrobert explicit(!_CheckArgs::template __is_implicit<const _U1&&, const _U2&&>()) pairpair277*4bdff4beSrobert pair(const pair<_U1, _U2>&& __p) 278*4bdff4beSrobert noexcept(is_nothrow_constructible<first_type, const _U1&&>::value && 279*4bdff4beSrobert is_nothrow_constructible<second_type, const _U2&&>::value) 280*4bdff4beSrobert : first(std::move(__p.first)), second(std::move(__p.second)) {} 281*4bdff4beSrobert #endif 282*4bdff4beSrobert 283*4bdff4beSrobert template<class _Tuple, typename enable_if< 28476d0caaeSpatrick _CheckTLC<_Tuple>::template __enable_explicit<_Tuple>() 285*4bdff4beSrobert >::type* = nullptr> 286*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 pairpair28776d0caaeSpatrick explicit pair(_Tuple&& __p) 28876d0caaeSpatrick : first(_VSTD::get<0>(_VSTD::forward<_Tuple>(__p))), 28976d0caaeSpatrick second(_VSTD::get<1>(_VSTD::forward<_Tuple>(__p))) {} 29076d0caaeSpatrick 291*4bdff4beSrobert template<class _Tuple, typename enable_if< 29276d0caaeSpatrick _CheckTLC<_Tuple>::template __enable_implicit<_Tuple>() 293*4bdff4beSrobert >::type* = nullptr> 294*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 pairpair29576d0caaeSpatrick pair(_Tuple&& __p) 29676d0caaeSpatrick : first(_VSTD::get<0>(_VSTD::forward<_Tuple>(__p))), 29776d0caaeSpatrick second(_VSTD::get<1>(_VSTD::forward<_Tuple>(__p))) {} 29876d0caaeSpatrick 29976d0caaeSpatrick template <class... _Args1, class... _Args2> 300*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 pairpair30176d0caaeSpatrick pair(piecewise_construct_t __pc, 30276d0caaeSpatrick tuple<_Args1...> __first_args, tuple<_Args2...> __second_args) 30376d0caaeSpatrick _NOEXCEPT_((is_nothrow_constructible<first_type, _Args1...>::value && 30476d0caaeSpatrick is_nothrow_constructible<second_type, _Args2...>::value)) 30576d0caaeSpatrick : pair(__pc, __first_args, __second_args, 30676d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Args1)>::type(), 30776d0caaeSpatrick typename __make_tuple_indices<sizeof...(_Args2) >::type()) {} 30876d0caaeSpatrick 309*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 310*4bdff4beSrobert pair& operator=(__conditional_t< 31176d0caaeSpatrick is_copy_assignable<first_type>::value && 31276d0caaeSpatrick is_copy_assignable<second_type>::value, 313*4bdff4beSrobert pair, __nat> const& __p) _NOEXCEPT_pair31476d0caaeSpatrick _NOEXCEPT_(is_nothrow_copy_assignable<first_type>::value && 31576d0caaeSpatrick is_nothrow_copy_assignable<second_type>::value) 31676d0caaeSpatrick { 31776d0caaeSpatrick first = __p.first; 31876d0caaeSpatrick second = __p.second; 31976d0caaeSpatrick return *this; 32076d0caaeSpatrick } 32176d0caaeSpatrick 322*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 323*4bdff4beSrobert pair& operator=(__conditional_t< 32476d0caaeSpatrick is_move_assignable<first_type>::value && 32576d0caaeSpatrick is_move_assignable<second_type>::value, 326*4bdff4beSrobert pair, __nat>&& __p) _NOEXCEPT_pair32776d0caaeSpatrick _NOEXCEPT_(is_nothrow_move_assignable<first_type>::value && 32876d0caaeSpatrick is_nothrow_move_assignable<second_type>::value) 32976d0caaeSpatrick { 33076d0caaeSpatrick first = _VSTD::forward<first_type>(__p.first); 33176d0caaeSpatrick second = _VSTD::forward<second_type>(__p.second); 33276d0caaeSpatrick return *this; 33376d0caaeSpatrick } 33476d0caaeSpatrick 335*4bdff4beSrobert #if _LIBCPP_STD_VER > 20 336*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 337*4bdff4beSrobert const pair& operator=(pair const& __p) const noexceptpair338*4bdff4beSrobert noexcept(is_nothrow_copy_assignable_v<const first_type> && 339*4bdff4beSrobert is_nothrow_copy_assignable_v<const second_type>) 340*4bdff4beSrobert requires(is_copy_assignable_v<const first_type> && 341*4bdff4beSrobert is_copy_assignable_v<const second_type>) { 342*4bdff4beSrobert first = __p.first; 343*4bdff4beSrobert second = __p.second; 344*4bdff4beSrobert return *this; 345*4bdff4beSrobert } 346*4bdff4beSrobert 347*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 348*4bdff4beSrobert const pair& operator=(pair&& __p) const noexceptpair349*4bdff4beSrobert noexcept(is_nothrow_assignable_v<const first_type&, first_type> && 350*4bdff4beSrobert is_nothrow_assignable_v<const second_type&, second_type>) 351*4bdff4beSrobert requires(is_assignable_v<const first_type&, first_type> && 352*4bdff4beSrobert is_assignable_v<const second_type&, second_type>) { 353*4bdff4beSrobert first = std::forward<first_type>(__p.first); 354*4bdff4beSrobert second = std::forward<second_type>(__p.second); 355*4bdff4beSrobert return *this; 356*4bdff4beSrobert } 357*4bdff4beSrobert 358*4bdff4beSrobert template<class _U1, class _U2> 359*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 360*4bdff4beSrobert const pair& operator=(const pair<_U1, _U2>& __p) const requirespair361*4bdff4beSrobert requires(is_assignable_v<const first_type&, const _U1&> && 362*4bdff4beSrobert is_assignable_v<const second_type&, const _U2&>) { 363*4bdff4beSrobert first = __p.first; 364*4bdff4beSrobert second = __p.second; 365*4bdff4beSrobert return *this; 366*4bdff4beSrobert } 367*4bdff4beSrobert 368*4bdff4beSrobert template<class _U1, class _U2> 369*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 370*4bdff4beSrobert const pair& operator=(pair<_U1, _U2>&& __p) const requirespair371*4bdff4beSrobert requires(is_assignable_v<const first_type&, _U1> && 372*4bdff4beSrobert is_assignable_v<const second_type&, _U2>) { 373*4bdff4beSrobert first = std::forward<_U1>(__p.first); 374*4bdff4beSrobert second = std::forward<_U2>(__p.second); 375*4bdff4beSrobert return *this; 376*4bdff4beSrobert } 377*4bdff4beSrobert #endif // _LIBCPP_STD_VER > 20 378*4bdff4beSrobert 379*4bdff4beSrobert template <class _Tuple, typename enable_if< 38076d0caaeSpatrick _CheckTLC<_Tuple>::template __enable_assign<_Tuple>() 381*4bdff4beSrobert >::type* = nullptr> 382*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 38376d0caaeSpatrick pair& operator=(_Tuple&& __p) { 38476d0caaeSpatrick first = _VSTD::get<0>(_VSTD::forward<_Tuple>(__p)); 38576d0caaeSpatrick second = _VSTD::get<1>(_VSTD::forward<_Tuple>(__p)); 38676d0caaeSpatrick return *this; 38776d0caaeSpatrick } 38876d0caaeSpatrick #endif 38976d0caaeSpatrick 390*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 39176d0caaeSpatrick void swappair39276d0caaeSpatrick swap(pair& __p) _NOEXCEPT_(__is_nothrow_swappable<first_type>::value && 39376d0caaeSpatrick __is_nothrow_swappable<second_type>::value) 39476d0caaeSpatrick { 39576d0caaeSpatrick using _VSTD::swap; 39676d0caaeSpatrick swap(first, __p.first); 39776d0caaeSpatrick swap(second, __p.second); 39876d0caaeSpatrick } 399*4bdff4beSrobert 400*4bdff4beSrobert #if _LIBCPP_STD_VER > 20 401*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr swappair402*4bdff4beSrobert void swap(const pair& __p) const 403*4bdff4beSrobert noexcept(__is_nothrow_swappable<const first_type>::value && 404*4bdff4beSrobert __is_nothrow_swappable<const second_type>::value) 405*4bdff4beSrobert { 406*4bdff4beSrobert using std::swap; 407*4bdff4beSrobert swap(first, __p.first); 408*4bdff4beSrobert swap(second, __p.second); 409*4bdff4beSrobert } 410*4bdff4beSrobert #endif 41176d0caaeSpatrick private: 41276d0caaeSpatrick 41376d0caaeSpatrick #ifndef _LIBCPP_CXX03_LANG 41476d0caaeSpatrick template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 415*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 41676d0caaeSpatrick pair(piecewise_construct_t, 41776d0caaeSpatrick tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 41876d0caaeSpatrick __tuple_indices<_I1...>, __tuple_indices<_I2...>); 41976d0caaeSpatrick #endif 42076d0caaeSpatrick }; 42176d0caaeSpatrick 422*4bdff4beSrobert #if _LIBCPP_STD_VER > 14 42376d0caaeSpatrick template<class _T1, class _T2> 42476d0caaeSpatrick pair(_T1, _T2) -> pair<_T1, _T2>; 425*4bdff4beSrobert #endif 426*4bdff4beSrobert 427*4bdff4beSrobert // [pairs.spec], specialized algorithms 42876d0caaeSpatrick 42976d0caaeSpatrick template <class _T1, class _T2> 430*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 43176d0caaeSpatrick bool 43276d0caaeSpatrick operator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 43376d0caaeSpatrick { 43476d0caaeSpatrick return __x.first == __y.first && __x.second == __y.second; 43576d0caaeSpatrick } 43676d0caaeSpatrick 437*4bdff4beSrobert #if _LIBCPP_STD_VER > 17 438*4bdff4beSrobert 43976d0caaeSpatrick template <class _T1, class _T2> 440*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 441*4bdff4beSrobert common_comparison_category_t< 442*4bdff4beSrobert __synth_three_way_result<_T1>, 443*4bdff4beSrobert __synth_three_way_result<_T2> > 444*4bdff4beSrobert operator<=>(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 445*4bdff4beSrobert { 446*4bdff4beSrobert if (auto __c = _VSTD::__synth_three_way(__x.first, __y.first); __c != 0) { 447*4bdff4beSrobert return __c; 448*4bdff4beSrobert } 449*4bdff4beSrobert return _VSTD::__synth_three_way(__x.second, __y.second); 450*4bdff4beSrobert } 451*4bdff4beSrobert 452*4bdff4beSrobert #else // _LIBCPP_STD_VER > 17 453*4bdff4beSrobert 454*4bdff4beSrobert template <class _T1, class _T2> 455*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 45676d0caaeSpatrick bool 45776d0caaeSpatrick operator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 45876d0caaeSpatrick { 45976d0caaeSpatrick return !(__x == __y); 46076d0caaeSpatrick } 46176d0caaeSpatrick 46276d0caaeSpatrick template <class _T1, class _T2> 463*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 46476d0caaeSpatrick bool 46576d0caaeSpatrick operator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 46676d0caaeSpatrick { 46776d0caaeSpatrick return __x.first < __y.first || (!(__y.first < __x.first) && __x.second < __y.second); 46876d0caaeSpatrick } 46976d0caaeSpatrick 47076d0caaeSpatrick template <class _T1, class _T2> 471*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 47276d0caaeSpatrick bool 47376d0caaeSpatrick operator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 47476d0caaeSpatrick { 47576d0caaeSpatrick return __y < __x; 47676d0caaeSpatrick } 47776d0caaeSpatrick 47876d0caaeSpatrick template <class _T1, class _T2> 479*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 48076d0caaeSpatrick bool 48176d0caaeSpatrick operator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 48276d0caaeSpatrick { 48376d0caaeSpatrick return !(__x < __y); 48476d0caaeSpatrick } 48576d0caaeSpatrick 48676d0caaeSpatrick template <class _T1, class _T2> 487*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 48876d0caaeSpatrick bool 48976d0caaeSpatrick operator<=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 49076d0caaeSpatrick { 49176d0caaeSpatrick return !(__y < __x); 49276d0caaeSpatrick } 49376d0caaeSpatrick 494*4bdff4beSrobert #endif // _LIBCPP_STD_VER > 17 495*4bdff4beSrobert 496*4bdff4beSrobert #if _LIBCPP_STD_VER > 20 497*4bdff4beSrobert template <class _T1, class _T2, class _U1, class _U2, template<class> class _TQual, template<class> class _UQual> 498*4bdff4beSrobert requires requires { typename pair<common_reference_t<_TQual<_T1>, _UQual<_U1>>, 499*4bdff4beSrobert common_reference_t<_TQual<_T2>, _UQual<_U2>>>; } 500*4bdff4beSrobert struct basic_common_reference<pair<_T1, _T2>, pair<_U1, _U2>, _TQual, _UQual> { 501*4bdff4beSrobert using type = pair<common_reference_t<_TQual<_T1>, _UQual<_U1>>, 502*4bdff4beSrobert common_reference_t<_TQual<_T2>, _UQual<_U2>>>; 503*4bdff4beSrobert }; 504*4bdff4beSrobert 505*4bdff4beSrobert template <class _T1, class _T2, class _U1, class _U2> 506*4bdff4beSrobert requires requires { typename pair<common_type_t<_T1, _U1>, common_type_t<_T2, _U2>>; } 507*4bdff4beSrobert struct common_type<pair<_T1, _T2>, pair<_U1, _U2>> { 508*4bdff4beSrobert using type = pair<common_type_t<_T1, _U1>, common_type_t<_T2, _U2>>; 509*4bdff4beSrobert }; 510*4bdff4beSrobert #endif // _LIBCPP_STD_VER > 20 511*4bdff4beSrobert 51276d0caaeSpatrick template <class _T1, class _T2> 513*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 51476d0caaeSpatrick typename enable_if 51576d0caaeSpatrick < 51676d0caaeSpatrick __is_swappable<_T1>::value && 51776d0caaeSpatrick __is_swappable<_T2>::value, 51876d0caaeSpatrick void 51976d0caaeSpatrick >::type 52076d0caaeSpatrick swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) 52176d0caaeSpatrick _NOEXCEPT_((__is_nothrow_swappable<_T1>::value && 52276d0caaeSpatrick __is_nothrow_swappable<_T2>::value)) 52376d0caaeSpatrick { 52476d0caaeSpatrick __x.swap(__y); 52576d0caaeSpatrick } 52676d0caaeSpatrick 527*4bdff4beSrobert #if _LIBCPP_STD_VER > 20 528*4bdff4beSrobert template <class _T1, class _T2> 529*4bdff4beSrobert requires (__is_swappable<const _T1>::value && 530*4bdff4beSrobert __is_swappable<const _T2>::value) 531*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr 532*4bdff4beSrobert void swap(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) 533*4bdff4beSrobert noexcept(noexcept(__x.swap(__y))) 534*4bdff4beSrobert { 535*4bdff4beSrobert __x.swap(__y); 536*4bdff4beSrobert } 537*4bdff4beSrobert #endif 53876d0caaeSpatrick 53976d0caaeSpatrick template <class _T1, class _T2> 540*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 54176d0caaeSpatrick pair<typename __unwrap_ref_decay<_T1>::type, typename __unwrap_ref_decay<_T2>::type> 54276d0caaeSpatrick make_pair(_T1&& __t1, _T2&& __t2) 54376d0caaeSpatrick { 54476d0caaeSpatrick return pair<typename __unwrap_ref_decay<_T1>::type, typename __unwrap_ref_decay<_T2>::type> 54576d0caaeSpatrick (_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2)); 54676d0caaeSpatrick } 54776d0caaeSpatrick 54876d0caaeSpatrick template <class _T1, class _T2> 54976d0caaeSpatrick struct _LIBCPP_TEMPLATE_VIS tuple_size<pair<_T1, _T2> > 55076d0caaeSpatrick : public integral_constant<size_t, 2> {}; 55176d0caaeSpatrick 55276d0caaeSpatrick template <size_t _Ip, class _T1, class _T2> 55376d0caaeSpatrick struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, pair<_T1, _T2> > 55476d0caaeSpatrick { 55576d0caaeSpatrick static_assert(_Ip < 2, "Index out of bounds in std::tuple_element<std::pair<T1, T2>>"); 55676d0caaeSpatrick }; 55776d0caaeSpatrick 55876d0caaeSpatrick template <class _T1, class _T2> 55976d0caaeSpatrick struct _LIBCPP_TEMPLATE_VIS tuple_element<0, pair<_T1, _T2> > 56076d0caaeSpatrick { 561*4bdff4beSrobert typedef _LIBCPP_NODEBUG _T1 type; 56276d0caaeSpatrick }; 56376d0caaeSpatrick 56476d0caaeSpatrick template <class _T1, class _T2> 56576d0caaeSpatrick struct _LIBCPP_TEMPLATE_VIS tuple_element<1, pair<_T1, _T2> > 56676d0caaeSpatrick { 567*4bdff4beSrobert typedef _LIBCPP_NODEBUG _T2 type; 56876d0caaeSpatrick }; 56976d0caaeSpatrick 57076d0caaeSpatrick template <size_t _Ip> struct __get_pair; 57176d0caaeSpatrick 57276d0caaeSpatrick template <> 57376d0caaeSpatrick struct __get_pair<0> 57476d0caaeSpatrick { 57576d0caaeSpatrick template <class _T1, class _T2> 57676d0caaeSpatrick static 577*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 57876d0caaeSpatrick _T1& 57976d0caaeSpatrick get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 58076d0caaeSpatrick 58176d0caaeSpatrick template <class _T1, class _T2> 58276d0caaeSpatrick static 583*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 58476d0caaeSpatrick const _T1& 58576d0caaeSpatrick get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 58676d0caaeSpatrick 58776d0caaeSpatrick template <class _T1, class _T2> 58876d0caaeSpatrick static 589*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 59076d0caaeSpatrick _T1&& 59176d0caaeSpatrick get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);} 59276d0caaeSpatrick 59376d0caaeSpatrick template <class _T1, class _T2> 59476d0caaeSpatrick static 595*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 59676d0caaeSpatrick const _T1&& 59776d0caaeSpatrick get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T1>(__p.first);} 59876d0caaeSpatrick }; 59976d0caaeSpatrick 60076d0caaeSpatrick template <> 60176d0caaeSpatrick struct __get_pair<1> 60276d0caaeSpatrick { 60376d0caaeSpatrick template <class _T1, class _T2> 60476d0caaeSpatrick static 605*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 60676d0caaeSpatrick _T2& 60776d0caaeSpatrick get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 60876d0caaeSpatrick 60976d0caaeSpatrick template <class _T1, class _T2> 61076d0caaeSpatrick static 611*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 61276d0caaeSpatrick const _T2& 61376d0caaeSpatrick get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 61476d0caaeSpatrick 61576d0caaeSpatrick template <class _T1, class _T2> 61676d0caaeSpatrick static 617*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 61876d0caaeSpatrick _T2&& 61976d0caaeSpatrick get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T2>(__p.second);} 62076d0caaeSpatrick 62176d0caaeSpatrick template <class _T1, class _T2> 62276d0caaeSpatrick static 623*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 62476d0caaeSpatrick const _T2&& 62576d0caaeSpatrick get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T2>(__p.second);} 62676d0caaeSpatrick }; 62776d0caaeSpatrick 62876d0caaeSpatrick template <size_t _Ip, class _T1, class _T2> 629*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 63076d0caaeSpatrick typename tuple_element<_Ip, pair<_T1, _T2> >::type& 63176d0caaeSpatrick get(pair<_T1, _T2>& __p) _NOEXCEPT 63276d0caaeSpatrick { 63376d0caaeSpatrick return __get_pair<_Ip>::get(__p); 63476d0caaeSpatrick } 63576d0caaeSpatrick 63676d0caaeSpatrick template <size_t _Ip, class _T1, class _T2> 637*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 63876d0caaeSpatrick const typename tuple_element<_Ip, pair<_T1, _T2> >::type& 63976d0caaeSpatrick get(const pair<_T1, _T2>& __p) _NOEXCEPT 64076d0caaeSpatrick { 64176d0caaeSpatrick return __get_pair<_Ip>::get(__p); 64276d0caaeSpatrick } 64376d0caaeSpatrick 64476d0caaeSpatrick template <size_t _Ip, class _T1, class _T2> 645*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 64676d0caaeSpatrick typename tuple_element<_Ip, pair<_T1, _T2> >::type&& 64776d0caaeSpatrick get(pair<_T1, _T2>&& __p) _NOEXCEPT 64876d0caaeSpatrick { 64976d0caaeSpatrick return __get_pair<_Ip>::get(_VSTD::move(__p)); 65076d0caaeSpatrick } 65176d0caaeSpatrick 65276d0caaeSpatrick template <size_t _Ip, class _T1, class _T2> 653*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 65476d0caaeSpatrick const typename tuple_element<_Ip, pair<_T1, _T2> >::type&& 65576d0caaeSpatrick get(const pair<_T1, _T2>&& __p) _NOEXCEPT 65676d0caaeSpatrick { 65776d0caaeSpatrick return __get_pair<_Ip>::get(_VSTD::move(__p)); 65876d0caaeSpatrick } 65976d0caaeSpatrick 66076d0caaeSpatrick #if _LIBCPP_STD_VER > 11 66176d0caaeSpatrick template <class _T1, class _T2> 66276d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 66376d0caaeSpatrick constexpr _T1 & get(pair<_T1, _T2>& __p) _NOEXCEPT 66476d0caaeSpatrick { 66576d0caaeSpatrick return __get_pair<0>::get(__p); 66676d0caaeSpatrick } 66776d0caaeSpatrick 66876d0caaeSpatrick template <class _T1, class _T2> 66976d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 67076d0caaeSpatrick constexpr _T1 const & get(pair<_T1, _T2> const& __p) _NOEXCEPT 67176d0caaeSpatrick { 67276d0caaeSpatrick return __get_pair<0>::get(__p); 67376d0caaeSpatrick } 67476d0caaeSpatrick 67576d0caaeSpatrick template <class _T1, class _T2> 67676d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 67776d0caaeSpatrick constexpr _T1 && get(pair<_T1, _T2>&& __p) _NOEXCEPT 67876d0caaeSpatrick { 67976d0caaeSpatrick return __get_pair<0>::get(_VSTD::move(__p)); 68076d0caaeSpatrick } 68176d0caaeSpatrick 68276d0caaeSpatrick template <class _T1, class _T2> 68376d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 68476d0caaeSpatrick constexpr _T1 const && get(pair<_T1, _T2> const&& __p) _NOEXCEPT 68576d0caaeSpatrick { 68676d0caaeSpatrick return __get_pair<0>::get(_VSTD::move(__p)); 68776d0caaeSpatrick } 68876d0caaeSpatrick 68976d0caaeSpatrick template <class _T1, class _T2> 69076d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 69176d0caaeSpatrick constexpr _T1 & get(pair<_T2, _T1>& __p) _NOEXCEPT 69276d0caaeSpatrick { 69376d0caaeSpatrick return __get_pair<1>::get(__p); 69476d0caaeSpatrick } 69576d0caaeSpatrick 69676d0caaeSpatrick template <class _T1, class _T2> 69776d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 69876d0caaeSpatrick constexpr _T1 const & get(pair<_T2, _T1> const& __p) _NOEXCEPT 69976d0caaeSpatrick { 70076d0caaeSpatrick return __get_pair<1>::get(__p); 70176d0caaeSpatrick } 70276d0caaeSpatrick 70376d0caaeSpatrick template <class _T1, class _T2> 70476d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 70576d0caaeSpatrick constexpr _T1 && get(pair<_T2, _T1>&& __p) _NOEXCEPT 70676d0caaeSpatrick { 70776d0caaeSpatrick return __get_pair<1>::get(_VSTD::move(__p)); 70876d0caaeSpatrick } 70976d0caaeSpatrick 71076d0caaeSpatrick template <class _T1, class _T2> 71176d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 71276d0caaeSpatrick constexpr _T1 const && get(pair<_T2, _T1> const&& __p) _NOEXCEPT 71376d0caaeSpatrick { 71476d0caaeSpatrick return __get_pair<1>::get(_VSTD::move(__p)); 71576d0caaeSpatrick } 71676d0caaeSpatrick 717*4bdff4beSrobert #endif // _LIBCPP_STD_VER > 11 71876d0caaeSpatrick 71976d0caaeSpatrick _LIBCPP_END_NAMESPACE_STD 72076d0caaeSpatrick 72176d0caaeSpatrick #endif // _LIBCPP___UTILITY_PAIR_H 722