utility revision 278724
1227825Stheraven// -*- C++ -*- 2227825Stheraven//===-------------------------- utility -----------------------------------===// 3227825Stheraven// 4227825Stheraven// The LLVM Compiler Infrastructure 5227825Stheraven// 6227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open 7227825Stheraven// Source Licenses. See LICENSE.TXT for details. 8227825Stheraven// 9227825Stheraven//===----------------------------------------------------------------------===// 10227825Stheraven 11227825Stheraven#ifndef _LIBCPP_UTILITY 12227825Stheraven#define _LIBCPP_UTILITY 13227825Stheraven 14227825Stheraven/* 15227825Stheraven utility synopsis 16227825Stheraven 17227825Stheravennamespace std 18227825Stheraven{ 19227825Stheraven 20227825Stheraventemplate <class T> 21227825Stheraven void 22227825Stheraven swap(T& a, T& b); 23227825Stheraven 24227825Stheravennamespace rel_ops 25227825Stheraven{ 26227825Stheraven template<class T> bool operator!=(const T&, const T&); 27227825Stheraven template<class T> bool operator> (const T&, const T&); 28227825Stheraven template<class T> bool operator<=(const T&, const T&); 29227825Stheraven template<class T> bool operator>=(const T&, const T&); 30227825Stheraven} 31227825Stheraven 32227825Stheraventemplate<class T> 33227825Stheravenvoid 34227825Stheravenswap(T& a, T& b) noexcept(is_nothrow_move_constructible<T>::value && 35227825Stheraven is_nothrow_move_assignable<T>::value); 36227825Stheraven 37227825Stheraventemplate <class T, size_t N> 38227825Stheravenvoid 39227825Stheravenswap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b))); 40227825Stheraven 41262801Sdimtemplate <class T> T&& forward(typename remove_reference<T>::type& t) noexcept; // constexpr in C++14 42262801Sdimtemplate <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept; // constexpr in C++14 43227825Stheraven 44262801Sdimtemplate <class T> typename remove_reference<T>::type&& move(T&&) noexcept; // constexpr in C++14 45227825Stheraven 46227825Stheraventemplate <class T> 47227825Stheraven typename conditional 48227825Stheraven < 49227825Stheraven !is_nothrow_move_constructible<T>::value && is_copy_constructible<T>::value, 50227825Stheraven const T&, 51227825Stheraven T&& 52227825Stheraven >::type 53262801Sdim move_if_noexcept(T& x) noexcept; // constexpr in C++14 54227825Stheraven 55227825Stheraventemplate <class T> typename add_rvalue_reference<T>::type declval() noexcept; 56227825Stheraven 57227825Stheraventemplate <class T1, class T2> 58227825Stheravenstruct pair 59227825Stheraven{ 60227825Stheraven typedef T1 first_type; 61227825Stheraven typedef T2 second_type; 62227825Stheraven 63227825Stheraven T1 first; 64227825Stheraven T2 second; 65227825Stheraven 66227825Stheraven pair(const pair&) = default; 67227825Stheraven pair(pair&&) = default; 68227825Stheraven constexpr pair(); 69262801Sdim pair(const T1& x, const T2& y); // constexpr in C++14 70262801Sdim template <class U, class V> pair(U&& x, V&& y); // constexpr in C++14 71262801Sdim template <class U, class V> pair(const pair<U, V>& p); // constexpr in C++14 72262801Sdim template <class U, class V> pair(pair<U, V>&& p); // constexpr in C++14 73227825Stheraven template <class... Args1, class... Args2> 74227825Stheraven pair(piecewise_construct_t, tuple<Args1...> first_args, 75227825Stheraven tuple<Args2...> second_args); 76227825Stheraven 77227825Stheraven template <class U, class V> pair& operator=(const pair<U, V>& p); 78227825Stheraven pair& operator=(pair&& p) noexcept(is_nothrow_move_assignable<T1>::value && 79227825Stheraven is_nothrow_move_assignable<T2>::value); 80227825Stheraven template <class U, class V> pair& operator=(pair<U, V>&& p); 81227825Stheraven 82227825Stheraven void swap(pair& p) noexcept(noexcept(swap(first, p.first)) && 83227825Stheraven noexcept(swap(second, p.second))); 84227825Stheraven}; 85227825Stheraven 86262801Sdimtemplate <class T1, class T2> bool operator==(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 87262801Sdimtemplate <class T1, class T2> bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 88262801Sdimtemplate <class T1, class T2> bool operator< (const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 89262801Sdimtemplate <class T1, class T2> bool operator> (const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 90262801Sdimtemplate <class T1, class T2> bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 91262801Sdimtemplate <class T1, class T2> bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 92227825Stheraven 93262801Sdimtemplate <class T1, class T2> pair<V1, V2> make_pair(T1&&, T2&&); // constexpr in C++14 94227825Stheraventemplate <class T1, class T2> 95227825Stheravenvoid 96227825Stheravenswap(pair<T1, T2>& x, pair<T1, T2>& y) noexcept(noexcept(x.swap(y))); 97227825Stheraven 98227825Stheravenstruct piecewise_construct_t { }; 99227825Stheravenconstexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); 100227825Stheraven 101227825Stheraventemplate <class T> class tuple_size; 102227825Stheraventemplate <size_t I, class T> class tuple_element; 103227825Stheraven 104278724Sdimtemplate <class T1, class T2> struct tuple_size<pair<T1, T2> >; 105278724Sdimtemplate <class T1, class T2> struct tuple_element<0, pair<T1, T2> >; 106278724Sdimtemplate <class T1, class T2> struct tuple_element<1, pair<T1, T2> >; 107227825Stheraven 108227825Stheraventemplate<size_t I, class T1, class T2> 109278724Sdim typename tuple_element<I, pair<T1, T2> >::type& 110278724Sdim get(pair<T1, T2>&) noexcept; // constexpr in C++14 111227825Stheraven 112227825Stheraventemplate<size_t I, class T1, class T2> 113278724Sdim const typename const tuple_element<I, pair<T1, T2> >::type& 114278724Sdim get(const pair<T1, T2>&) noexcept; // constexpr in C++14 115227825Stheraven 116227825Stheraventemplate<size_t I, class T1, class T2> 117278724Sdim typename tuple_element<I, pair<T1, T2> >::type&& 118278724Sdim get(pair<T1, T2>&&) noexcept; // constexpr in C++14 119227825Stheraven 120262801Sdimtemplate<class T1, class T2> 121278724Sdim constexpr T1& get(pair<T1, T2>&) noexcept; // C++14 122262801Sdim 123262801Sdimtemplate<size_t I, class T1, class T2> 124278724Sdim constexpr T1 const& get(pair<T1, T2> const &) noexcept; // C++14 125262801Sdim 126262801Sdimtemplate<size_t I, class T1, class T2> 127278724Sdim constexpr T1&& get(pair<T1, T2>&&) noexcept; // C++14 128262801Sdim 129253159Stheraven// C++14 130253159Stheraven 131253159Stheraventemplate<class T, T... I> 132253159Stheravenstruct integer_sequence 133253159Stheraven{ 134253159Stheraven typedef T value_type; 135253159Stheraven 136253159Stheraven static constexpr size_t size() noexcept; 137253159Stheraven}; 138253159Stheraven 139253159Stheraventemplate<size_t... I> 140253159Stheraven using index_sequence = integer_sequence<size_t, I...>; 141253159Stheraven 142253159Stheraventemplate<class T, T N> 143253159Stheraven using make_integer_sequence = integer_sequence<T, 0, 1, ..., N-1>; 144253159Stheraventemplate<size_t N> 145253159Stheraven using make_index_sequence = make_integer_sequence<size_t, N>; 146253159Stheraven 147253159Stheraventemplate<class... T> 148253159Stheraven using index_sequence_for = make_index_sequence<sizeof...(T)>; 149253159Stheraven 150262801Sdimtemplate<class T, class U=T> 151262801Sdim T exchange(T& obj, U&& new_value); 152227825Stheraven} // std 153227825Stheraven 154227825Stheraven*/ 155227825Stheraven 156227825Stheraven#include <__config> 157227825Stheraven#include <__tuple> 158227825Stheraven#include <type_traits> 159227825Stheraven 160227825Stheraven#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 161227825Stheraven#pragma GCC system_header 162227825Stheraven#endif 163227825Stheraven 164227825Stheraven_LIBCPP_BEGIN_NAMESPACE_STD 165227825Stheraven 166227825Stheravennamespace rel_ops 167227825Stheraven{ 168227825Stheraven 169227825Stheraventemplate<class _Tp> 170227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 171227825Stheravenbool 172227825Stheravenoperator!=(const _Tp& __x, const _Tp& __y) 173227825Stheraven{ 174227825Stheraven return !(__x == __y); 175227825Stheraven} 176227825Stheraven 177227825Stheraventemplate<class _Tp> 178227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 179227825Stheravenbool 180227825Stheravenoperator> (const _Tp& __x, const _Tp& __y) 181227825Stheraven{ 182227825Stheraven return __y < __x; 183227825Stheraven} 184227825Stheraven 185227825Stheraventemplate<class _Tp> 186227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 187227825Stheravenbool 188227825Stheravenoperator<=(const _Tp& __x, const _Tp& __y) 189227825Stheraven{ 190227825Stheraven return !(__y < __x); 191227825Stheraven} 192227825Stheraven 193227825Stheraventemplate<class _Tp> 194227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 195227825Stheravenbool 196227825Stheravenoperator>=(const _Tp& __x, const _Tp& __y) 197227825Stheraven{ 198227825Stheraven return !(__x < __y); 199227825Stheraven} 200227825Stheraven 201227825Stheraven} // rel_ops 202227825Stheraven 203227825Stheraven// swap_ranges 204227825Stheraven 205227825Stheraventemplate <class _ForwardIterator1, class _ForwardIterator2> 206227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 207227825Stheraven_ForwardIterator2 208227825Stheravenswap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) 209227825Stheraven{ 210278724Sdim for(; __first1 != __last1; ++__first1, (void) ++__first2) 211227825Stheraven swap(*__first1, *__first2); 212227825Stheraven return __first2; 213227825Stheraven} 214227825Stheraven 215232950Stheraventemplate<class _Tp, size_t _Np> 216227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 217227825Stheravenvoid 218232950Stheravenswap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) 219227825Stheraven{ 220232950Stheraven _VSTD::swap_ranges(__a, __a + _Np, __b); 221227825Stheraven} 222227825Stheraven 223227825Stheraventemplate <class _Tp> 224262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 225227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 226227825Stheraventypename conditional 227227825Stheraven< 228227825Stheraven !is_nothrow_move_constructible<_Tp>::value && is_copy_constructible<_Tp>::value, 229227825Stheraven const _Tp&, 230227825Stheraven _Tp&& 231227825Stheraven>::type 232227825Stheraven#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 233227825Stheravenconst _Tp& 234227825Stheraven#endif 235227825Stheravenmove_if_noexcept(_Tp& __x) _NOEXCEPT 236227825Stheraven{ 237227825Stheraven return _VSTD::move(__x); 238227825Stheraven} 239227825Stheraven 240262801Sdimstruct _LIBCPP_TYPE_VIS_ONLY piecewise_construct_t { }; 241234976Stheraven#if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_UTILITY) 242227825Stheravenextern const piecewise_construct_t piecewise_construct;// = piecewise_construct_t(); 243234976Stheraven#else 244234976Stheravenconstexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); 245234976Stheraven#endif 246227825Stheraven 247227825Stheraventemplate <class _T1, class _T2> 248262801Sdimstruct _LIBCPP_TYPE_VIS_ONLY pair 249227825Stheraven{ 250227825Stheraven typedef _T1 first_type; 251227825Stheraven typedef _T2 second_type; 252227825Stheraven 253227825Stheraven _T1 first; 254227825Stheraven _T2 second; 255227825Stheraven 256227825Stheraven // pair(const pair&) = default; 257227825Stheraven // pair(pair&&) = default; 258227825Stheraven 259234976Stheraven _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pair() : first(), second() {} 260227825Stheraven 261262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 262262801Sdim pair(const _T1& __x, const _T2& __y) 263227825Stheraven : first(__x), second(__y) {} 264227825Stheraven 265227825Stheraven template<class _U1, class _U2> 266262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 267227825Stheraven pair(const pair<_U1, _U2>& __p 268227825Stheraven#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 269241903Sdim ,typename enable_if<is_convertible<const _U1&, _T1>::value && 270241903Sdim is_convertible<const _U2&, _T2>::value>::type* = 0 271227825Stheraven#endif 272227825Stheraven ) 273227825Stheraven : first(__p.first), second(__p.second) {} 274227825Stheraven 275262801Sdim#if !defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && _LIBCPP_TRIVIAL_PAIR_COPY_CTOR 276227825Stheraven _LIBCPP_INLINE_VISIBILITY 277262801Sdim pair(const pair& __p) = default; 278262801Sdim#elif !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) || !_LIBCPP_TRIVIAL_PAIR_COPY_CTOR 279262801Sdim _LIBCPP_INLINE_VISIBILITY 280227825Stheraven pair(const pair& __p) 281227825Stheraven _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value && 282227825Stheraven is_nothrow_copy_constructible<second_type>::value) 283227825Stheraven : first(__p.first), 284227825Stheraven second(__p.second) 285227825Stheraven { 286227825Stheraven } 287262801Sdim#endif 288227825Stheraven 289227825Stheraven _LIBCPP_INLINE_VISIBILITY 290227825Stheraven pair& operator=(const pair& __p) 291227825Stheraven _NOEXCEPT_(is_nothrow_copy_assignable<first_type>::value && 292227825Stheraven is_nothrow_copy_assignable<second_type>::value) 293227825Stheraven { 294227825Stheraven first = __p.first; 295227825Stheraven second = __p.second; 296227825Stheraven return *this; 297227825Stheraven } 298227825Stheraven 299227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 300227825Stheraven 301227825Stheraven template <class _U1, class _U2, 302241903Sdim class = typename enable_if<is_convertible<_U1, first_type>::value && 303241903Sdim is_convertible<_U2, second_type>::value>::type> 304262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 305227825Stheraven pair(_U1&& __u1, _U2&& __u2) 306227825Stheraven : first(_VSTD::forward<_U1>(__u1)), 307227825Stheraven second(_VSTD::forward<_U2>(__u2)) 308227825Stheraven {} 309227825Stheraven 310227825Stheraven template<class _U1, class _U2> 311262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 312227825Stheraven pair(pair<_U1, _U2>&& __p, 313241903Sdim typename enable_if<is_convertible<_U1, _T1>::value && 314241903Sdim is_convertible<_U2, _T2>::value>::type* = 0) 315227825Stheraven : first(_VSTD::forward<_U1>(__p.first)), 316227825Stheraven second(_VSTD::forward<_U2>(__p.second)) {} 317227825Stheraven 318262801Sdim#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 319227825Stheraven _LIBCPP_INLINE_VISIBILITY 320262801Sdim pair(pair&& __p) = default; 321262801Sdim#else 322262801Sdim _LIBCPP_INLINE_VISIBILITY 323227825Stheraven pair(pair&& __p) _NOEXCEPT_(is_nothrow_move_constructible<first_type>::value && 324227825Stheraven is_nothrow_move_constructible<second_type>::value) 325227825Stheraven : first(_VSTD::forward<first_type>(__p.first)), 326227825Stheraven second(_VSTD::forward<second_type>(__p.second)) 327227825Stheraven { 328227825Stheraven } 329262801Sdim#endif 330227825Stheraven 331227825Stheraven _LIBCPP_INLINE_VISIBILITY 332227825Stheraven pair& 333227825Stheraven operator=(pair&& __p) _NOEXCEPT_(is_nothrow_move_assignable<first_type>::value && 334227825Stheraven is_nothrow_move_assignable<second_type>::value) 335227825Stheraven { 336227825Stheraven first = _VSTD::forward<first_type>(__p.first); 337227825Stheraven second = _VSTD::forward<second_type>(__p.second); 338227825Stheraven return *this; 339227825Stheraven } 340227825Stheraven 341227825Stheraven#ifndef _LIBCPP_HAS_NO_VARIADICS 342227825Stheraven 343227825Stheraven template<class _Tuple, 344227825Stheraven class = typename enable_if<__tuple_convertible<_Tuple, pair>::value>::type> 345262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 346227825Stheraven pair(_Tuple&& __p) 347227825Stheraven : first(_VSTD::forward<typename tuple_element<0, 348278724Sdim typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<0>(__p))), 349227825Stheraven second(_VSTD::forward<typename tuple_element<1, 350278724Sdim typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<1>(__p))) 351227825Stheraven {} 352227825Stheraven 353227825Stheraven 354227825Stheraven 355232950Stheraven template <class... _Args1, class... _Args2> 356227825Stheraven _LIBCPP_INLINE_VISIBILITY 357227825Stheraven pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, 358227825Stheraven tuple<_Args2...> __second_args) 359227825Stheraven : pair(__pc, __first_args, __second_args, 360227825Stheraven typename __make_tuple_indices<sizeof...(_Args1)>::type(), 361227825Stheraven typename __make_tuple_indices<sizeof...(_Args2) >::type()) 362227825Stheraven {} 363227825Stheraven 364227825Stheraven template <class _Tuple, 365227825Stheraven class = typename enable_if<__tuple_assignable<_Tuple, pair>::value>::type> 366227825Stheraven _LIBCPP_INLINE_VISIBILITY 367227825Stheraven pair& 368227825Stheraven operator=(_Tuple&& __p) 369227825Stheraven { 370227825Stheraven typedef typename __make_tuple_types<_Tuple>::type _TupleRef; 371227825Stheraven typedef typename tuple_element<0, _TupleRef>::type _U0; 372227825Stheraven typedef typename tuple_element<1, _TupleRef>::type _U1; 373227825Stheraven first = _VSTD::forward<_U0>(_VSTD::get<0>(__p)); 374227825Stheraven second = _VSTD::forward<_U1>(_VSTD::get<1>(__p)); 375227825Stheraven return *this; 376227825Stheraven } 377227825Stheraven 378227825Stheraven#endif // _LIBCPP_HAS_NO_VARIADICS 379227825Stheraven 380227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 381227825Stheraven _LIBCPP_INLINE_VISIBILITY 382227825Stheraven void 383227825Stheraven swap(pair& __p) _NOEXCEPT_(__is_nothrow_swappable<first_type>::value && 384227825Stheraven __is_nothrow_swappable<second_type>::value) 385227825Stheraven { 386227825Stheraven _VSTD::iter_swap(&first, &__p.first); 387227825Stheraven _VSTD::iter_swap(&second, &__p.second); 388227825Stheraven } 389227825Stheravenprivate: 390227825Stheraven 391227825Stheraven#ifndef _LIBCPP_HAS_NO_VARIADICS 392227825Stheraven template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 393227825Stheraven _LIBCPP_INLINE_VISIBILITY 394227825Stheraven pair(piecewise_construct_t, 395227825Stheraven tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 396227825Stheraven __tuple_indices<_I1...>, __tuple_indices<_I2...>); 397227825Stheraven#endif // _LIBCPP_HAS_NO_VARIADICS 398227825Stheraven}; 399227825Stheraven 400227825Stheraventemplate <class _T1, class _T2> 401262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 402227825Stheravenbool 403227825Stheravenoperator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 404227825Stheraven{ 405227825Stheraven return __x.first == __y.first && __x.second == __y.second; 406227825Stheraven} 407227825Stheraven 408227825Stheraventemplate <class _T1, class _T2> 409262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 410227825Stheravenbool 411227825Stheravenoperator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 412227825Stheraven{ 413227825Stheraven return !(__x == __y); 414227825Stheraven} 415227825Stheraven 416227825Stheraventemplate <class _T1, class _T2> 417262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 418227825Stheravenbool 419227825Stheravenoperator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 420227825Stheraven{ 421227825Stheraven return __x.first < __y.first || (!(__y.first < __x.first) && __x.second < __y.second); 422227825Stheraven} 423227825Stheraven 424227825Stheraventemplate <class _T1, class _T2> 425262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 426227825Stheravenbool 427227825Stheravenoperator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 428227825Stheraven{ 429227825Stheraven return __y < __x; 430227825Stheraven} 431227825Stheraven 432227825Stheraventemplate <class _T1, class _T2> 433262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 434227825Stheravenbool 435227825Stheravenoperator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 436227825Stheraven{ 437227825Stheraven return !(__x < __y); 438227825Stheraven} 439227825Stheraven 440227825Stheraventemplate <class _T1, class _T2> 441262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 442227825Stheravenbool 443227825Stheravenoperator<=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 444227825Stheraven{ 445227825Stheraven return !(__y < __x); 446227825Stheraven} 447227825Stheraven 448227825Stheraventemplate <class _T1, class _T2> 449227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 450227825Stheraventypename enable_if 451227825Stheraven< 452227825Stheraven __is_swappable<_T1>::value && 453227825Stheraven __is_swappable<_T2>::value, 454227825Stheraven void 455227825Stheraven>::type 456227825Stheravenswap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) 457227825Stheraven _NOEXCEPT_((__is_nothrow_swappable<_T1>::value && 458227825Stheraven __is_nothrow_swappable<_T2>::value)) 459227825Stheraven{ 460227825Stheraven __x.swap(__y); 461227825Stheraven} 462227825Stheraven 463227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 464227825Stheraven 465262801Sdimtemplate <class _Tp> class _LIBCPP_TYPE_VIS_ONLY reference_wrapper; 466227825Stheraven 467227825Stheraventemplate <class _Tp> 468278724Sdimstruct __make_pair_return_impl 469227825Stheraven{ 470227825Stheraven typedef _Tp type; 471227825Stheraven}; 472227825Stheraven 473227825Stheraventemplate <class _Tp> 474278724Sdimstruct __make_pair_return_impl<reference_wrapper<_Tp>> 475227825Stheraven{ 476227825Stheraven typedef _Tp& type; 477227825Stheraven}; 478227825Stheraven 479227825Stheraventemplate <class _Tp> 480227825Stheravenstruct __make_pair_return 481227825Stheraven{ 482278724Sdim typedef typename __make_pair_return_impl<typename decay<_Tp>::type>::type type; 483227825Stheraven}; 484227825Stheraven 485227825Stheraventemplate <class _T1, class _T2> 486262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 487227825Stheravenpair<typename __make_pair_return<_T1>::type, typename __make_pair_return<_T2>::type> 488227825Stheravenmake_pair(_T1&& __t1, _T2&& __t2) 489227825Stheraven{ 490227825Stheraven return pair<typename __make_pair_return<_T1>::type, typename __make_pair_return<_T2>::type> 491227825Stheraven (_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2)); 492227825Stheraven} 493227825Stheraven 494227825Stheraven#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 495227825Stheraven 496227825Stheraventemplate <class _T1, class _T2> 497227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 498227825Stheravenpair<_T1,_T2> 499227825Stheravenmake_pair(_T1 __x, _T2 __y) 500227825Stheraven{ 501227825Stheraven return pair<_T1, _T2>(__x, __y); 502227825Stheraven} 503227825Stheraven 504227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 505227825Stheraven 506227825Stheraventemplate <class _T1, class _T2> 507262801Sdim class _LIBCPP_TYPE_VIS_ONLY tuple_size<pair<_T1, _T2> > 508227825Stheraven : public integral_constant<size_t, 2> {}; 509227825Stheraven 510227825Stheraventemplate <class _T1, class _T2> 511262801Sdim class _LIBCPP_TYPE_VIS_ONLY tuple_size<const pair<_T1, _T2> > 512227825Stheraven : public integral_constant<size_t, 2> {}; 513227825Stheraven 514227825Stheraventemplate <class _T1, class _T2> 515262801Sdimclass _LIBCPP_TYPE_VIS_ONLY tuple_element<0, pair<_T1, _T2> > 516227825Stheraven{ 517227825Stheravenpublic: 518227825Stheraven typedef _T1 type; 519227825Stheraven}; 520227825Stheraven 521227825Stheraventemplate <class _T1, class _T2> 522262801Sdimclass _LIBCPP_TYPE_VIS_ONLY tuple_element<1, pair<_T1, _T2> > 523227825Stheraven{ 524227825Stheravenpublic: 525227825Stheraven typedef _T2 type; 526227825Stheraven}; 527227825Stheraven 528227825Stheraventemplate <class _T1, class _T2> 529262801Sdimclass _LIBCPP_TYPE_VIS_ONLY tuple_element<0, const pair<_T1, _T2> > 530227825Stheraven{ 531227825Stheravenpublic: 532227825Stheraven typedef const _T1 type; 533227825Stheraven}; 534227825Stheraven 535227825Stheraventemplate <class _T1, class _T2> 536262801Sdimclass _LIBCPP_TYPE_VIS_ONLY tuple_element<1, const pair<_T1, _T2> > 537227825Stheraven{ 538227825Stheravenpublic: 539227825Stheraven typedef const _T2 type; 540227825Stheraven}; 541227825Stheraven 542227825Stheraventemplate <size_t _Ip> struct __get_pair; 543227825Stheraven 544227825Stheraventemplate <> 545227825Stheravenstruct __get_pair<0> 546227825Stheraven{ 547227825Stheraven template <class _T1, class _T2> 548227825Stheraven static 549262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 550227825Stheraven _T1& 551227825Stheraven get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 552227825Stheraven 553227825Stheraven template <class _T1, class _T2> 554227825Stheraven static 555262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 556227825Stheraven const _T1& 557227825Stheraven get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 558227825Stheraven 559227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 560227825Stheraven 561227825Stheraven template <class _T1, class _T2> 562227825Stheraven static 563262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 564227825Stheraven _T1&& 565227825Stheraven get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);} 566227825Stheraven 567227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 568227825Stheraven}; 569227825Stheraven 570227825Stheraventemplate <> 571227825Stheravenstruct __get_pair<1> 572227825Stheraven{ 573227825Stheraven template <class _T1, class _T2> 574227825Stheraven static 575262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 576227825Stheraven _T2& 577227825Stheraven get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 578227825Stheraven 579227825Stheraven template <class _T1, class _T2> 580227825Stheraven static 581262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 582227825Stheraven const _T2& 583227825Stheraven get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 584227825Stheraven 585227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 586227825Stheraven 587227825Stheraven template <class _T1, class _T2> 588227825Stheraven static 589262801Sdim _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 590227825Stheraven _T2&& 591227825Stheraven get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T2>(__p.second);} 592227825Stheraven 593227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 594227825Stheraven}; 595227825Stheraven 596227825Stheraventemplate <size_t _Ip, class _T1, class _T2> 597262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 598227825Stheraventypename tuple_element<_Ip, pair<_T1, _T2> >::type& 599227825Stheravenget(pair<_T1, _T2>& __p) _NOEXCEPT 600227825Stheraven{ 601227825Stheraven return __get_pair<_Ip>::get(__p); 602227825Stheraven} 603227825Stheraven 604227825Stheraventemplate <size_t _Ip, class _T1, class _T2> 605262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 606227825Stheravenconst typename tuple_element<_Ip, pair<_T1, _T2> >::type& 607227825Stheravenget(const pair<_T1, _T2>& __p) _NOEXCEPT 608227825Stheraven{ 609227825Stheraven return __get_pair<_Ip>::get(__p); 610227825Stheraven} 611227825Stheraven 612227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 613227825Stheraven 614227825Stheraventemplate <size_t _Ip, class _T1, class _T2> 615262801Sdiminline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 616227825Stheraventypename tuple_element<_Ip, pair<_T1, _T2> >::type&& 617227825Stheravenget(pair<_T1, _T2>&& __p) _NOEXCEPT 618227825Stheraven{ 619227825Stheraven return __get_pair<_Ip>::get(_VSTD::move(__p)); 620227825Stheraven} 621227825Stheraven 622227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 623227825Stheraven 624253159Stheraven#if _LIBCPP_STD_VER > 11 625262801Sdimtemplate <class _T1, class _T2> 626262801Sdiminline _LIBCPP_INLINE_VISIBILITY 627262801Sdimconstexpr _T1 & get(pair<_T1, _T2>& __p) _NOEXCEPT 628262801Sdim{ 629262801Sdim return __get_pair<0>::get(__p); 630262801Sdim} 631253159Stheraven 632262801Sdimtemplate <class _T1, class _T2> 633262801Sdiminline _LIBCPP_INLINE_VISIBILITY 634262801Sdimconstexpr _T1 const & get(pair<_T1, _T2> const& __p) _NOEXCEPT 635262801Sdim{ 636262801Sdim return __get_pair<0>::get(__p); 637262801Sdim} 638262801Sdim 639262801Sdimtemplate <class _T1, class _T2> 640262801Sdiminline _LIBCPP_INLINE_VISIBILITY 641262801Sdimconstexpr _T1 && get(pair<_T1, _T2>&& __p) _NOEXCEPT 642262801Sdim{ 643262801Sdim return __get_pair<0>::get(_VSTD::move(__p)); 644262801Sdim} 645262801Sdim 646262801Sdimtemplate <class _T1, class _T2> 647262801Sdiminline _LIBCPP_INLINE_VISIBILITY 648262801Sdimconstexpr _T1 & get(pair<_T2, _T1>& __p) _NOEXCEPT 649262801Sdim{ 650262801Sdim return __get_pair<1>::get(__p); 651262801Sdim} 652262801Sdim 653262801Sdimtemplate <class _T1, class _T2> 654262801Sdiminline _LIBCPP_INLINE_VISIBILITY 655262801Sdimconstexpr _T1 const & get(pair<_T2, _T1> const& __p) _NOEXCEPT 656262801Sdim{ 657262801Sdim return __get_pair<1>::get(__p); 658262801Sdim} 659262801Sdim 660262801Sdimtemplate <class _T1, class _T2> 661262801Sdiminline _LIBCPP_INLINE_VISIBILITY 662262801Sdimconstexpr _T1 && get(pair<_T2, _T1>&& __p) _NOEXCEPT 663262801Sdim{ 664262801Sdim return __get_pair<1>::get(_VSTD::move(__p)); 665262801Sdim} 666262801Sdim 667262801Sdim#endif 668262801Sdim 669262801Sdim#if _LIBCPP_STD_VER > 11 670262801Sdim 671253159Stheraventemplate<class _Tp, _Tp... _Ip> 672262801Sdimstruct _LIBCPP_TYPE_VIS_ONLY integer_sequence 673253159Stheraven{ 674253159Stheraven typedef _Tp value_type; 675253159Stheraven static_assert( is_integral<_Tp>::value, 676253159Stheraven "std::integer_sequence can only be instantiated with an integral type" ); 677253159Stheraven static 678253159Stheraven _LIBCPP_INLINE_VISIBILITY 679253159Stheraven constexpr 680253159Stheraven size_t 681253159Stheraven size() noexcept { return sizeof...(_Ip); } 682253159Stheraven}; 683253159Stheraven 684253159Stheraventemplate<size_t... _Ip> 685253159Stheraven using index_sequence = integer_sequence<size_t, _Ip...>; 686253159Stheraven 687253159Stheravennamespace __detail { 688253159Stheraven 689253159Stheraventemplate<typename _Tp, size_t ..._Extra> struct __repeat; 690253159Stheraventemplate<typename _Tp, _Tp ..._Np, size_t ..._Extra> struct __repeat<integer_sequence<_Tp, _Np...>, _Extra...> { 691253159Stheraven typedef integer_sequence<_Tp, 692253159Stheraven _Np..., 693253159Stheraven sizeof...(_Np) + _Np..., 694253159Stheraven 2 * sizeof...(_Np) + _Np..., 695253159Stheraven 3 * sizeof...(_Np) + _Np..., 696253159Stheraven 4 * sizeof...(_Np) + _Np..., 697253159Stheraven 5 * sizeof...(_Np) + _Np..., 698253159Stheraven 6 * sizeof...(_Np) + _Np..., 699253159Stheraven 7 * sizeof...(_Np) + _Np..., 700253159Stheraven _Extra...> type; 701253159Stheraven}; 702253159Stheraven 703253159Stheraventemplate<size_t _Np> struct __parity; 704253159Stheraventemplate<size_t _Np> struct __make : __parity<_Np % 8>::template __pmake<_Np> {}; 705253159Stheraven 706253159Stheraventemplate<> struct __make<0> { typedef integer_sequence<size_t> type; }; 707253159Stheraventemplate<> struct __make<1> { typedef integer_sequence<size_t, 0> type; }; 708253159Stheraventemplate<> struct __make<2> { typedef integer_sequence<size_t, 0, 1> type; }; 709253159Stheraventemplate<> struct __make<3> { typedef integer_sequence<size_t, 0, 1, 2> type; }; 710253159Stheraventemplate<> struct __make<4> { typedef integer_sequence<size_t, 0, 1, 2, 3> type; }; 711253159Stheraventemplate<> struct __make<5> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4> type; }; 712253159Stheraventemplate<> struct __make<6> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; }; 713253159Stheraventemplate<> struct __make<7> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; }; 714253159Stheraven 715253159Stheraventemplate<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; }; 716253159Stheraventemplate<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; }; 717253159Stheraventemplate<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; }; 718253159Stheraventemplate<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; }; 719253159Stheraventemplate<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; 720253159Stheraventemplate<> struct __parity<5> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; 721253159Stheraventemplate<> struct __parity<6> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; 722253159Stheraventemplate<> struct __parity<7> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 7, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; 723253159Stheraven 724253159Stheraventemplate<typename _Tp, typename _Up> struct __convert { 725253159Stheraven template<typename> struct __result; 726253159Stheraven template<_Tp ..._Np> struct __result<integer_sequence<_Tp, _Np...> > { typedef integer_sequence<_Up, _Np...> type; }; 727253159Stheraven}; 728253159Stheraventemplate<typename _Tp> struct __convert<_Tp, _Tp> { template<typename _Up> struct __result { typedef _Up type; }; }; 729253159Stheraven 730253159Stheraven} 731253159Stheraven 732253159Stheraventemplate<typename _Tp, _Tp _Np> using __make_integer_sequence_unchecked = 733253159Stheraven typename __detail::__convert<size_t, _Tp>::template __result<typename __detail::__make<_Np>::type>::type; 734253159Stheraven 735253159Stheraventemplate <class _Tp, _Tp _Ep> 736253159Stheravenstruct __make_integer_sequence 737253159Stheraven{ 738253159Stheraven static_assert(is_integral<_Tp>::value, 739253159Stheraven "std::make_integer_sequence can only be instantiated with an integral type" ); 740253159Stheraven static_assert(0 <= _Ep, "std::make_integer_sequence input shall not be negative"); 741253159Stheraven typedef __make_integer_sequence_unchecked<_Tp, _Ep> type; 742253159Stheraven}; 743253159Stheraven 744253159Stheraventemplate<class _Tp, _Tp _Np> 745253159Stheraven using make_integer_sequence = typename __make_integer_sequence<_Tp, _Np>::type; 746253159Stheraven 747253159Stheraventemplate<size_t _Np> 748253159Stheraven using make_index_sequence = make_integer_sequence<size_t, _Np>; 749253159Stheraven 750253159Stheraventemplate<class... _Tp> 751253159Stheraven using index_sequence_for = make_index_sequence<sizeof...(_Tp)>; 752253159Stheraven 753253159Stheraven#endif // _LIBCPP_STD_VER > 11 754253159Stheraven 755262801Sdim#if _LIBCPP_STD_VER > 11 756262801Sdimtemplate<class _T1, class _T2 = _T1> 757262801Sdiminline _LIBCPP_INLINE_VISIBILITY 758262801Sdim_T1 exchange(_T1& __obj, _T2 && __new_value) 759262801Sdim{ 760262801Sdim _T1 __old_value = _VSTD::move(__obj); 761262801Sdim __obj = _VSTD::forward<_T2>(__new_value); 762262801Sdim return __old_value; 763262801Sdim} 764262801Sdim#endif // _LIBCPP_STD_VER > 11 765262801Sdim 766227825Stheraven_LIBCPP_END_NAMESPACE_STD 767227825Stheraven 768227825Stheraven#endif // _LIBCPP_UTILITY 769