xref: /openbsd-src/gnu/llvm/libcxx/include/__utility/pair.h (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
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