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