1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef _LIBCPP___UTILITY_PAIR_H 10 #define _LIBCPP___UTILITY_PAIR_H 11 12 #include <__config> 13 #include <__functional/unwrap_ref.h> 14 #include <__tuple> 15 #include <__utility/forward.h> 16 #include <__utility/move.h> 17 #include <__utility/piecewise_construct.h> 18 #include <cstddef> 19 #include <type_traits> 20 21 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 22 #pragma GCC system_header 23 #endif 24 25 _LIBCPP_PUSH_MACROS 26 #include <__undef_macros> 27 28 _LIBCPP_BEGIN_NAMESPACE_STD 29 30 31 #if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR) 32 template <class, class> 33 struct __non_trivially_copyable_base { 34 _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 35 __non_trivially_copyable_base() _NOEXCEPT {} 36 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 37 __non_trivially_copyable_base(__non_trivially_copyable_base const&) _NOEXCEPT {} 38 }; 39 #endif 40 41 template <class _T1, class _T2> 42 struct _LIBCPP_TEMPLATE_VIS pair 43 #if defined(_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR) 44 : private __non_trivially_copyable_base<_T1, _T2> 45 #endif 46 { 47 typedef _T1 first_type; 48 typedef _T2 second_type; 49 50 _T1 first; 51 _T2 second; 52 53 #if !defined(_LIBCPP_CXX03_LANG) 54 pair(pair const&) = default; 55 pair(pair&&) = default; 56 #else 57 // Use the implicitly declared copy constructor in C++03 58 #endif 59 60 #ifdef _LIBCPP_CXX03_LANG 61 _LIBCPP_INLINE_VISIBILITY 62 pair() : first(), second() {} 63 64 _LIBCPP_INLINE_VISIBILITY 65 pair(_T1 const& __t1, _T2 const& __t2) : first(__t1), second(__t2) {} 66 67 template <class _U1, class _U2> 68 _LIBCPP_INLINE_VISIBILITY 69 pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {} 70 71 _LIBCPP_INLINE_VISIBILITY 72 pair& operator=(pair const& __p) { 73 first = __p.first; 74 second = __p.second; 75 return *this; 76 } 77 #else 78 template <bool _Val> 79 using _EnableB _LIBCPP_NODEBUG_TYPE = typename enable_if<_Val, bool>::type; 80 81 struct _CheckArgs { 82 template <int&...> 83 static constexpr bool __enable_explicit_default() { 84 return is_default_constructible<_T1>::value 85 && is_default_constructible<_T2>::value 86 && !__enable_implicit_default<>(); 87 } 88 89 template <int&...> 90 static constexpr bool __enable_implicit_default() { 91 return __is_implicitly_default_constructible<_T1>::value 92 && __is_implicitly_default_constructible<_T2>::value; 93 } 94 95 template <class _U1, class _U2> 96 static constexpr bool __enable_explicit() { 97 return is_constructible<first_type, _U1>::value 98 && is_constructible<second_type, _U2>::value 99 && (!is_convertible<_U1, first_type>::value 100 || !is_convertible<_U2, second_type>::value); 101 } 102 103 template <class _U1, class _U2> 104 static constexpr bool __enable_implicit() { 105 return is_constructible<first_type, _U1>::value 106 && is_constructible<second_type, _U2>::value 107 && is_convertible<_U1, first_type>::value 108 && is_convertible<_U2, second_type>::value; 109 } 110 }; 111 112 template <bool _MaybeEnable> 113 using _CheckArgsDep _LIBCPP_NODEBUG_TYPE = typename conditional< 114 _MaybeEnable, _CheckArgs, __check_tuple_constructor_fail>::type; 115 116 struct _CheckTupleLikeConstructor { 117 template <class _Tuple> 118 static constexpr bool __enable_implicit() { 119 return __tuple_convertible<_Tuple, pair>::value; 120 } 121 122 template <class _Tuple> 123 static constexpr bool __enable_explicit() { 124 return __tuple_constructible<_Tuple, pair>::value 125 && !__tuple_convertible<_Tuple, pair>::value; 126 } 127 128 template <class _Tuple> 129 static constexpr bool __enable_assign() { 130 return __tuple_assignable<_Tuple, pair>::value; 131 } 132 }; 133 134 template <class _Tuple> 135 using _CheckTLC _LIBCPP_NODEBUG_TYPE = typename conditional< 136 __tuple_like_with_size<_Tuple, 2>::value 137 && !is_same<typename decay<_Tuple>::type, pair>::value, 138 _CheckTupleLikeConstructor, 139 __check_tuple_constructor_fail 140 >::type; 141 142 template<bool _Dummy = true, _EnableB< 143 _CheckArgsDep<_Dummy>::__enable_explicit_default() 144 > = false> 145 explicit _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 146 pair() _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value && 147 is_nothrow_default_constructible<second_type>::value) 148 : first(), second() {} 149 150 template<bool _Dummy = true, _EnableB< 151 _CheckArgsDep<_Dummy>::__enable_implicit_default() 152 > = false> 153 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 154 pair() _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value && 155 is_nothrow_default_constructible<second_type>::value) 156 : first(), second() {} 157 158 template <bool _Dummy = true, _EnableB< 159 _CheckArgsDep<_Dummy>::template __enable_explicit<_T1 const&, _T2 const&>() 160 > = false> 161 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 162 explicit pair(_T1 const& __t1, _T2 const& __t2) 163 _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value && 164 is_nothrow_copy_constructible<second_type>::value) 165 : first(__t1), second(__t2) {} 166 167 template<bool _Dummy = true, _EnableB< 168 _CheckArgsDep<_Dummy>::template __enable_implicit<_T1 const&, _T2 const&>() 169 > = false> 170 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 171 pair(_T1 const& __t1, _T2 const& __t2) 172 _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value && 173 is_nothrow_copy_constructible<second_type>::value) 174 : first(__t1), second(__t2) {} 175 176 template<class _U1, class _U2, _EnableB< 177 _CheckArgs::template __enable_explicit<_U1, _U2>() 178 > = false> 179 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 180 explicit pair(_U1&& __u1, _U2&& __u2) 181 _NOEXCEPT_((is_nothrow_constructible<first_type, _U1>::value && 182 is_nothrow_constructible<second_type, _U2>::value)) 183 : first(_VSTD::forward<_U1>(__u1)), second(_VSTD::forward<_U2>(__u2)) {} 184 185 template<class _U1, class _U2, _EnableB< 186 _CheckArgs::template __enable_implicit<_U1, _U2>() 187 > = false> 188 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 189 pair(_U1&& __u1, _U2&& __u2) 190 _NOEXCEPT_((is_nothrow_constructible<first_type, _U1>::value && 191 is_nothrow_constructible<second_type, _U2>::value)) 192 : first(_VSTD::forward<_U1>(__u1)), second(_VSTD::forward<_U2>(__u2)) {} 193 194 template<class _U1, class _U2, _EnableB< 195 _CheckArgs::template __enable_explicit<_U1 const&, _U2 const&>() 196 > = false> 197 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 198 explicit pair(pair<_U1, _U2> const& __p) 199 _NOEXCEPT_((is_nothrow_constructible<first_type, _U1 const&>::value && 200 is_nothrow_constructible<second_type, _U2 const&>::value)) 201 : first(__p.first), second(__p.second) {} 202 203 template<class _U1, class _U2, _EnableB< 204 _CheckArgs::template __enable_implicit<_U1 const&, _U2 const&>() 205 > = false> 206 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 207 pair(pair<_U1, _U2> const& __p) 208 _NOEXCEPT_((is_nothrow_constructible<first_type, _U1 const&>::value && 209 is_nothrow_constructible<second_type, _U2 const&>::value)) 210 : first(__p.first), second(__p.second) {} 211 212 template<class _U1, class _U2, _EnableB< 213 _CheckArgs::template __enable_explicit<_U1, _U2>() 214 > = false> 215 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 216 explicit pair(pair<_U1, _U2>&&__p) 217 _NOEXCEPT_((is_nothrow_constructible<first_type, _U1&&>::value && 218 is_nothrow_constructible<second_type, _U2&&>::value)) 219 : first(_VSTD::forward<_U1>(__p.first)), second(_VSTD::forward<_U2>(__p.second)) {} 220 221 template<class _U1, class _U2, _EnableB< 222 _CheckArgs::template __enable_implicit<_U1, _U2>() 223 > = false> 224 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 225 pair(pair<_U1, _U2>&& __p) 226 _NOEXCEPT_((is_nothrow_constructible<first_type, _U1&&>::value && 227 is_nothrow_constructible<second_type, _U2&&>::value)) 228 : first(_VSTD::forward<_U1>(__p.first)), second(_VSTD::forward<_U2>(__p.second)) {} 229 230 template<class _Tuple, _EnableB< 231 _CheckTLC<_Tuple>::template __enable_explicit<_Tuple>() 232 > = false> 233 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 234 explicit pair(_Tuple&& __p) 235 : first(_VSTD::get<0>(_VSTD::forward<_Tuple>(__p))), 236 second(_VSTD::get<1>(_VSTD::forward<_Tuple>(__p))) {} 237 238 template<class _Tuple, _EnableB< 239 _CheckTLC<_Tuple>::template __enable_implicit<_Tuple>() 240 > = false> 241 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 242 pair(_Tuple&& __p) 243 : first(_VSTD::get<0>(_VSTD::forward<_Tuple>(__p))), 244 second(_VSTD::get<1>(_VSTD::forward<_Tuple>(__p))) {} 245 246 template <class... _Args1, class... _Args2> 247 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 248 pair(piecewise_construct_t __pc, 249 tuple<_Args1...> __first_args, tuple<_Args2...> __second_args) 250 _NOEXCEPT_((is_nothrow_constructible<first_type, _Args1...>::value && 251 is_nothrow_constructible<second_type, _Args2...>::value)) 252 : pair(__pc, __first_args, __second_args, 253 typename __make_tuple_indices<sizeof...(_Args1)>::type(), 254 typename __make_tuple_indices<sizeof...(_Args2) >::type()) {} 255 256 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 257 pair& operator=(typename conditional< 258 is_copy_assignable<first_type>::value && 259 is_copy_assignable<second_type>::value, 260 pair, __nat>::type const& __p) 261 _NOEXCEPT_(is_nothrow_copy_assignable<first_type>::value && 262 is_nothrow_copy_assignable<second_type>::value) 263 { 264 first = __p.first; 265 second = __p.second; 266 return *this; 267 } 268 269 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 270 pair& operator=(typename conditional< 271 is_move_assignable<first_type>::value && 272 is_move_assignable<second_type>::value, 273 pair, __nat>::type&& __p) 274 _NOEXCEPT_(is_nothrow_move_assignable<first_type>::value && 275 is_nothrow_move_assignable<second_type>::value) 276 { 277 first = _VSTD::forward<first_type>(__p.first); 278 second = _VSTD::forward<second_type>(__p.second); 279 return *this; 280 } 281 282 template <class _Tuple, _EnableB< 283 _CheckTLC<_Tuple>::template __enable_assign<_Tuple>() 284 > = false> 285 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 286 pair& operator=(_Tuple&& __p) { 287 first = _VSTD::get<0>(_VSTD::forward<_Tuple>(__p)); 288 second = _VSTD::get<1>(_VSTD::forward<_Tuple>(__p)); 289 return *this; 290 } 291 #endif 292 293 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 294 void 295 swap(pair& __p) _NOEXCEPT_(__is_nothrow_swappable<first_type>::value && 296 __is_nothrow_swappable<second_type>::value) 297 { 298 using _VSTD::swap; 299 swap(first, __p.first); 300 swap(second, __p.second); 301 } 302 private: 303 304 #ifndef _LIBCPP_CXX03_LANG 305 template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 306 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 307 pair(piecewise_construct_t, 308 tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 309 __tuple_indices<_I1...>, __tuple_indices<_I2...>); 310 #endif 311 }; 312 313 #ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 314 template<class _T1, class _T2> 315 pair(_T1, _T2) -> pair<_T1, _T2>; 316 #endif // _LIBCPP_HAS_NO_DEDUCTION_GUIDES 317 318 template <class _T1, class _T2> 319 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 320 bool 321 operator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 322 { 323 return __x.first == __y.first && __x.second == __y.second; 324 } 325 326 template <class _T1, class _T2> 327 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 328 bool 329 operator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 330 { 331 return !(__x == __y); 332 } 333 334 template <class _T1, class _T2> 335 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 336 bool 337 operator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 338 { 339 return __x.first < __y.first || (!(__y.first < __x.first) && __x.second < __y.second); 340 } 341 342 template <class _T1, class _T2> 343 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 344 bool 345 operator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 346 { 347 return __y < __x; 348 } 349 350 template <class _T1, class _T2> 351 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 352 bool 353 operator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 354 { 355 return !(__x < __y); 356 } 357 358 template <class _T1, class _T2> 359 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 360 bool 361 operator<=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 362 { 363 return !(__y < __x); 364 } 365 366 template <class _T1, class _T2> 367 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 368 typename enable_if 369 < 370 __is_swappable<_T1>::value && 371 __is_swappable<_T2>::value, 372 void 373 >::type 374 swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) 375 _NOEXCEPT_((__is_nothrow_swappable<_T1>::value && 376 __is_nothrow_swappable<_T2>::value)) 377 { 378 __x.swap(__y); 379 } 380 381 #ifndef _LIBCPP_CXX03_LANG 382 383 template <class _T1, class _T2> 384 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 385 pair<typename __unwrap_ref_decay<_T1>::type, typename __unwrap_ref_decay<_T2>::type> 386 make_pair(_T1&& __t1, _T2&& __t2) 387 { 388 return pair<typename __unwrap_ref_decay<_T1>::type, typename __unwrap_ref_decay<_T2>::type> 389 (_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2)); 390 } 391 392 #else // _LIBCPP_CXX03_LANG 393 394 template <class _T1, class _T2> 395 inline _LIBCPP_INLINE_VISIBILITY 396 pair<_T1,_T2> 397 make_pair(_T1 __x, _T2 __y) 398 { 399 return pair<_T1, _T2>(__x, __y); 400 } 401 402 #endif // _LIBCPP_CXX03_LANG 403 404 template <class _T1, class _T2> 405 struct _LIBCPP_TEMPLATE_VIS tuple_size<pair<_T1, _T2> > 406 : public integral_constant<size_t, 2> {}; 407 408 template <size_t _Ip, class _T1, class _T2> 409 struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, pair<_T1, _T2> > 410 { 411 static_assert(_Ip < 2, "Index out of bounds in std::tuple_element<std::pair<T1, T2>>"); 412 }; 413 414 template <class _T1, class _T2> 415 struct _LIBCPP_TEMPLATE_VIS tuple_element<0, pair<_T1, _T2> > 416 { 417 typedef _LIBCPP_NODEBUG_TYPE _T1 type; 418 }; 419 420 template <class _T1, class _T2> 421 struct _LIBCPP_TEMPLATE_VIS tuple_element<1, pair<_T1, _T2> > 422 { 423 typedef _LIBCPP_NODEBUG_TYPE _T2 type; 424 }; 425 426 template <size_t _Ip> struct __get_pair; 427 428 template <> 429 struct __get_pair<0> 430 { 431 template <class _T1, class _T2> 432 static 433 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 434 _T1& 435 get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 436 437 template <class _T1, class _T2> 438 static 439 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 440 const _T1& 441 get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 442 443 #ifndef _LIBCPP_CXX03_LANG 444 template <class _T1, class _T2> 445 static 446 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 447 _T1&& 448 get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);} 449 450 template <class _T1, class _T2> 451 static 452 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 453 const _T1&& 454 get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T1>(__p.first);} 455 #endif // _LIBCPP_CXX03_LANG 456 }; 457 458 template <> 459 struct __get_pair<1> 460 { 461 template <class _T1, class _T2> 462 static 463 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 464 _T2& 465 get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 466 467 template <class _T1, class _T2> 468 static 469 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 470 const _T2& 471 get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 472 473 #ifndef _LIBCPP_CXX03_LANG 474 template <class _T1, class _T2> 475 static 476 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 477 _T2&& 478 get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T2>(__p.second);} 479 480 template <class _T1, class _T2> 481 static 482 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 483 const _T2&& 484 get(const pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<const _T2>(__p.second);} 485 #endif // _LIBCPP_CXX03_LANG 486 }; 487 488 template <size_t _Ip, class _T1, class _T2> 489 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 490 typename tuple_element<_Ip, pair<_T1, _T2> >::type& 491 get(pair<_T1, _T2>& __p) _NOEXCEPT 492 { 493 return __get_pair<_Ip>::get(__p); 494 } 495 496 template <size_t _Ip, class _T1, class _T2> 497 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 498 const typename tuple_element<_Ip, pair<_T1, _T2> >::type& 499 get(const pair<_T1, _T2>& __p) _NOEXCEPT 500 { 501 return __get_pair<_Ip>::get(__p); 502 } 503 504 #ifndef _LIBCPP_CXX03_LANG 505 template <size_t _Ip, class _T1, class _T2> 506 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 507 typename tuple_element<_Ip, pair<_T1, _T2> >::type&& 508 get(pair<_T1, _T2>&& __p) _NOEXCEPT 509 { 510 return __get_pair<_Ip>::get(_VSTD::move(__p)); 511 } 512 513 template <size_t _Ip, class _T1, class _T2> 514 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 515 const typename tuple_element<_Ip, pair<_T1, _T2> >::type&& 516 get(const pair<_T1, _T2>&& __p) _NOEXCEPT 517 { 518 return __get_pair<_Ip>::get(_VSTD::move(__p)); 519 } 520 #endif // _LIBCPP_CXX03_LANG 521 522 #if _LIBCPP_STD_VER > 11 523 template <class _T1, class _T2> 524 inline _LIBCPP_INLINE_VISIBILITY 525 constexpr _T1 & get(pair<_T1, _T2>& __p) _NOEXCEPT 526 { 527 return __get_pair<0>::get(__p); 528 } 529 530 template <class _T1, class _T2> 531 inline _LIBCPP_INLINE_VISIBILITY 532 constexpr _T1 const & get(pair<_T1, _T2> const& __p) _NOEXCEPT 533 { 534 return __get_pair<0>::get(__p); 535 } 536 537 template <class _T1, class _T2> 538 inline _LIBCPP_INLINE_VISIBILITY 539 constexpr _T1 && get(pair<_T1, _T2>&& __p) _NOEXCEPT 540 { 541 return __get_pair<0>::get(_VSTD::move(__p)); 542 } 543 544 template <class _T1, class _T2> 545 inline _LIBCPP_INLINE_VISIBILITY 546 constexpr _T1 const && get(pair<_T1, _T2> const&& __p) _NOEXCEPT 547 { 548 return __get_pair<0>::get(_VSTD::move(__p)); 549 } 550 551 template <class _T1, class _T2> 552 inline _LIBCPP_INLINE_VISIBILITY 553 constexpr _T1 & get(pair<_T2, _T1>& __p) _NOEXCEPT 554 { 555 return __get_pair<1>::get(__p); 556 } 557 558 template <class _T1, class _T2> 559 inline _LIBCPP_INLINE_VISIBILITY 560 constexpr _T1 const & get(pair<_T2, _T1> const& __p) _NOEXCEPT 561 { 562 return __get_pair<1>::get(__p); 563 } 564 565 template <class _T1, class _T2> 566 inline _LIBCPP_INLINE_VISIBILITY 567 constexpr _T1 && get(pair<_T2, _T1>&& __p) _NOEXCEPT 568 { 569 return __get_pair<1>::get(_VSTD::move(__p)); 570 } 571 572 template <class _T1, class _T2> 573 inline _LIBCPP_INLINE_VISIBILITY 574 constexpr _T1 const && get(pair<_T2, _T1> const&& __p) _NOEXCEPT 575 { 576 return __get_pair<1>::get(_VSTD::move(__p)); 577 } 578 579 #endif 580 581 _LIBCPP_END_NAMESPACE_STD 582 583 _LIBCPP_POP_MACROS 584 585 #endif // _LIBCPP___UTILITY_PAIR_H 586