utility revision 253159
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; 42227825Stheraventemplate <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept; 43227825Stheraven 44227825Stheraventemplate <class T> typename remove_reference<T>::type&& move(T&&) noexcept; 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 53227825Stheraven move_if_noexcept(T& x) noexcept; 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(); 69227825Stheraven pair(const T1& x, const T2& y); 70227825Stheraven template <class U, class V> pair(U&& x, V&& y); 71227825Stheraven template <class U, class V> pair(const pair<U, V>& p); 72227825Stheraven template <class U, class V> pair(pair<U, V>&& p); 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 86227825Stheraventemplate <class T1, class T2> bool operator==(const pair<T1,T2>&, const pair<T1,T2>&); 87227825Stheraventemplate <class T1, class T2> bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&); 88227825Stheraventemplate <class T1, class T2> bool operator< (const pair<T1,T2>&, const pair<T1,T2>&); 89227825Stheraventemplate <class T1, class T2> bool operator> (const pair<T1,T2>&, const pair<T1,T2>&); 90227825Stheraventemplate <class T1, class T2> bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&); 91227825Stheraventemplate <class T1, class T2> bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&); 92227825Stheraven 93227825Stheraventemplate <class T1, class T2> pair<V1, V2> make_pair(T1&&, T2&&); 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 104227825Stheraventemplate <class T1, class T2> struct tuple_size<std::pair<T1, T2> >; 105227825Stheraventemplate <class T1, class T2> struct tuple_element<0, std::pair<T1, T2> >; 106227825Stheraventemplate <class T1, class T2> struct tuple_element<1, std::pair<T1, T2> >; 107227825Stheraven 108227825Stheraventemplate<size_t I, class T1, class T2> 109227825Stheraven typename tuple_element<I, std::pair<T1, T2> >::type& 110227825Stheraven get(std::pair<T1, T2>&) noexcept; 111227825Stheraven 112227825Stheraventemplate<size_t I, class T1, class T2> 113227825Stheraven const typename const tuple_element<I, std::pair<T1, T2> >::type& 114227825Stheraven get(const std::pair<T1, T2>&) noexcept; 115227825Stheraven 116227825Stheraventemplate<size_t I, class T1, class T2> 117227825Stheraven typename tuple_element<I, std::pair<T1, T2> >::type&& 118227825Stheraven get(std::pair<T1, T2>&&) noexcept; 119227825Stheraven 120227825Stheraven// C++14 121227825Stheraven 122227825Stheraventemplate<class T, T... I> 123227825Stheravenstruct integer_sequence 124227825Stheraven{ 125227825Stheraven typedef T value_type; 126227825Stheraven 127227825Stheraven static constexpr size_t size() noexcept; 128227825Stheraven}; 129227825Stheraven 130227825Stheraventemplate<size_t... I> 131227825Stheraven using index_sequence = integer_sequence<size_t, I...>; 132227825Stheraven 133227825Stheraventemplate<class T, T N> 134227825Stheraven using make_integer_sequence = integer_sequence<T, 0, 1, ..., N-1>; 135227825Stheraventemplate<size_t N> 136227825Stheraven using make_index_sequence = make_integer_sequence<size_t, N>; 137227825Stheraven 138227825Stheraventemplate<class... T> 139227825Stheraven using index_sequence_for = make_index_sequence<sizeof...(T)>; 140227825Stheraven 141227825Stheraven} // std 142227825Stheraven 143227825Stheraven*/ 144227825Stheraven 145227825Stheraven#include <__config> 146227825Stheraven#include <__tuple> 147227825Stheraven#include <type_traits> 148227825Stheraven 149227825Stheraven#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 150227825Stheraven#pragma GCC system_header 151227825Stheraven#endif 152227825Stheraven 153227825Stheraven_LIBCPP_BEGIN_NAMESPACE_STD 154227825Stheraven 155227825Stheravennamespace rel_ops 156227825Stheraven{ 157227825Stheraven 158227825Stheraventemplate<class _Tp> 159227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 160227825Stheravenbool 161227825Stheravenoperator!=(const _Tp& __x, const _Tp& __y) 162227825Stheraven{ 163227825Stheraven return !(__x == __y); 164227825Stheraven} 165262801Sdim 166262801Sdimtemplate<class _Tp> 167227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 168227825Stheravenbool 169227825Stheravenoperator> (const _Tp& __x, const _Tp& __y) 170227825Stheraven{ 171227825Stheraven return __y < __x; 172227825Stheraven} 173227825Stheraven 174227825Stheraventemplate<class _Tp> 175227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 176227825Stheravenbool 177227825Stheravenoperator<=(const _Tp& __x, const _Tp& __y) 178227825Stheraven{ 179227825Stheraven return !(__y < __x); 180227825Stheraven} 181227825Stheraven 182227825Stheraventemplate<class _Tp> 183227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 184227825Stheravenbool 185227825Stheravenoperator>=(const _Tp& __x, const _Tp& __y) 186227825Stheraven{ 187227825Stheraven return !(__x < __y); 188227825Stheraven} 189227825Stheraven 190227825Stheraven} // rel_ops 191227825Stheraven 192227825Stheraven// swap_ranges 193227825Stheraven 194227825Stheraventemplate <class _ForwardIterator1, class _ForwardIterator2> 195227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 196227825Stheraven_ForwardIterator2 197227825Stheravenswap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) 198227825Stheraven{ 199227825Stheraven for(; __first1 != __last1; ++__first1, ++__first2) 200227825Stheraven swap(*__first1, *__first2); 201227825Stheraven return __first2; 202227825Stheraven} 203227825Stheraven 204227825Stheraventemplate<class _Tp, size_t _Np> 205227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 206227825Stheravenvoid 207227825Stheravenswap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) 208227825Stheraven{ 209227825Stheraven _VSTD::swap_ranges(__a, __a + _Np, __b); 210227825Stheraven} 211227825Stheraven 212227825Stheraventemplate <class _Tp> 213227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 214227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 215227825Stheraventypename conditional 216227825Stheraven< 217227825Stheraven !is_nothrow_move_constructible<_Tp>::value && is_copy_constructible<_Tp>::value, 218227825Stheraven const _Tp&, 219227825Stheraven _Tp&& 220227825Stheraven>::type 221262801Sdim#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 222227825Stheravenconst _Tp& 223227825Stheraven#endif 224262801Sdimmove_if_noexcept(_Tp& __x) _NOEXCEPT 225227825Stheraven{ 226227825Stheraven return _VSTD::move(__x); 227227825Stheraven} 228227825Stheraven 229227825Stheravenstruct _LIBCPP_TYPE_VIS piecewise_construct_t { }; 230227825Stheraven#if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_UTILITY) 231227825Stheravenextern const piecewise_construct_t piecewise_construct;// = piecewise_construct_t(); 232227825Stheraven#else 233227825Stheravenconstexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); 234227825Stheraven#endif 235227825Stheraven 236227825Stheraventemplate <class _T1, class _T2> 237227825Stheravenstruct _LIBCPP_TYPE_VIS pair 238227825Stheraven{ 239227825Stheraven typedef _T1 first_type; 240227825Stheraven typedef _T2 second_type; 241227825Stheraven 242227825Stheraven _T1 first; 243227825Stheraven _T2 second; 244227825Stheraven 245227825Stheraven // pair(const pair&) = default; 246227825Stheraven // pair(pair&&) = default; 247227825Stheraven 248227825Stheraven _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pair() : first(), second() {} 249227825Stheraven 250227825Stheraven _LIBCPP_INLINE_VISIBILITY pair(const _T1& __x, const _T2& __y) 251227825Stheraven : first(__x), second(__y) {} 252227825Stheraven 253227825Stheraven template<class _U1, class _U2> 254227825Stheraven _LIBCPP_INLINE_VISIBILITY 255227825Stheraven pair(const pair<_U1, _U2>& __p 256227825Stheraven#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 257227825Stheraven ,typename enable_if<is_convertible<const _U1&, _T1>::value && 258227825Stheraven is_convertible<const _U2&, _T2>::value>::type* = 0 259227825Stheraven#endif 260227825Stheraven ) 261227825Stheraven : first(__p.first), second(__p.second) {} 262227825Stheraven 263227825Stheraven _LIBCPP_INLINE_VISIBILITY 264227825Stheraven pair(const pair& __p) 265227825Stheraven _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value && 266227825Stheraven is_nothrow_copy_constructible<second_type>::value) 267227825Stheraven : first(__p.first), 268227825Stheraven second(__p.second) 269227825Stheraven { 270227825Stheraven } 271227825Stheraven 272227825Stheraven _LIBCPP_INLINE_VISIBILITY 273227825Stheraven pair& operator=(const pair& __p) 274227825Stheraven _NOEXCEPT_(is_nothrow_copy_assignable<first_type>::value && 275227825Stheraven is_nothrow_copy_assignable<second_type>::value) 276227825Stheraven { 277232950Stheraven first = __p.first; 278232950Stheraven second = __p.second; 279262801Sdim return *this; 280262801Sdim } 281262801Sdim 282262801Sdim#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 283262801Sdim 284262801Sdim template <class _U1, class _U2, 285227825Stheraven class = typename enable_if<is_convertible<_U1, first_type>::value && 286227825Stheraven is_convertible<_U2, second_type>::value>::type> 287227825Stheraven _LIBCPP_INLINE_VISIBILITY 288227825Stheraven pair(_U1&& __u1, _U2&& __u2) 289227825Stheraven : first(_VSTD::forward<_U1>(__u1)), 290227825Stheraven second(_VSTD::forward<_U2>(__u2)) 291227825Stheraven {} 292227825Stheraven 293227825Stheraven template<class _U1, class _U2> 294227825Stheraven _LIBCPP_INLINE_VISIBILITY 295227825Stheraven pair(pair<_U1, _U2>&& __p, 296227825Stheraven typename enable_if<is_convertible<_U1, _T1>::value && 297227825Stheraven is_convertible<_U2, _T2>::value>::type* = 0) 298227825Stheraven : first(_VSTD::forward<_U1>(__p.first)), 299227825Stheraven second(_VSTD::forward<_U2>(__p.second)) {} 300227825Stheraven 301227825Stheraven _LIBCPP_INLINE_VISIBILITY 302227825Stheraven pair(pair&& __p) _NOEXCEPT_(is_nothrow_move_constructible<first_type>::value && 303227825Stheraven is_nothrow_move_constructible<second_type>::value) 304227825Stheraven : first(_VSTD::forward<first_type>(__p.first)), 305227825Stheraven second(_VSTD::forward<second_type>(__p.second)) 306227825Stheraven { 307227825Stheraven } 308227825Stheraven 309227825Stheraven _LIBCPP_INLINE_VISIBILITY 310227825Stheraven pair& 311227825Stheraven operator=(pair&& __p) _NOEXCEPT_(is_nothrow_move_assignable<first_type>::value && 312227825Stheraven is_nothrow_move_assignable<second_type>::value) 313227825Stheraven { 314227825Stheraven first = _VSTD::forward<first_type>(__p.first); 315227825Stheraven second = _VSTD::forward<second_type>(__p.second); 316227825Stheraven return *this; 317227825Stheraven } 318227825Stheraven 319227825Stheraven#ifndef _LIBCPP_HAS_NO_VARIADICS 320227825Stheraven 321227825Stheraven template<class _Tuple, 322262801Sdim class = typename enable_if<__tuple_convertible<_Tuple, pair>::value>::type> 323227825Stheraven _LIBCPP_INLINE_VISIBILITY 324227825Stheraven pair(_Tuple&& __p) 325262801Sdim : first(_VSTD::forward<typename tuple_element<0, 326262801Sdim typename __make_tuple_types<_Tuple>::type>::type>(get<0>(__p))), 327262801Sdim second(_VSTD::forward<typename tuple_element<1, 328227825Stheraven typename __make_tuple_types<_Tuple>::type>::type>(get<1>(__p))) 329262801Sdim {} 330227825Stheraven 331227825Stheraven 332227825Stheraven 333227825Stheraven template <class... _Args1, class... _Args2> 334227825Stheraven _LIBCPP_INLINE_VISIBILITY 335227825Stheraven pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, 336227825Stheraven tuple<_Args2...> __second_args) 337227825Stheraven : pair(__pc, __first_args, __second_args, 338227825Stheraven typename __make_tuple_indices<sizeof...(_Args1)>::type(), 339227825Stheraven typename __make_tuple_indices<sizeof...(_Args2) >::type()) 340227825Stheraven {} 341227825Stheraven 342227825Stheraven template <class _Tuple, 343227825Stheraven class = typename enable_if<__tuple_assignable<_Tuple, pair>::value>::type> 344227825Stheraven _LIBCPP_INLINE_VISIBILITY 345227825Stheraven pair& 346227825Stheraven operator=(_Tuple&& __p) 347227825Stheraven { 348227825Stheraven typedef typename __make_tuple_types<_Tuple>::type _TupleRef; 349227825Stheraven typedef typename tuple_element<0, _TupleRef>::type _U0; 350227825Stheraven typedef typename tuple_element<1, _TupleRef>::type _U1; 351227825Stheraven first = _VSTD::forward<_U0>(_VSTD::get<0>(__p)); 352227825Stheraven second = _VSTD::forward<_U1>(_VSTD::get<1>(__p)); 353227825Stheraven return *this; 354227825Stheraven } 355227825Stheraven 356227825Stheraven#endif // _LIBCPP_HAS_NO_VARIADICS 357227825Stheraven 358227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 359227825Stheraven _LIBCPP_INLINE_VISIBILITY 360227825Stheraven void 361227825Stheraven swap(pair& __p) _NOEXCEPT_(__is_nothrow_swappable<first_type>::value && 362227825Stheraven __is_nothrow_swappable<second_type>::value) 363227825Stheraven { 364227825Stheraven _VSTD::iter_swap(&first, &__p.first); 365227825Stheraven _VSTD::iter_swap(&second, &__p.second); 366227825Stheraven } 367227825Stheravenprivate: 368227825Stheraven 369227825Stheraven#ifndef _LIBCPP_HAS_NO_VARIADICS 370227825Stheraven template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 371227825Stheraven _LIBCPP_INLINE_VISIBILITY 372227825Stheraven pair(piecewise_construct_t, 373227825Stheraven tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 374227825Stheraven __tuple_indices<_I1...>, __tuple_indices<_I2...>); 375227825Stheraven#endif // _LIBCPP_HAS_NO_VARIADICS 376227825Stheraven}; 377227825Stheraven 378253159Stheraventemplate <class _T1, class _T2> 379227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 380227825Stheravenbool 381227825Stheravenoperator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 382227825Stheraven{ 383227825Stheraven return __x.first == __y.first && __x.second == __y.second; 384227825Stheraven} 385227825Stheraven 386227825Stheraventemplate <class _T1, class _T2> 387227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 388227825Stheravenbool 389227825Stheravenoperator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 390227825Stheraven{ 391227825Stheraven return !(__x == __y); 392227825Stheraven} 393227825Stheraven 394227825Stheraventemplate <class _T1, class _T2> 395227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 396227825Stheravenbool 397227825Stheravenoperator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 398227825Stheraven{ 399227825Stheraven return __x.first < __y.first || (!(__y.first < __x.first) && __x.second < __y.second); 400227825Stheraven} 401227825Stheraven 402227825Stheraventemplate <class _T1, class _T2> 403227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 404227825Stheravenbool 405227825Stheravenoperator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 406227825Stheraven{ 407227825Stheraven return __y < __x; 408227825Stheraven} 409227825Stheraven 410227825Stheraventemplate <class _T1, class _T2> 411227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 412227825Stheravenbool 413227825Stheravenoperator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 414232950Stheraven{ 415227825Stheraven return !(__x < __y); 416227825Stheraven} 417227825Stheraven 418227825Stheraventemplate <class _T1, class _T2> 419227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 420227825Stheravenbool 421227825Stheravenoperator<=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 422227825Stheraven{ 423227825Stheraven return !(__y < __x); 424227825Stheraven} 425232950Stheraven 426227825Stheraventemplate <class _T1, class _T2> 427227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 428227825Stheraventypename enable_if 429227825Stheraven< 430227825Stheraven __is_swappable<_T1>::value && 431227825Stheraven __is_swappable<_T2>::value, 432227825Stheraven void 433227825Stheraven>::type 434227825Stheravenswap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) 435227825Stheraven _NOEXCEPT_((__is_nothrow_swappable<_T1>::value && 436227825Stheraven __is_nothrow_swappable<_T2>::value)) 437232950Stheraven{ 438227825Stheraven __x.swap(__y); 439227825Stheraven} 440227825Stheraven 441227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 442227825Stheraven 443262801Sdimtemplate <class _Tp> class _LIBCPP_TYPE_VIS reference_wrapper; 444227825Stheraven 445253159Stheraventemplate <class _Tp> 446227825Stheravenstruct ___make_pair_return 447232950Stheraven{ 448253159Stheraven typedef _Tp type; 449227825Stheraven}; 450227825Stheraven 451227825Stheraventemplate <class _Tp> 452262801Sdimstruct ___make_pair_return<reference_wrapper<_Tp>> 453227825Stheraven{ 454227825Stheraven typedef _Tp& type; 455253159Stheraven}; 456253159Stheraven 457253159Stheraventemplate <class _Tp> 458227825Stheravenstruct __make_pair_return 459227825Stheraven{ 460227825Stheraven typedef typename ___make_pair_return<typename decay<_Tp>::type>::type type; 461227825Stheraven}; 462262801Sdim 463227825Stheraventemplate <class _T1, class _T2> 464253159Stheraveninline _LIBCPP_INLINE_VISIBILITY 465253159Stheravenpair<typename __make_pair_return<_T1>::type, typename __make_pair_return<_T2>::type> 466253159Stheravenmake_pair(_T1&& __t1, _T2&& __t2) 467227825Stheraven{ 468227825Stheraven return pair<typename __make_pair_return<_T1>::type, typename __make_pair_return<_T2>::type> 469227825Stheraven (_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2)); 470227825Stheraven} 471227825Stheraven 472227825Stheraven#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 473253159Stheraven 474227825Stheraventemplate <class _T1, class _T2> 475227825Stheraveninline _LIBCPP_INLINE_VISIBILITY 476227825Stheravenpair<_T1,_T2> 477227825Stheravenmake_pair(_T1 __x, _T2 __y) 478227825Stheraven{ 479227825Stheraven return pair<_T1, _T2>(__x, __y); 480227825Stheraven} 481262801Sdim 482227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 483227825Stheraven 484227825Stheraventemplate <class _T1, class _T2> 485227825Stheraven class _LIBCPP_TYPE_VIS tuple_size<pair<_T1, _T2> > 486227825Stheraven : public integral_constant<size_t, 2> {}; 487227825Stheraven 488227825Stheraventemplate <class _T1, class _T2> 489227825Stheraven class _LIBCPP_TYPE_VIS tuple_size<const pair<_T1, _T2> > 490227825Stheraven : public integral_constant<size_t, 2> {}; 491227825Stheraven 492227825Stheraventemplate <class _T1, class _T2> 493227825Stheravenclass _LIBCPP_TYPE_VIS tuple_element<0, pair<_T1, _T2> > 494227825Stheraven{ 495227825Stheravenpublic: 496227825Stheraven typedef _T1 type; 497227825Stheraven}; 498227825Stheraven 499227825Stheraventemplate <class _T1, class _T2> 500227825Stheravenclass _LIBCPP_TYPE_VIS tuple_element<1, pair<_T1, _T2> > 501227825Stheraven{ 502249998Sdimpublic: 503249998Sdim typedef _T2 type; 504249998Sdim}; 505227825Stheraven 506227825Stheraventemplate <class _T1, class _T2> 507227825Stheravenclass _LIBCPP_TYPE_VIS tuple_element<0, const pair<_T1, _T2> > 508227825Stheraven{ 509227825Stheravenpublic: 510227825Stheraven typedef const _T1 type; 511227825Stheraven}; 512227825Stheraven 513227825Stheraventemplate <class _T1, class _T2> 514227825Stheravenclass _LIBCPP_TYPE_VIS tuple_element<1, const pair<_T1, _T2> > 515227825Stheraven{ 516227825Stheravenpublic: 517227825Stheraven typedef const _T2 type; 518227825Stheraven}; 519227825Stheraven 520227825Stheraventemplate <size_t _Ip> struct __get_pair; 521262801Sdim 522262801Sdimtemplate <> 523262801Sdimstruct __get_pair<0> 524227825Stheraven{ 525227825Stheraven template <class _T1, class _T2> 526227825Stheraven static 527262801Sdim _LIBCPP_INLINE_VISIBILITY 528227825Stheraven _T1& 529249998Sdim get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 530249998Sdim 531249998Sdim template <class _T1, class _T2> 532262801Sdim static 533262801Sdim _LIBCPP_INLINE_VISIBILITY 534227825Stheraven const _T1& 535227825Stheraven get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 536227825Stheraven 537249998Sdim#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 538249998Sdim 539249998Sdim template <class _T1, class _T2> 540249998Sdim static 541227825Stheraven _LIBCPP_INLINE_VISIBILITY 542262801Sdim _T1&& 543249998Sdim get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);} 544249998Sdim 545249998Sdim#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 546262801Sdim}; 547262801Sdim 548227825Stheraventemplate <> 549227825Stheravenstruct __get_pair<1> 550249998Sdim{ 551249998Sdim template <class _T1, class _T2> 552249998Sdim static 553249998Sdim _LIBCPP_INLINE_VISIBILITY 554227825Stheraven _T2& 555227825Stheraven get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 556227825Stheraven 557227825Stheraven template <class _T1, class _T2> 558227825Stheraven static 559227825Stheraven _LIBCPP_INLINE_VISIBILITY 560227825Stheraven const _T2& 561227825Stheraven get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 562227825Stheraven 563227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 564227825Stheraven 565227825Stheraven template <class _T1, class _T2> 566227825Stheraven static 567227825Stheraven _LIBCPP_INLINE_VISIBILITY 568227825Stheraven _T2&& 569227825Stheraven get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T2>(__p.second);} 570227825Stheraven 571227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 572227825Stheraven}; 573227825Stheraven 574227825Stheraventemplate <size_t _Ip, class _T1, class _T2> 575227825Stheraven_LIBCPP_INLINE_VISIBILITY inline 576227825Stheraventypename tuple_element<_Ip, pair<_T1, _T2> >::type& 577227825Stheravenget(pair<_T1, _T2>& __p) _NOEXCEPT 578227825Stheraven{ 579227825Stheraven return __get_pair<_Ip>::get(__p); 580227825Stheraven} 581227825Stheraven 582227825Stheraventemplate <size_t _Ip, class _T1, class _T2> 583227825Stheraven_LIBCPP_INLINE_VISIBILITY inline 584227825Stheravenconst typename tuple_element<_Ip, pair<_T1, _T2> >::type& 585227825Stheravenget(const pair<_T1, _T2>& __p) _NOEXCEPT 586227825Stheraven{ 587227825Stheraven return __get_pair<_Ip>::get(__p); 588227825Stheraven} 589227825Stheraven 590227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 591227825Stheraven 592227825Stheraventemplate <size_t _Ip, class _T1, class _T2> 593227825Stheraven_LIBCPP_INLINE_VISIBILITY inline 594249998Sdimtypename tuple_element<_Ip, pair<_T1, _T2> >::type&& 595249998Sdimget(pair<_T1, _T2>&& __p) _NOEXCEPT 596249998Sdim{ 597249998Sdim return __get_pair<_Ip>::get(_VSTD::move(__p)); 598227825Stheraven} 599227825Stheraven 600227825Stheraven#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 601227825Stheraven 602227825Stheraven#if _LIBCPP_STD_VER > 11 603227825Stheraven 604249998Sdimtemplate<class _Tp, _Tp... _Ip> 605249998Sdimstruct _LIBCPP_TYPE_VIS integer_sequence 606249998Sdim{ 607249998Sdim typedef _Tp value_type; 608227825Stheraven static_assert( is_integral<_Tp>::value, 609227825Stheraven "std::integer_sequence can only be instantiated with an integral type" ); 610227825Stheraven static 611227825Stheraven _LIBCPP_INLINE_VISIBILITY 612227825Stheraven constexpr 613227825Stheraven size_t 614227825Stheraven size() noexcept { return sizeof...(_Ip); } 615227825Stheraven}; 616227825Stheraven 617227825Stheraventemplate<size_t... _Ip> 618227825Stheraven using index_sequence = integer_sequence<size_t, _Ip...>; 619227825Stheraven 620227825Stheravennamespace __detail { 621227825Stheraven 622227825Stheraventemplate<typename _Tp, size_t ..._Extra> struct __repeat; 623227825Stheraventemplate<typename _Tp, _Tp ..._Np, size_t ..._Extra> struct __repeat<integer_sequence<_Tp, _Np...>, _Extra...> { 624227825Stheraven typedef integer_sequence<_Tp, 625227825Stheraven _Np..., 626227825Stheraven sizeof...(_Np) + _Np..., 627227825Stheraven 2 * sizeof...(_Np) + _Np..., 628227825Stheraven 3 * sizeof...(_Np) + _Np..., 629227825Stheraven 4 * sizeof...(_Np) + _Np..., 630227825Stheraven 5 * sizeof...(_Np) + _Np..., 631227825Stheraven 6 * sizeof...(_Np) + _Np..., 632227825Stheraven 7 * sizeof...(_Np) + _Np..., 633227825Stheraven _Extra...> type; 634227825Stheraven}; 635227825Stheraven 636227825Stheraventemplate<size_t _Np> struct __parity; 637227825Stheraventemplate<size_t _Np> struct __make : __parity<_Np % 8>::template __pmake<_Np> {}; 638227825Stheraven 639227825Stheraventemplate<> struct __make<0> { typedef integer_sequence<size_t> type; }; 640227825Stheraventemplate<> struct __make<1> { typedef integer_sequence<size_t, 0> type; }; 641227825Stheraventemplate<> struct __make<2> { typedef integer_sequence<size_t, 0, 1> type; }; 642227825Stheraventemplate<> struct __make<3> { typedef integer_sequence<size_t, 0, 1, 2> type; }; 643227825Stheraventemplate<> struct __make<4> { typedef integer_sequence<size_t, 0, 1, 2, 3> type; }; 644227825Stheraventemplate<> struct __make<5> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4> type; }; 645227825Stheraventemplate<> struct __make<6> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; }; 646227825Stheraventemplate<> struct __make<7> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; }; 647227825Stheraven 648227825Stheraventemplate<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; }; 649227825Stheraventemplate<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; }; 650227825Stheraventemplate<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; }; 651227825Stheraventemplate<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; }; 652227825Stheraventemplate<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; 653227825Stheraventemplate<> 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> {}; }; 654227825Stheraventemplate<> 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> {}; }; 655227825Stheraventemplate<> 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> {}; }; 656227825Stheraven 657227825Stheraventemplate<typename _Tp, typename _Up> struct __convert { 658227825Stheraven template<typename> struct __result; 659227825Stheraven template<_Tp ..._Np> struct __result<integer_sequence<_Tp, _Np...> > { typedef integer_sequence<_Up, _Np...> type; }; 660227825Stheraven}; 661227825Stheraventemplate<typename _Tp> struct __convert<_Tp, _Tp> { template<typename _Up> struct __result { typedef _Up type; }; }; 662227825Stheraven 663227825Stheraven} 664227825Stheraven 665227825Stheraventemplate<typename _Tp, _Tp _Np> using __make_integer_sequence_unchecked = 666227825Stheraven typename __detail::__convert<size_t, _Tp>::template __result<typename __detail::__make<_Np>::type>::type; 667227825Stheraven 668227825Stheraventemplate <class _Tp, _Tp _Ep> 669227825Stheravenstruct __make_integer_sequence 670227825Stheraven{ 671227825Stheraven static_assert(is_integral<_Tp>::value, 672227825Stheraven "std::make_integer_sequence can only be instantiated with an integral type" ); 673227825Stheraven static_assert(0 <= _Ep, "std::make_integer_sequence input shall not be negative"); 674227825Stheraven typedef __make_integer_sequence_unchecked<_Tp, _Ep> type; 675227825Stheraven}; 676227825Stheraven 677227825Stheraventemplate<class _Tp, _Tp _Np> 678227825Stheraven using make_integer_sequence = typename __make_integer_sequence<_Tp, _Np>::type; 679227825Stheraven 680227825Stheraventemplate<size_t _Np> 681227825Stheraven using make_index_sequence = make_integer_sequence<size_t, _Np>; 682227825Stheraven 683227825Stheraventemplate<class... _Tp> 684227825Stheraven using index_sequence_for = make_index_sequence<sizeof...(_Tp)>; 685227825Stheraven 686227825Stheraven#endif // _LIBCPP_STD_VER > 11 687227825Stheraven 688227825Stheraven_LIBCPP_END_NAMESPACE_STD 689227825Stheraven 690227825Stheraven#endif // _LIBCPP_UTILITY 691227825Stheraven