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
41227825Stheraventemplate <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
120253159Stheraven// C++14
121253159Stheraven
122253159Stheraventemplate<class T, T... I>
123253159Stheravenstruct integer_sequence
124253159Stheraven{
125253159Stheraven    typedef T value_type;
126253159Stheraven
127253159Stheraven    static constexpr size_t size() noexcept;
128253159Stheraven};
129253159Stheraven
130253159Stheraventemplate<size_t... I>
131253159Stheraven  using index_sequence = integer_sequence<size_t, I...>;
132253159Stheraven
133253159Stheraventemplate<class T, T N>
134253159Stheraven  using make_integer_sequence = integer_sequence<T, 0, 1, ..., N-1>;
135253159Stheraventemplate<size_t N>
136253159Stheraven  using make_index_sequence = make_integer_sequence<size_t, N>;
137253159Stheraven
138253159Stheraventemplate<class... T>
139253159Stheraven  using index_sequence_for = make_index_sequence<sizeof...(T)>;
140253159Stheraven
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}
165227825Stheraven
166227825Stheraventemplate<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
204232950Stheraventemplate<class _Tp, size_t _Np>
205227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
206227825Stheravenvoid
207232950Stheravenswap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
208227825Stheraven{
209232950Stheraven    _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
221227825Stheraven#else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
222227825Stheravenconst _Tp&
223227825Stheraven#endif
224227825Stheravenmove_if_noexcept(_Tp& __x) _NOEXCEPT
225227825Stheraven{
226227825Stheraven    return _VSTD::move(__x);
227227825Stheraven}
228227825Stheraven
229249998Sdimstruct _LIBCPP_TYPE_VIS piecewise_construct_t { };
230234976Stheraven#if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_UTILITY)
231227825Stheravenextern const piecewise_construct_t piecewise_construct;// = piecewise_construct_t();
232234976Stheraven#else
233234976Stheravenconstexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();
234234976Stheraven#endif
235227825Stheraven
236227825Stheraventemplate <class _T1, class _T2>
237249998Sdimstruct _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
248234976Stheraven    _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
257241903Sdim                 ,typename enable_if<is_convertible<const _U1&, _T1>::value &&
258241903Sdim                                    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    {
277227825Stheraven        first = __p.first;
278227825Stheraven        second = __p.second;
279227825Stheraven        return *this;
280227825Stheraven    }
281227825Stheraven
282227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
283227825Stheraven
284227825Stheraven    template <class _U1, class _U2,
285241903Sdim              class = typename enable_if<is_convertible<_U1, first_type>::value &&
286241903Sdim                                         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,
296241903Sdim                 typename enable_if<is_convertible<_U1, _T1>::value &&
297241903Sdim                                    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,
322227825Stheraven             class = typename enable_if<__tuple_convertible<_Tuple, pair>::value>::type>
323227825Stheraven        _LIBCPP_INLINE_VISIBILITY
324227825Stheraven        pair(_Tuple&& __p)
325227825Stheraven            : first(_VSTD::forward<typename tuple_element<0,
326227825Stheraven                                  typename __make_tuple_types<_Tuple>::type>::type>(get<0>(__p))),
327227825Stheraven              second(_VSTD::forward<typename tuple_element<1,
328227825Stheraven                                   typename __make_tuple_types<_Tuple>::type>::type>(get<1>(__p)))
329227825Stheraven            {}
330227825Stheraven
331227825Stheraven
332227825Stheraven
333232950Stheraven    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
378227825Stheraventemplate <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)
414227825Stheraven{
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}
425227825Stheraven
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))
437227825Stheraven{
438227825Stheraven    __x.swap(__y);
439227825Stheraven}
440227825Stheraven
441227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
442227825Stheraven
443249998Sdimtemplate <class _Tp> class _LIBCPP_TYPE_VIS reference_wrapper;
444227825Stheraven
445227825Stheraventemplate <class _Tp>
446227825Stheravenstruct ___make_pair_return
447227825Stheraven{
448227825Stheraven    typedef _Tp type;
449227825Stheraven};
450227825Stheraven
451227825Stheraventemplate <class _Tp>
452227825Stheravenstruct ___make_pair_return<reference_wrapper<_Tp>>
453227825Stheraven{
454227825Stheraven    typedef _Tp& type;
455227825Stheraven};
456227825Stheraven
457227825Stheraventemplate <class _Tp>
458227825Stheravenstruct __make_pair_return
459227825Stheraven{
460227825Stheraven    typedef typename ___make_pair_return<typename decay<_Tp>::type>::type type;
461227825Stheraven};
462227825Stheraven
463227825Stheraventemplate <class _T1, class _T2>
464227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
465227825Stheravenpair<typename __make_pair_return<_T1>::type, typename __make_pair_return<_T2>::type>
466227825Stheravenmake_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
473227825Stheraven
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}
481227825Stheraven
482227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
483227825Stheraven
484227825Stheraventemplate <class _T1, class _T2>
485249998Sdim  class _LIBCPP_TYPE_VIS tuple_size<pair<_T1, _T2> >
486227825Stheraven    : public integral_constant<size_t, 2> {};
487227825Stheraven
488227825Stheraventemplate <class _T1, class _T2>
489249998Sdim  class _LIBCPP_TYPE_VIS tuple_size<const pair<_T1, _T2> >
490227825Stheraven    : public integral_constant<size_t, 2> {};
491227825Stheraven
492227825Stheraventemplate <class _T1, class _T2>
493249998Sdimclass _LIBCPP_TYPE_VIS tuple_element<0, pair<_T1, _T2> >
494227825Stheraven{
495227825Stheravenpublic:
496227825Stheraven    typedef _T1 type;
497227825Stheraven};
498227825Stheraven
499227825Stheraventemplate <class _T1, class _T2>
500249998Sdimclass _LIBCPP_TYPE_VIS tuple_element<1, pair<_T1, _T2> >
501227825Stheraven{
502227825Stheravenpublic:
503227825Stheraven    typedef _T2 type;
504227825Stheraven};
505227825Stheraven
506227825Stheraventemplate <class _T1, class _T2>
507249998Sdimclass _LIBCPP_TYPE_VIS tuple_element<0, const pair<_T1, _T2> >
508227825Stheraven{
509227825Stheravenpublic:
510227825Stheraven    typedef const _T1 type;
511227825Stheraven};
512227825Stheraven
513227825Stheraventemplate <class _T1, class _T2>
514249998Sdimclass _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;
521227825Stheraven
522227825Stheraventemplate <>
523227825Stheravenstruct __get_pair<0>
524227825Stheraven{
525227825Stheraven    template <class _T1, class _T2>
526227825Stheraven    static
527227825Stheraven    _LIBCPP_INLINE_VISIBILITY
528227825Stheraven    _T1&
529227825Stheraven    get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;}
530227825Stheraven
531227825Stheraven    template <class _T1, class _T2>
532227825Stheraven    static
533227825Stheraven    _LIBCPP_INLINE_VISIBILITY
534227825Stheraven    const _T1&
535227825Stheraven    get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;}
536227825Stheraven
537227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
538227825Stheraven
539227825Stheraven    template <class _T1, class _T2>
540227825Stheraven    static
541227825Stheraven    _LIBCPP_INLINE_VISIBILITY
542227825Stheraven    _T1&&
543227825Stheraven    get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);}
544227825Stheraven
545227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
546227825Stheraven};
547227825Stheraven
548227825Stheraventemplate <>
549227825Stheravenstruct __get_pair<1>
550227825Stheraven{
551227825Stheraven    template <class _T1, class _T2>
552227825Stheraven    static
553227825Stheraven    _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
594227825Stheraventypename tuple_element<_Ip, pair<_T1, _T2> >::type&&
595227825Stheravenget(pair<_T1, _T2>&& __p) _NOEXCEPT
596227825Stheraven{
597227825Stheraven    return __get_pair<_Ip>::get(_VSTD::move(__p));
598227825Stheraven}
599227825Stheraven
600227825Stheraven#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
601227825Stheraven
602253159Stheraven#if _LIBCPP_STD_VER > 11
603253159Stheraven
604253159Stheraventemplate<class _Tp, _Tp... _Ip>
605253159Stheravenstruct _LIBCPP_TYPE_VIS integer_sequence
606253159Stheraven{
607253159Stheraven    typedef _Tp value_type;
608253159Stheraven    static_assert( is_integral<_Tp>::value,
609253159Stheraven                  "std::integer_sequence can only be instantiated with an integral type" );
610253159Stheraven    static
611253159Stheraven    _LIBCPP_INLINE_VISIBILITY
612253159Stheraven    constexpr
613253159Stheraven    size_t
614253159Stheraven    size() noexcept { return sizeof...(_Ip); }
615253159Stheraven};
616253159Stheraven
617253159Stheraventemplate<size_t... _Ip>
618253159Stheraven    using index_sequence = integer_sequence<size_t, _Ip...>;
619253159Stheraven
620253159Stheravennamespace __detail {
621253159Stheraven
622253159Stheraventemplate<typename _Tp, size_t ..._Extra> struct __repeat;
623253159Stheraventemplate<typename _Tp, _Tp ..._Np, size_t ..._Extra> struct __repeat<integer_sequence<_Tp, _Np...>, _Extra...> {
624253159Stheraven  typedef integer_sequence<_Tp,
625253159Stheraven                           _Np...,
626253159Stheraven                           sizeof...(_Np) + _Np...,
627253159Stheraven                           2 * sizeof...(_Np) + _Np...,
628253159Stheraven                           3 * sizeof...(_Np) + _Np...,
629253159Stheraven                           4 * sizeof...(_Np) + _Np...,
630253159Stheraven                           5 * sizeof...(_Np) + _Np...,
631253159Stheraven                           6 * sizeof...(_Np) + _Np...,
632253159Stheraven                           7 * sizeof...(_Np) + _Np...,
633253159Stheraven                           _Extra...> type;
634253159Stheraven};
635253159Stheraven
636253159Stheraventemplate<size_t _Np> struct __parity;
637253159Stheraventemplate<size_t _Np> struct __make : __parity<_Np % 8>::template __pmake<_Np> {};
638253159Stheraven
639253159Stheraventemplate<> struct __make<0> { typedef integer_sequence<size_t> type; };
640253159Stheraventemplate<> struct __make<1> { typedef integer_sequence<size_t, 0> type; };
641253159Stheraventemplate<> struct __make<2> { typedef integer_sequence<size_t, 0, 1> type; };
642253159Stheraventemplate<> struct __make<3> { typedef integer_sequence<size_t, 0, 1, 2> type; };
643253159Stheraventemplate<> struct __make<4> { typedef integer_sequence<size_t, 0, 1, 2, 3> type; };
644253159Stheraventemplate<> struct __make<5> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4> type; };
645253159Stheraventemplate<> struct __make<6> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; };
646253159Stheraventemplate<> struct __make<7> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; };
647253159Stheraven
648253159Stheraventemplate<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; };
649253159Stheraventemplate<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; };
650253159Stheraventemplate<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; };
651253159Stheraventemplate<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; };
652253159Stheraventemplate<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
653253159Stheraventemplate<> 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> {}; };
654253159Stheraventemplate<> 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> {}; };
655253159Stheraventemplate<> 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> {}; };
656253159Stheraven
657253159Stheraventemplate<typename _Tp, typename _Up> struct __convert {
658253159Stheraven  template<typename> struct __result;
659253159Stheraven  template<_Tp ..._Np> struct __result<integer_sequence<_Tp, _Np...> > { typedef integer_sequence<_Up, _Np...> type; };
660253159Stheraven};
661253159Stheraventemplate<typename _Tp> struct __convert<_Tp, _Tp> { template<typename _Up> struct __result { typedef _Up type; }; };
662253159Stheraven
663253159Stheraven}
664253159Stheraven
665253159Stheraventemplate<typename _Tp, _Tp _Np> using __make_integer_sequence_unchecked =
666253159Stheraven  typename __detail::__convert<size_t, _Tp>::template __result<typename __detail::__make<_Np>::type>::type;
667253159Stheraven
668253159Stheraventemplate <class _Tp, _Tp _Ep>
669253159Stheravenstruct __make_integer_sequence
670253159Stheraven{
671253159Stheraven    static_assert(is_integral<_Tp>::value,
672253159Stheraven                  "std::make_integer_sequence can only be instantiated with an integral type" );
673253159Stheraven    static_assert(0 <= _Ep, "std::make_integer_sequence input shall not be negative");
674253159Stheraven    typedef __make_integer_sequence_unchecked<_Tp, _Ep> type;
675253159Stheraven};
676253159Stheraven
677253159Stheraventemplate<class _Tp, _Tp _Np>
678253159Stheraven    using make_integer_sequence = typename __make_integer_sequence<_Tp, _Np>::type;
679253159Stheraven
680253159Stheraventemplate<size_t _Np>
681253159Stheraven    using make_index_sequence = make_integer_sequence<size_t, _Np>;
682253159Stheraven
683253159Stheraventemplate<class... _Tp>
684253159Stheraven    using index_sequence_for = make_index_sequence<sizeof...(_Tp)>;
685253159Stheraven  
686253159Stheraven#endif  // _LIBCPP_STD_VER > 11
687253159Stheraven
688227825Stheraven_LIBCPP_END_NAMESPACE_STD
689227825Stheraven
690227825Stheraven#endif  // _LIBCPP_UTILITY
691