13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===-------------------------- utility -----------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 83e519524SHoward Hinnant// 93e519524SHoward Hinnant//===----------------------------------------------------------------------===// 103e519524SHoward Hinnant 113e519524SHoward Hinnant#ifndef _LIBCPP_UTILITY 123e519524SHoward Hinnant#define _LIBCPP_UTILITY 133e519524SHoward Hinnant 143e519524SHoward Hinnant/* 153e519524SHoward Hinnant utility synopsis 163e519524SHoward Hinnant 173e519524SHoward Hinnantnamespace std 183e519524SHoward Hinnant{ 193e519524SHoward Hinnant 203e519524SHoward Hinnanttemplate <class T> 213e519524SHoward Hinnant void 223e519524SHoward Hinnant swap(T& a, T& b); 233e519524SHoward Hinnant 243e519524SHoward Hinnantnamespace rel_ops 253e519524SHoward Hinnant{ 263e519524SHoward Hinnant template<class T> bool operator!=(const T&, const T&); 273e519524SHoward Hinnant template<class T> bool operator> (const T&, const T&); 283e519524SHoward Hinnant template<class T> bool operator<=(const T&, const T&); 293e519524SHoward Hinnant template<class T> bool operator>=(const T&, const T&); 303e519524SHoward Hinnant} 313e519524SHoward Hinnant 32a676f7d3SHoward Hinnanttemplate<class T> 33a676f7d3SHoward Hinnantvoid 34a676f7d3SHoward Hinnantswap(T& a, T& b) noexcept(is_nothrow_move_constructible<T>::value && 35a676f7d3SHoward Hinnant is_nothrow_move_assignable<T>::value); 363e519524SHoward Hinnant 37a676f7d3SHoward Hinnanttemplate <class T, size_t N> 38a676f7d3SHoward Hinnantvoid 39a676f7d3SHoward Hinnantswap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b))); 40a676f7d3SHoward Hinnant 411c682f0fSMarshall Clowtemplate <class T> T&& forward(typename remove_reference<T>::type& t) noexcept; // constexpr in C++14 421c682f0fSMarshall Clowtemplate <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept; // constexpr in C++14 43a676f7d3SHoward Hinnant 441c682f0fSMarshall Clowtemplate <class T> typename remove_reference<T>::type&& move(T&&) noexcept; // constexpr in C++14 453e519524SHoward Hinnant 463e519524SHoward Hinnanttemplate <class T> 473e519524SHoward Hinnant typename conditional 483e519524SHoward Hinnant < 49ca740483SHoward Hinnant !is_nothrow_move_constructible<T>::value && is_copy_constructible<T>::value, 503e519524SHoward Hinnant const T&, 513e519524SHoward Hinnant T&& 523e519524SHoward Hinnant >::type 531c682f0fSMarshall Clow move_if_noexcept(T& x) noexcept; // constexpr in C++14 543e519524SHoward Hinnant 55dbd2d328SMarshall Clowtemplate <class T> constexpr add_const<T>_t& as_const(T& t) noexcept; // C++17 56dbd2d328SMarshall Clowtemplate <class T> void as_const(const T&&) = delete; // C++17 57dbd2d328SMarshall Clow 583e519524SHoward Hinnanttemplate <class T> typename add_rvalue_reference<T>::type declval() noexcept; 593e519524SHoward Hinnant 603e519524SHoward Hinnanttemplate <class T1, class T2> 613e519524SHoward Hinnantstruct pair 623e519524SHoward Hinnant{ 633e519524SHoward Hinnant typedef T1 first_type; 643e519524SHoward Hinnant typedef T2 second_type; 653e519524SHoward Hinnant 663e519524SHoward Hinnant T1 first; 673e519524SHoward Hinnant T2 second; 683e519524SHoward Hinnant 693e519524SHoward Hinnant pair(const pair&) = default; 70a676f7d3SHoward Hinnant pair(pair&&) = default; 713e519524SHoward Hinnant constexpr pair(); 7218191cebSMarshall Clow pair(const T1& x, const T2& y); // constexpr in C++14 7318191cebSMarshall Clow template <class U, class V> pair(U&& x, V&& y); // constexpr in C++14 7418191cebSMarshall Clow template <class U, class V> pair(const pair<U, V>& p); // constexpr in C++14 7518191cebSMarshall Clow template <class U, class V> pair(pair<U, V>&& p); // constexpr in C++14 763e519524SHoward Hinnant template <class... Args1, class... Args2> 773e519524SHoward Hinnant pair(piecewise_construct_t, tuple<Args1...> first_args, 783e519524SHoward Hinnant tuple<Args2...> second_args); 793e519524SHoward Hinnant 803e519524SHoward Hinnant template <class U, class V> pair& operator=(const pair<U, V>& p); 81a676f7d3SHoward Hinnant pair& operator=(pair&& p) noexcept(is_nothrow_move_assignable<T1>::value && 82a676f7d3SHoward Hinnant is_nothrow_move_assignable<T2>::value); 833e519524SHoward Hinnant template <class U, class V> pair& operator=(pair<U, V>&& p); 843e519524SHoward Hinnant 85a676f7d3SHoward Hinnant void swap(pair& p) noexcept(noexcept(swap(first, p.first)) && 86a676f7d3SHoward Hinnant noexcept(swap(second, p.second))); 873e519524SHoward Hinnant}; 883e519524SHoward Hinnant 8918191cebSMarshall Clowtemplate <class T1, class T2> bool operator==(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 9018191cebSMarshall Clowtemplate <class T1, class T2> bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 9118191cebSMarshall Clowtemplate <class T1, class T2> bool operator< (const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 9218191cebSMarshall Clowtemplate <class T1, class T2> bool operator> (const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 9318191cebSMarshall Clowtemplate <class T1, class T2> bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 9418191cebSMarshall Clowtemplate <class T1, class T2> bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14 953e519524SHoward Hinnant 9618191cebSMarshall Clowtemplate <class T1, class T2> pair<V1, V2> make_pair(T1&&, T2&&); // constexpr in C++14 97a676f7d3SHoward Hinnanttemplate <class T1, class T2> 98a676f7d3SHoward Hinnantvoid 99a676f7d3SHoward Hinnantswap(pair<T1, T2>& x, pair<T1, T2>& y) noexcept(noexcept(x.swap(y))); 1003e519524SHoward Hinnant 1013e519524SHoward Hinnantstruct piecewise_construct_t { }; 1023e519524SHoward Hinnantconstexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); 1033e519524SHoward Hinnant 1043e519524SHoward Hinnanttemplate <class T> class tuple_size; 1053e519524SHoward Hinnanttemplate <size_t I, class T> class tuple_element; 1063e519524SHoward Hinnant 10705c8dad2SMarshall Clowtemplate <class T1, class T2> struct tuple_size<pair<T1, T2> >; 10805c8dad2SMarshall Clowtemplate <class T1, class T2> struct tuple_element<0, pair<T1, T2> >; 10905c8dad2SMarshall Clowtemplate <class T1, class T2> struct tuple_element<1, pair<T1, T2> >; 1103e519524SHoward Hinnant 1113e519524SHoward Hinnanttemplate<size_t I, class T1, class T2> 11205c8dad2SMarshall Clow typename tuple_element<I, pair<T1, T2> >::type& 11305c8dad2SMarshall Clow get(pair<T1, T2>&) noexcept; // constexpr in C++14 1143e519524SHoward Hinnant 1153e519524SHoward Hinnanttemplate<size_t I, class T1, class T2> 116*bfb3f2bfSMarshall Clow const typename tuple_element<I, pair<T1, T2> >::type& 11705c8dad2SMarshall Clow get(const pair<T1, T2>&) noexcept; // constexpr in C++14 1183e519524SHoward Hinnant 119601afb30SHoward Hinnanttemplate<size_t I, class T1, class T2> 12005c8dad2SMarshall Clow typename tuple_element<I, pair<T1, T2> >::type&& 12105c8dad2SMarshall Clow get(pair<T1, T2>&&) noexcept; // constexpr in C++14 122601afb30SHoward Hinnant 123e99520c7SMarshall Clowtemplate<class T1, class T2> 12405c8dad2SMarshall Clow constexpr T1& get(pair<T1, T2>&) noexcept; // C++14 125e99520c7SMarshall Clow 126e99520c7SMarshall Clowtemplate<size_t I, class T1, class T2> 127*bfb3f2bfSMarshall Clow constexpr const T1& get(const pair<T1, T2>&) noexcept; // C++14 128e99520c7SMarshall Clow 129e99520c7SMarshall Clowtemplate<size_t I, class T1, class T2> 13005c8dad2SMarshall Clow constexpr T1&& get(pair<T1, T2>&&) noexcept; // C++14 131e99520c7SMarshall Clow 132d5189106SMarshall Clow// C++14 133d5189106SMarshall Clow 134d5189106SMarshall Clowtemplate<class T, T... I> 135d5189106SMarshall Clowstruct integer_sequence 136d5189106SMarshall Clow{ 137d5189106SMarshall Clow typedef T value_type; 138d5189106SMarshall Clow 139d5189106SMarshall Clow static constexpr size_t size() noexcept; 140d5189106SMarshall Clow}; 141d5189106SMarshall Clow 142d5189106SMarshall Clowtemplate<size_t... I> 143d5189106SMarshall Clow using index_sequence = integer_sequence<size_t, I...>; 144d5189106SMarshall Clow 145d5189106SMarshall Clowtemplate<class T, T N> 146d5189106SMarshall Clow using make_integer_sequence = integer_sequence<T, 0, 1, ..., N-1>; 147d5189106SMarshall Clowtemplate<size_t N> 148d5189106SMarshall Clow using make_index_sequence = make_integer_sequence<size_t, N>; 149d5189106SMarshall Clow 150d5189106SMarshall Clowtemplate<class... T> 151d5189106SMarshall Clow using index_sequence_for = make_index_sequence<sizeof...(T)>; 152d5189106SMarshall Clow 153a7b0e5ddSMarshall Clowtemplate<class T, class U=T> 154a7b0e5ddSMarshall Clow T exchange(T& obj, U&& new_value); 1553e519524SHoward Hinnant} // std 1563e519524SHoward Hinnant 1573e519524SHoward Hinnant*/ 1583e519524SHoward Hinnant 1593e519524SHoward Hinnant#include <__config> 1603e519524SHoward Hinnant#include <__tuple> 1613e519524SHoward Hinnant#include <type_traits> 1623e519524SHoward Hinnant 163073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1643e519524SHoward Hinnant#pragma GCC system_header 165073458b1SHoward Hinnant#endif 1663e519524SHoward Hinnant 1673e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 1683e519524SHoward Hinnant 1693e519524SHoward Hinnantnamespace rel_ops 1703e519524SHoward Hinnant{ 1713e519524SHoward Hinnant 1723e519524SHoward Hinnanttemplate<class _Tp> 1733e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1743e519524SHoward Hinnantbool 1753e519524SHoward Hinnantoperator!=(const _Tp& __x, const _Tp& __y) 1763e519524SHoward Hinnant{ 1773e519524SHoward Hinnant return !(__x == __y); 1783e519524SHoward Hinnant} 1793e519524SHoward Hinnant 1803e519524SHoward Hinnanttemplate<class _Tp> 1813e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1823e519524SHoward Hinnantbool 1833e519524SHoward Hinnantoperator> (const _Tp& __x, const _Tp& __y) 1843e519524SHoward Hinnant{ 1853e519524SHoward Hinnant return __y < __x; 1863e519524SHoward Hinnant} 1873e519524SHoward Hinnant 1883e519524SHoward Hinnanttemplate<class _Tp> 1893e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1903e519524SHoward Hinnantbool 1913e519524SHoward Hinnantoperator<=(const _Tp& __x, const _Tp& __y) 1923e519524SHoward Hinnant{ 1933e519524SHoward Hinnant return !(__y < __x); 1943e519524SHoward Hinnant} 1953e519524SHoward Hinnant 1963e519524SHoward Hinnanttemplate<class _Tp> 1973e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1983e519524SHoward Hinnantbool 1993e519524SHoward Hinnantoperator>=(const _Tp& __x, const _Tp& __y) 2003e519524SHoward Hinnant{ 2013e519524SHoward Hinnant return !(__x < __y); 2023e519524SHoward Hinnant} 2033e519524SHoward Hinnant 2043e519524SHoward Hinnant} // rel_ops 2053e519524SHoward Hinnant 2063e519524SHoward Hinnant// swap_ranges 2073e519524SHoward Hinnant 208d632356aSMarshall Clow// forward 209d632356aSMarshall Clowtemplate<class _Tp, size_t _Np> 210f6d58a2aSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 211d632356aSMarshall Clowvoid swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value); 212d632356aSMarshall Clow 2133e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2> 2143e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2153e519524SHoward Hinnant_ForwardIterator2 2163e519524SHoward Hinnantswap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) 2173e519524SHoward Hinnant{ 218910285b2SEric Fiselier for(; __first1 != __last1; ++__first1, (void) ++__first2) 2193e519524SHoward Hinnant swap(*__first1, *__first2); 2203e519524SHoward Hinnant return __first2; 2213e519524SHoward Hinnant} 2223e519524SHoward Hinnant 223c003db1fSHoward Hinnanttemplate<class _Tp, size_t _Np> 2243e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2253e519524SHoward Hinnantvoid 226c003db1fSHoward Hinnantswap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) 2273e519524SHoward Hinnant{ 228c003db1fSHoward Hinnant _VSTD::swap_ranges(__a, __a + _Np, __b); 2293e519524SHoward Hinnant} 2303e519524SHoward Hinnant 2313e519524SHoward Hinnanttemplate <class _Tp> 2321c682f0fSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2337609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2343e519524SHoward Hinnanttypename conditional 2353e519524SHoward Hinnant< 236ca740483SHoward Hinnant !is_nothrow_move_constructible<_Tp>::value && is_copy_constructible<_Tp>::value, 2373e519524SHoward Hinnant const _Tp&, 2383e519524SHoward Hinnant _Tp&& 2393e519524SHoward Hinnant>::type 2407609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 2413e519524SHoward Hinnantconst _Tp& 2423e519524SHoward Hinnant#endif 243a676f7d3SHoward Hinnantmove_if_noexcept(_Tp& __x) _NOEXCEPT 2443e519524SHoward Hinnant{ 245ce48a113SHoward Hinnant return _VSTD::move(__x); 2463e519524SHoward Hinnant} 2473e519524SHoward Hinnant 248dbd2d328SMarshall Clow#if _LIBCPP_STD_VER > 14 249dbd2d328SMarshall Clowtemplate <class _Tp> constexpr add_const_t<_Tp>& as_const(_Tp& __t) noexcept { return __t; } 250dbd2d328SMarshall Clowtemplate <class _Tp> void as_const(const _Tp&&) = delete; 251dbd2d328SMarshall Clow#endif 252dbd2d328SMarshall Clow 253f0544c20SHoward Hinnantstruct _LIBCPP_TYPE_VIS_ONLY piecewise_construct_t { }; 2547e5b4c93SHoward Hinnant#if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_UTILITY) 2553e519524SHoward Hinnantextern const piecewise_construct_t piecewise_construct;// = piecewise_construct_t(); 256b2e9f19cSHoward Hinnant#else 257b2e9f19cSHoward Hinnantconstexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); 258b2e9f19cSHoward Hinnant#endif 2593e519524SHoward Hinnant 2603e519524SHoward Hinnanttemplate <class _T1, class _T2> 261f0544c20SHoward Hinnantstruct _LIBCPP_TYPE_VIS_ONLY pair 2623e519524SHoward Hinnant{ 2633e519524SHoward Hinnant typedef _T1 first_type; 2643e519524SHoward Hinnant typedef _T2 second_type; 2653e519524SHoward Hinnant 2663e519524SHoward Hinnant _T1 first; 2673e519524SHoward Hinnant _T2 second; 2683e519524SHoward Hinnant 269a676f7d3SHoward Hinnant // pair(const pair&) = default; 270a676f7d3SHoward Hinnant // pair(pair&&) = default; 271a676f7d3SHoward Hinnant 272b2e9f19cSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pair() : first(), second() {} 2733e519524SHoward Hinnant 27418191cebSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 27518191cebSMarshall Clow pair(const _T1& __x, const _T2& __y) 2763e519524SHoward Hinnant : first(__x), second(__y) {} 2773e519524SHoward Hinnant 278575d41eeSHoward Hinnant template<class _U1, class _U2> 27918191cebSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 28002364191SHoward Hinnant pair(const pair<_U1, _U2>& __p 28102364191SHoward Hinnant#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 282c4186540SHoward Hinnant ,typename enable_if<is_convertible<const _U1&, _T1>::value && 283c4186540SHoward Hinnant is_convertible<const _U2&, _T2>::value>::type* = 0 28402364191SHoward Hinnant#endif 28502364191SHoward Hinnant ) 286575d41eeSHoward Hinnant : first(__p.first), second(__p.second) {} 287575d41eeSHoward Hinnant 288f9fd0d6dSHoward Hinnant#if !defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && _LIBCPP_TRIVIAL_PAIR_COPY_CTOR 28918191cebSMarshall Clow _LIBCPP_INLINE_VISIBILITY 29018191cebSMarshall Clow pair(const pair& __p) = default; 291f9fd0d6dSHoward Hinnant#elif !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) || !_LIBCPP_TRIVIAL_PAIR_COPY_CTOR 292a676f7d3SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2935a33687dSHoward Hinnant pair(const pair& __p) 2945a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value && 2955a33687dSHoward Hinnant is_nothrow_copy_constructible<second_type>::value) 2965a33687dSHoward Hinnant : first(__p.first), 2975a33687dSHoward Hinnant second(__p.second) 2985a33687dSHoward Hinnant { 2995a33687dSHoward Hinnant } 30018191cebSMarshall Clow#endif 3015a33687dSHoward Hinnant 3025a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 303a676f7d3SHoward Hinnant pair& operator=(const pair& __p) 3045a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<first_type>::value && 3055a33687dSHoward Hinnant is_nothrow_copy_assignable<second_type>::value) 306a676f7d3SHoward Hinnant { 307a676f7d3SHoward Hinnant first = __p.first; 308a676f7d3SHoward Hinnant second = __p.second; 309a676f7d3SHoward Hinnant return *this; 310a676f7d3SHoward Hinnant } 311a676f7d3SHoward Hinnant 3127609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3133e519524SHoward Hinnant 3143e519524SHoward Hinnant template <class _U1, class _U2, 315c4186540SHoward Hinnant class = typename enable_if<is_convertible<_U1, first_type>::value && 316c4186540SHoward Hinnant is_convertible<_U2, second_type>::value>::type> 31718191cebSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3183e519524SHoward Hinnant pair(_U1&& __u1, _U2&& __u2) 319ce48a113SHoward Hinnant : first(_VSTD::forward<_U1>(__u1)), 320ce48a113SHoward Hinnant second(_VSTD::forward<_U2>(__u2)) 3213e519524SHoward Hinnant {} 3223e519524SHoward Hinnant 323575d41eeSHoward Hinnant template<class _U1, class _U2> 32418191cebSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 325575d41eeSHoward Hinnant pair(pair<_U1, _U2>&& __p, 326c4186540SHoward Hinnant typename enable_if<is_convertible<_U1, _T1>::value && 327c4186540SHoward Hinnant is_convertible<_U2, _T2>::value>::type* = 0) 328ce48a113SHoward Hinnant : first(_VSTD::forward<_U1>(__p.first)), 329ce48a113SHoward Hinnant second(_VSTD::forward<_U2>(__p.second)) {} 330575d41eeSHoward Hinnant 33118191cebSMarshall Clow#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 33218191cebSMarshall Clow _LIBCPP_INLINE_VISIBILITY 33318191cebSMarshall Clow pair(pair&& __p) = default; 33418191cebSMarshall Clow#else 335a676f7d3SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3365a33687dSHoward Hinnant pair(pair&& __p) _NOEXCEPT_(is_nothrow_move_constructible<first_type>::value && 3375a33687dSHoward Hinnant is_nothrow_move_constructible<second_type>::value) 3385a33687dSHoward Hinnant : first(_VSTD::forward<first_type>(__p.first)), 3395a33687dSHoward Hinnant second(_VSTD::forward<second_type>(__p.second)) 3405a33687dSHoward Hinnant { 3415a33687dSHoward Hinnant } 34218191cebSMarshall Clow#endif 3435a33687dSHoward Hinnant 3445a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 345a676f7d3SHoward Hinnant pair& 346a676f7d3SHoward Hinnant operator=(pair&& __p) _NOEXCEPT_(is_nothrow_move_assignable<first_type>::value && 347a676f7d3SHoward Hinnant is_nothrow_move_assignable<second_type>::value) 348a676f7d3SHoward Hinnant { 349ce48a113SHoward Hinnant first = _VSTD::forward<first_type>(__p.first); 350ce48a113SHoward Hinnant second = _VSTD::forward<second_type>(__p.second); 351a676f7d3SHoward Hinnant return *this; 352a676f7d3SHoward Hinnant } 353a676f7d3SHoward Hinnant 354f5799be4SMichael J. Spencer#ifndef _LIBCPP_HAS_NO_VARIADICS 355f5799be4SMichael J. Spencer 3563e519524SHoward Hinnant template<class _Tuple, 3573e519524SHoward Hinnant class = typename enable_if<__tuple_convertible<_Tuple, pair>::value>::type> 35818191cebSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3593e519524SHoward Hinnant pair(_Tuple&& __p) 360ce48a113SHoward Hinnant : first(_VSTD::forward<typename tuple_element<0, 361f9af6140SMarshall Clow typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<0>(__p))), 362ce48a113SHoward Hinnant second(_VSTD::forward<typename tuple_element<1, 363f9af6140SMarshall Clow typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<1>(__p))) 3643e519524SHoward Hinnant {} 3653e519524SHoward Hinnant 366f5799be4SMichael J. Spencer 367c4931c47SHoward Hinnant 368a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2> 369789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3703e519524SHoward Hinnant pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, 3713e519524SHoward Hinnant tuple<_Args2...> __second_args) 3723e519524SHoward Hinnant : pair(__pc, __first_args, __second_args, 3733e519524SHoward Hinnant typename __make_tuple_indices<sizeof...(_Args1)>::type(), 3743e519524SHoward Hinnant typename __make_tuple_indices<sizeof...(_Args2) >::type()) 3753e519524SHoward Hinnant {} 3763e519524SHoward Hinnant 3773e519524SHoward Hinnant template <class _Tuple, 3783e519524SHoward Hinnant class = typename enable_if<__tuple_assignable<_Tuple, pair>::value>::type> 379789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3803e519524SHoward Hinnant pair& 3813e519524SHoward Hinnant operator=(_Tuple&& __p) 3823e519524SHoward Hinnant { 3833e519524SHoward Hinnant typedef typename __make_tuple_types<_Tuple>::type _TupleRef; 3843e519524SHoward Hinnant typedef typename tuple_element<0, _TupleRef>::type _U0; 3853e519524SHoward Hinnant typedef typename tuple_element<1, _TupleRef>::type _U1; 386ce48a113SHoward Hinnant first = _VSTD::forward<_U0>(_VSTD::get<0>(__p)); 387ce48a113SHoward Hinnant second = _VSTD::forward<_U1>(_VSTD::get<1>(__p)); 3883e519524SHoward Hinnant return *this; 3893e519524SHoward Hinnant } 3903e519524SHoward Hinnant 391f5799be4SMichael J. Spencer#endif // _LIBCPP_HAS_NO_VARIADICS 392f5799be4SMichael J. Spencer 3937609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 394a676f7d3SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 395a676f7d3SHoward Hinnant void 39627d0a2a7SHoward Hinnant swap(pair& __p) _NOEXCEPT_(__is_nothrow_swappable<first_type>::value && 39727d0a2a7SHoward Hinnant __is_nothrow_swappable<second_type>::value) 398a676f7d3SHoward Hinnant { 3990510a5adSMarshall Clow using _VSTD::swap; 4000510a5adSMarshall Clow swap(first, __p.first); 4010510a5adSMarshall Clow swap(second, __p.second); 402a676f7d3SHoward Hinnant } 4033e519524SHoward Hinnantprivate: 4043e519524SHoward Hinnant 4053e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 4063e519524SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 40725036268SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4083e519524SHoward Hinnant pair(piecewise_construct_t, 4093e519524SHoward Hinnant tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 4103e519524SHoward Hinnant __tuple_indices<_I1...>, __tuple_indices<_I2...>); 411b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 4123e519524SHoward Hinnant}; 4133e519524SHoward Hinnant 4143e519524SHoward Hinnanttemplate <class _T1, class _T2> 41518191cebSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4163e519524SHoward Hinnantbool 4173e519524SHoward Hinnantoperator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 4183e519524SHoward Hinnant{ 4193e519524SHoward Hinnant return __x.first == __y.first && __x.second == __y.second; 4203e519524SHoward Hinnant} 4213e519524SHoward Hinnant 4223e519524SHoward Hinnanttemplate <class _T1, class _T2> 42318191cebSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4243e519524SHoward Hinnantbool 4253e519524SHoward Hinnantoperator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 4263e519524SHoward Hinnant{ 4273e519524SHoward Hinnant return !(__x == __y); 4283e519524SHoward Hinnant} 4293e519524SHoward Hinnant 4303e519524SHoward Hinnanttemplate <class _T1, class _T2> 43118191cebSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4323e519524SHoward Hinnantbool 4333e519524SHoward Hinnantoperator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 4343e519524SHoward Hinnant{ 4353e519524SHoward Hinnant return __x.first < __y.first || (!(__y.first < __x.first) && __x.second < __y.second); 4363e519524SHoward Hinnant} 4373e519524SHoward Hinnant 4383e519524SHoward Hinnanttemplate <class _T1, class _T2> 43918191cebSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4403e519524SHoward Hinnantbool 4413e519524SHoward Hinnantoperator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 4423e519524SHoward Hinnant{ 4433e519524SHoward Hinnant return __y < __x; 4443e519524SHoward Hinnant} 4453e519524SHoward Hinnant 4463e519524SHoward Hinnanttemplate <class _T1, class _T2> 44718191cebSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4483e519524SHoward Hinnantbool 4493e519524SHoward Hinnantoperator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 4503e519524SHoward Hinnant{ 4513e519524SHoward Hinnant return !(__x < __y); 4523e519524SHoward Hinnant} 4533e519524SHoward Hinnant 4543e519524SHoward Hinnanttemplate <class _T1, class _T2> 45518191cebSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4563e519524SHoward Hinnantbool 4573e519524SHoward Hinnantoperator<=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) 4583e519524SHoward Hinnant{ 4593e519524SHoward Hinnant return !(__y < __x); 4603e519524SHoward Hinnant} 4613e519524SHoward Hinnant 4623e519524SHoward Hinnanttemplate <class _T1, class _T2> 4633e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 464bc95cf0dSHoward Hinnanttypename enable_if 465bc95cf0dSHoward Hinnant< 466bc95cf0dSHoward Hinnant __is_swappable<_T1>::value && 467bc95cf0dSHoward Hinnant __is_swappable<_T2>::value, 4683e519524SHoward Hinnant void 469bc95cf0dSHoward Hinnant>::type 4703e519524SHoward Hinnantswap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) 47127d0a2a7SHoward Hinnant _NOEXCEPT_((__is_nothrow_swappable<_T1>::value && 47227d0a2a7SHoward Hinnant __is_nothrow_swappable<_T2>::value)) 4733e519524SHoward Hinnant{ 474a676f7d3SHoward Hinnant __x.swap(__y); 4753e519524SHoward Hinnant} 4763e519524SHoward Hinnant 4777609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4783e519524SHoward Hinnant 479f0544c20SHoward Hinnanttemplate <class _Tp> class _LIBCPP_TYPE_VIS_ONLY reference_wrapper; 4803e519524SHoward Hinnant 4813e519524SHoward Hinnanttemplate <class _Tp> 4820724bf67SMarshall Clowstruct __make_pair_return_impl 4833e519524SHoward Hinnant{ 4843e519524SHoward Hinnant typedef _Tp type; 4853e519524SHoward Hinnant}; 4863e519524SHoward Hinnant 4873e519524SHoward Hinnanttemplate <class _Tp> 4880724bf67SMarshall Clowstruct __make_pair_return_impl<reference_wrapper<_Tp>> 4893e519524SHoward Hinnant{ 4903e519524SHoward Hinnant typedef _Tp& type; 4913e519524SHoward Hinnant}; 4923e519524SHoward Hinnant 4933e519524SHoward Hinnanttemplate <class _Tp> 4943e519524SHoward Hinnantstruct __make_pair_return 4953e519524SHoward Hinnant{ 4960724bf67SMarshall Clow typedef typename __make_pair_return_impl<typename decay<_Tp>::type>::type type; 4973e519524SHoward Hinnant}; 4983e519524SHoward Hinnant 4993e519524SHoward Hinnanttemplate <class _T1, class _T2> 50018191cebSMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 5013e519524SHoward Hinnantpair<typename __make_pair_return<_T1>::type, typename __make_pair_return<_T2>::type> 5023e519524SHoward Hinnantmake_pair(_T1&& __t1, _T2&& __t2) 5033e519524SHoward Hinnant{ 5043e519524SHoward Hinnant return pair<typename __make_pair_return<_T1>::type, typename __make_pair_return<_T2>::type> 505ce48a113SHoward Hinnant (_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2)); 5063e519524SHoward Hinnant} 5073e519524SHoward Hinnant 5087609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5093e519524SHoward Hinnant 5103e519524SHoward Hinnanttemplate <class _T1, class _T2> 5113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5123e519524SHoward Hinnantpair<_T1,_T2> 5133e519524SHoward Hinnantmake_pair(_T1 __x, _T2 __y) 5143e519524SHoward Hinnant{ 5153e519524SHoward Hinnant return pair<_T1, _T2>(__x, __y); 5163e519524SHoward Hinnant} 5173e519524SHoward Hinnant 5187609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5193e519524SHoward Hinnant 5203e519524SHoward Hinnanttemplate <class _T1, class _T2> 521f0544c20SHoward Hinnant class _LIBCPP_TYPE_VIS_ONLY tuple_size<pair<_T1, _T2> > 522789847ddSHoward Hinnant : public integral_constant<size_t, 2> {}; 5233e519524SHoward Hinnant 5243e519524SHoward Hinnanttemplate <class _T1, class _T2> 525f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY tuple_element<0, pair<_T1, _T2> > 5263e519524SHoward Hinnant{ 5273e519524SHoward Hinnantpublic: 5283e519524SHoward Hinnant typedef _T1 type; 5293e519524SHoward Hinnant}; 5303e519524SHoward Hinnant 5313e519524SHoward Hinnanttemplate <class _T1, class _T2> 532f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY tuple_element<1, pair<_T1, _T2> > 5333e519524SHoward Hinnant{ 5343e519524SHoward Hinnantpublic: 5353e519524SHoward Hinnant typedef _T2 type; 5363e519524SHoward Hinnant}; 5373e519524SHoward Hinnant 5383e519524SHoward Hinnanttemplate <size_t _Ip> struct __get_pair; 5393e519524SHoward Hinnant 5403e519524SHoward Hinnanttemplate <> 5413e519524SHoward Hinnantstruct __get_pair<0> 5423e519524SHoward Hinnant{ 5433e519524SHoward Hinnant template <class _T1, class _T2> 5443e519524SHoward Hinnant static 5458bf1f08aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 5463e519524SHoward Hinnant _T1& 54727d0a2a7SHoward Hinnant get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 5483e519524SHoward Hinnant 5493e519524SHoward Hinnant template <class _T1, class _T2> 5503e519524SHoward Hinnant static 5518bf1f08aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 5523e519524SHoward Hinnant const _T1& 55327d0a2a7SHoward Hinnant get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} 554601afb30SHoward Hinnant 555601afb30SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 556601afb30SHoward Hinnant 557601afb30SHoward Hinnant template <class _T1, class _T2> 558601afb30SHoward Hinnant static 5598bf1f08aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 560601afb30SHoward Hinnant _T1&& 561ce48a113SHoward Hinnant get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);} 562601afb30SHoward Hinnant 563601afb30SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5643e519524SHoward Hinnant}; 5653e519524SHoward Hinnant 5663e519524SHoward Hinnanttemplate <> 5673e519524SHoward Hinnantstruct __get_pair<1> 5683e519524SHoward Hinnant{ 5693e519524SHoward Hinnant template <class _T1, class _T2> 5703e519524SHoward Hinnant static 5718bf1f08aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 5723e519524SHoward Hinnant _T2& 57327d0a2a7SHoward Hinnant get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 5743e519524SHoward Hinnant 5753e519524SHoward Hinnant template <class _T1, class _T2> 5763e519524SHoward Hinnant static 5778bf1f08aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 5783e519524SHoward Hinnant const _T2& 57927d0a2a7SHoward Hinnant get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} 580601afb30SHoward Hinnant 581601afb30SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 582601afb30SHoward Hinnant 583601afb30SHoward Hinnant template <class _T1, class _T2> 584601afb30SHoward Hinnant static 5858bf1f08aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 586601afb30SHoward Hinnant _T2&& 587ce48a113SHoward Hinnant get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T2>(__p.second);} 588601afb30SHoward Hinnant 589601afb30SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5903e519524SHoward Hinnant}; 5913e519524SHoward Hinnant 5923e519524SHoward Hinnanttemplate <size_t _Ip, class _T1, class _T2> 5933af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 5943e519524SHoward Hinnanttypename tuple_element<_Ip, pair<_T1, _T2> >::type& 59527d0a2a7SHoward Hinnantget(pair<_T1, _T2>& __p) _NOEXCEPT 5963e519524SHoward Hinnant{ 5973e519524SHoward Hinnant return __get_pair<_Ip>::get(__p); 5983e519524SHoward Hinnant} 5993e519524SHoward Hinnant 6003e519524SHoward Hinnanttemplate <size_t _Ip, class _T1, class _T2> 6013af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 6023e519524SHoward Hinnantconst typename tuple_element<_Ip, pair<_T1, _T2> >::type& 60327d0a2a7SHoward Hinnantget(const pair<_T1, _T2>& __p) _NOEXCEPT 6043e519524SHoward Hinnant{ 6053e519524SHoward Hinnant return __get_pair<_Ip>::get(__p); 6063e519524SHoward Hinnant} 6073e519524SHoward Hinnant 608601afb30SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 609601afb30SHoward Hinnant 610601afb30SHoward Hinnanttemplate <size_t _Ip, class _T1, class _T2> 6113af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 612601afb30SHoward Hinnanttypename tuple_element<_Ip, pair<_T1, _T2> >::type&& 61327d0a2a7SHoward Hinnantget(pair<_T1, _T2>&& __p) _NOEXCEPT 614601afb30SHoward Hinnant{ 615ce48a113SHoward Hinnant return __get_pair<_Ip>::get(_VSTD::move(__p)); 616601afb30SHoward Hinnant} 617601afb30SHoward Hinnant 618601afb30SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 619601afb30SHoward Hinnant 620d5189106SMarshall Clow#if _LIBCPP_STD_VER > 11 621e99520c7SMarshall Clowtemplate <class _T1, class _T2> 6223af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 623e99520c7SMarshall Clowconstexpr _T1 & get(pair<_T1, _T2>& __p) _NOEXCEPT 624e99520c7SMarshall Clow{ 625e99520c7SMarshall Clow return __get_pair<0>::get(__p); 626e99520c7SMarshall Clow} 627e99520c7SMarshall Clow 628e99520c7SMarshall Clowtemplate <class _T1, class _T2> 6293af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 630e99520c7SMarshall Clowconstexpr _T1 const & get(pair<_T1, _T2> const& __p) _NOEXCEPT 631e99520c7SMarshall Clow{ 632e99520c7SMarshall Clow return __get_pair<0>::get(__p); 633e99520c7SMarshall Clow} 634e99520c7SMarshall Clow 635e99520c7SMarshall Clowtemplate <class _T1, class _T2> 6363af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 637e99520c7SMarshall Clowconstexpr _T1 && get(pair<_T1, _T2>&& __p) _NOEXCEPT 638e99520c7SMarshall Clow{ 639e99520c7SMarshall Clow return __get_pair<0>::get(_VSTD::move(__p)); 640e99520c7SMarshall Clow} 641e99520c7SMarshall Clow 642e99520c7SMarshall Clowtemplate <class _T1, class _T2> 6433af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 644e99520c7SMarshall Clowconstexpr _T1 & get(pair<_T2, _T1>& __p) _NOEXCEPT 645e99520c7SMarshall Clow{ 646e99520c7SMarshall Clow return __get_pair<1>::get(__p); 647e99520c7SMarshall Clow} 648e99520c7SMarshall Clow 649e99520c7SMarshall Clowtemplate <class _T1, class _T2> 6503af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 651e99520c7SMarshall Clowconstexpr _T1 const & get(pair<_T2, _T1> const& __p) _NOEXCEPT 652e99520c7SMarshall Clow{ 653e99520c7SMarshall Clow return __get_pair<1>::get(__p); 654e99520c7SMarshall Clow} 655e99520c7SMarshall Clow 656e99520c7SMarshall Clowtemplate <class _T1, class _T2> 6573af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 658e99520c7SMarshall Clowconstexpr _T1 && get(pair<_T2, _T1>&& __p) _NOEXCEPT 659e99520c7SMarshall Clow{ 660e99520c7SMarshall Clow return __get_pair<1>::get(_VSTD::move(__p)); 661e99520c7SMarshall Clow} 662e99520c7SMarshall Clow 663e99520c7SMarshall Clow#endif 664e99520c7SMarshall Clow 665e99520c7SMarshall Clow#if _LIBCPP_STD_VER > 11 666d5189106SMarshall Clow 667d5189106SMarshall Clowtemplate<class _Tp, _Tp... _Ip> 668f0544c20SHoward Hinnantstruct _LIBCPP_TYPE_VIS_ONLY integer_sequence 669d5189106SMarshall Clow{ 670d5189106SMarshall Clow typedef _Tp value_type; 671d5189106SMarshall Clow static_assert( is_integral<_Tp>::value, 672d5189106SMarshall Clow "std::integer_sequence can only be instantiated with an integral type" ); 673d5189106SMarshall Clow static 674d5189106SMarshall Clow _LIBCPP_INLINE_VISIBILITY 675d5189106SMarshall Clow constexpr 676d5189106SMarshall Clow size_t 677d5189106SMarshall Clow size() noexcept { return sizeof...(_Ip); } 678d5189106SMarshall Clow}; 679d5189106SMarshall Clow 680d5189106SMarshall Clowtemplate<size_t... _Ip> 681d5189106SMarshall Clow using index_sequence = integer_sequence<size_t, _Ip...>; 682d5189106SMarshall Clow 68360df5996SMarshall Clownamespace __detail { 684d5189106SMarshall Clow 68560df5996SMarshall Clowtemplate<typename _Tp, size_t ..._Extra> struct __repeat; 68660df5996SMarshall Clowtemplate<typename _Tp, _Tp ..._Np, size_t ..._Extra> struct __repeat<integer_sequence<_Tp, _Np...>, _Extra...> { 68760df5996SMarshall Clow typedef integer_sequence<_Tp, 68860df5996SMarshall Clow _Np..., 68960df5996SMarshall Clow sizeof...(_Np) + _Np..., 69060df5996SMarshall Clow 2 * sizeof...(_Np) + _Np..., 69160df5996SMarshall Clow 3 * sizeof...(_Np) + _Np..., 69260df5996SMarshall Clow 4 * sizeof...(_Np) + _Np..., 69360df5996SMarshall Clow 5 * sizeof...(_Np) + _Np..., 69460df5996SMarshall Clow 6 * sizeof...(_Np) + _Np..., 69560df5996SMarshall Clow 7 * sizeof...(_Np) + _Np..., 69660df5996SMarshall Clow _Extra...> type; 697d5189106SMarshall Clow}; 698d5189106SMarshall Clow 69960df5996SMarshall Clowtemplate<size_t _Np> struct __parity; 70060df5996SMarshall Clowtemplate<size_t _Np> struct __make : __parity<_Np % 8>::template __pmake<_Np> {}; 70160df5996SMarshall Clow 70260df5996SMarshall Clowtemplate<> struct __make<0> { typedef integer_sequence<size_t> type; }; 70360df5996SMarshall Clowtemplate<> struct __make<1> { typedef integer_sequence<size_t, 0> type; }; 70460df5996SMarshall Clowtemplate<> struct __make<2> { typedef integer_sequence<size_t, 0, 1> type; }; 70560df5996SMarshall Clowtemplate<> struct __make<3> { typedef integer_sequence<size_t, 0, 1, 2> type; }; 70660df5996SMarshall Clowtemplate<> struct __make<4> { typedef integer_sequence<size_t, 0, 1, 2, 3> type; }; 70760df5996SMarshall Clowtemplate<> struct __make<5> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4> type; }; 70860df5996SMarshall Clowtemplate<> struct __make<6> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; }; 70960df5996SMarshall Clowtemplate<> struct __make<7> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; }; 71060df5996SMarshall Clow 71160df5996SMarshall Clowtemplate<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; }; 71260df5996SMarshall Clowtemplate<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; }; 71360df5996SMarshall Clowtemplate<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; }; 71460df5996SMarshall Clowtemplate<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; }; 71560df5996SMarshall Clowtemplate<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; 71660df5996SMarshall Clowtemplate<> 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> {}; }; 71760df5996SMarshall Clowtemplate<> 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> {}; }; 71860df5996SMarshall Clowtemplate<> 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> {}; }; 71960df5996SMarshall Clow 72060df5996SMarshall Clowtemplate<typename _Tp, typename _Up> struct __convert { 72160df5996SMarshall Clow template<typename> struct __result; 72260df5996SMarshall Clow template<_Tp ..._Np> struct __result<integer_sequence<_Tp, _Np...> > { typedef integer_sequence<_Up, _Np...> type; }; 723d5189106SMarshall Clow}; 72460df5996SMarshall Clowtemplate<typename _Tp> struct __convert<_Tp, _Tp> { template<typename _Up> struct __result { typedef _Up type; }; }; 72560df5996SMarshall Clow 72660df5996SMarshall Clow} 72760df5996SMarshall Clow 72860df5996SMarshall Clowtemplate<typename _Tp, _Tp _Np> using __make_integer_sequence_unchecked = 72960df5996SMarshall Clow typename __detail::__convert<size_t, _Tp>::template __result<typename __detail::__make<_Np>::type>::type; 730d5189106SMarshall Clow 731d5189106SMarshall Clowtemplate <class _Tp, _Tp _Ep> 732d5189106SMarshall Clowstruct __make_integer_sequence 733d5189106SMarshall Clow{ 734d5189106SMarshall Clow static_assert(is_integral<_Tp>::value, 735d5189106SMarshall Clow "std::make_integer_sequence can only be instantiated with an integral type" ); 736d5189106SMarshall Clow static_assert(0 <= _Ep, "std::make_integer_sequence input shall not be negative"); 73760df5996SMarshall Clow typedef __make_integer_sequence_unchecked<_Tp, _Ep> type; 738d5189106SMarshall Clow}; 739d5189106SMarshall Clow 740d5189106SMarshall Clowtemplate<class _Tp, _Tp _Np> 741d5189106SMarshall Clow using make_integer_sequence = typename __make_integer_sequence<_Tp, _Np>::type; 742d5189106SMarshall Clow 743d5189106SMarshall Clowtemplate<size_t _Np> 744d5189106SMarshall Clow using make_index_sequence = make_integer_sequence<size_t, _Np>; 745d5189106SMarshall Clow 746d5189106SMarshall Clowtemplate<class... _Tp> 747d5189106SMarshall Clow using index_sequence_for = make_index_sequence<sizeof...(_Tp)>; 748d5189106SMarshall Clow 749d5189106SMarshall Clow#endif // _LIBCPP_STD_VER > 11 750d5189106SMarshall Clow 751a7b0e5ddSMarshall Clow#if _LIBCPP_STD_VER > 11 752a7b0e5ddSMarshall Clowtemplate<class _T1, class _T2 = _T1> 7533af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 754a7b0e5ddSMarshall Clow_T1 exchange(_T1& __obj, _T2 && __new_value) 755a7b0e5ddSMarshall Clow{ 756a7b0e5ddSMarshall Clow _T1 __old_value = _VSTD::move(__obj); 757a7b0e5ddSMarshall Clow __obj = _VSTD::forward<_T2>(__new_value); 758a7b0e5ddSMarshall Clow return __old_value; 759a7b0e5ddSMarshall Clow} 760a7b0e5ddSMarshall Clow#endif // _LIBCPP_STD_VER > 11 761a7b0e5ddSMarshall Clow 7623e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 7633e519524SHoward Hinnant 7643e519524SHoward Hinnant#endif // _LIBCPP_UTILITY 765