55 #ifndef _GLIBCXX_UTILITY
56 #define _GLIBCXX_UTILITY 1
58 #pragma GCC system_header
72 #if __cplusplus >= 201103L
78 namespace std _GLIBCXX_VISIBILITY(default)
80 _GLIBCXX_BEGIN_NAMESPACE_VERSION
83 template<
typename _Tp>
88 template<
typename _Tp>
89 struct tuple_size<const _Tp>
90 : integral_constant<size_t, tuple_size<_Tp>::value> { };
92 template<
typename _Tp>
93 struct tuple_size<volatile _Tp>
94 : integral_constant<size_t, tuple_size<_Tp>::value> { };
96 template<
typename _Tp>
97 struct tuple_size<const volatile _Tp>
98 : integral_constant<size_t, tuple_size<_Tp>::value> { };
101 template<std::
size_t __i,
typename _Tp>
102 struct tuple_element;
105 template<std::
size_t __i,
typename _Tp>
106 using __tuple_element_t =
typename tuple_element<__i, _Tp>::type;
108 template<std::
size_t __i,
typename _Tp>
109 struct tuple_element<__i, const _Tp>
111 typedef typename add_const<__tuple_element_t<__i, _Tp>>::type type;
114 template<std::
size_t __i,
typename _Tp>
115 struct tuple_element<__i, volatile _Tp>
117 typedef typename add_volatile<__tuple_element_t<__i, _Tp>>::type type;
120 template<std::
size_t __i,
typename _Tp>
121 struct tuple_element<__i, const volatile _Tp>
123 typedef typename add_cv<__tuple_element_t<__i, _Tp>>::type type;
126 #if __cplusplus > 201103L
127 #define __cpp_lib_tuple_element_t 201402
129 template<std::
size_t __i,
typename _Tp>
130 using tuple_element_t =
typename tuple_element<__i, _Tp>::type;
140 template<
typename _T1,
typename _T2>
145 template<
class _Tp1,
class _Tp2>
150 template<
class _Tp1,
class _Tp2>
152 {
typedef _Tp1 type; };
155 template<
class _Tp1,
class _Tp2>
157 {
typedef _Tp2 type; };
159 template<std::
size_t _Int>
165 template<
typename _Tp1,
typename _Tp2>
166 static constexpr _Tp1&
168 {
return __pair.
first; }
170 template<
typename _Tp1,
typename _Tp2>
171 static constexpr _Tp1&&
173 {
return std::forward<_Tp1>(__pair.first); }
175 template<
typename _Tp1,
typename _Tp2>
176 static constexpr
const _Tp1&
178 {
return __pair.first; }
184 template<
typename _Tp1,
typename _Tp2>
185 static constexpr _Tp2&
187 {
return __pair.second; }
189 template<
typename _Tp1,
typename _Tp2>
190 static constexpr _Tp2&&
192 {
return std::forward<_Tp2>(__pair.second); }
194 template<
typename _Tp1,
typename _Tp2>
195 static constexpr
const _Tp2&
197 {
return __pair.second; }
200 template<std::
size_t _Int,
class _Tp1,
class _Tp2>
201 constexpr
typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&
203 {
return __pair_get<_Int>::__get(__in); }
205 template<std::
size_t _Int,
class _Tp1,
class _Tp2>
206 constexpr
typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&&
208 {
return __pair_get<_Int>::__move_get(std::move(__in)); }
210 template<std::
size_t _Int,
class _Tp1,
class _Tp2>
211 constexpr
const typename tuple_element<_Int, std::pair<_Tp1, _Tp2>>::type&
213 {
return __pair_get<_Int>::__const_get(__in); }
215 #if __cplusplus > 201103L
217 #define __cpp_lib_tuples_by_type 201304
219 template <
typename _Tp,
typename _Up>
221 get(pair<_Tp, _Up>& __p) noexcept
222 {
return __p.first; }
224 template <
typename _Tp,
typename _Up>
226 get(
const pair<_Tp, _Up>& __p) noexcept
227 {
return __p.first; }
229 template <
typename _Tp,
typename _Up>
231 get(pair<_Tp, _Up>&& __p) noexcept
232 {
return std::move(__p.first); }
234 template <
typename _Tp,
typename _Up>
236 get(pair<_Up, _Tp>& __p) noexcept
237 {
return __p.second; }
239 template <
typename _Tp,
typename _Up>
241 get(
const pair<_Up, _Tp>& __p) noexcept
242 {
return __p.second; }
244 template <
typename _Tp,
typename _Up>
246 get(pair<_Up, _Tp>&& __p) noexcept
247 {
return std::move(__p.second); }
249 #define __cpp_lib_exchange_function 201304
252 template <
typename _Tp,
typename _Up = _Tp>
255 {
return std::__exchange(__obj, std::forward<_Up>(__new_val)); }
260 template<
size_t... _Indexes>
struct _Index_tuple { };
263 template<
typename _Itup1,
typename _Itup2>
struct _Itup_cat;
265 template<
size_t... _Ind1,
size_t... _Ind2>
266 struct _Itup_cat<_Index_tuple<_Ind1...>, _Index_tuple<_Ind2...>>
268 using __type = _Index_tuple<_Ind1..., (_Ind2 +
sizeof...(_Ind1))...>;
272 template<
size_t _Num>
273 struct _Build_index_tuple
274 : _Itup_cat<typename _Build_index_tuple<_Num / 2>::__type,
275 typename _Build_index_tuple<_Num - _Num / 2>::__type>
279 struct _Build_index_tuple<1>
281 typedef _Index_tuple<0> __type;
285 struct _Build_index_tuple<0>
287 typedef _Index_tuple<> __type;
290 #if __cplusplus > 201103L
292 #define __cpp_lib_integer_sequence 201304
295 template<
typename _Tp, _Tp... _Idx>
298 typedef _Tp value_type;
299 static constexpr
size_t size() noexcept {
return sizeof...(_Idx); }
302 template<
typename _Tp, _Tp _Num,
303 typename _ISeq =
typename _Build_index_tuple<_Num>::__type>
304 struct _Make_integer_sequence;
306 template<
typename _Tp, _Tp _Num,
size_t... _Idx>
307 struct _Make_integer_sequence<_Tp, _Num, _Index_tuple<_Idx...>>
309 static_assert( _Num >= 0,
310 "Cannot make integer sequence of negative length" );
316 template<
typename _Tp, _Tp _Num>
318 =
typename _Make_integer_sequence<_Tp, _Num>::__type;
321 template<
size_t... _Idx>
325 template<
size_t _Num>
329 template<
typename... _Types>
333 _GLIBCXX_END_NAMESPACE_VERSION
_T1 first
second_type is the second bound type
Struct holding two objects of arbitrary type.
_Tp exchange(_Tp &__obj, _Up &&__new_val)
Assign __new_val to __obj and return its previous value.
typename _Make_integer_sequence< _Tp, _Num >::__type make_integer_sequence
Alias template make_integer_sequence.
make_integer_sequence< size_t, _Num > make_index_sequence
Alias template make_index_sequence.
integral_constant< bool, false > false_type
The type used as a compile-time boolean with false value.
Class template integer_sequence.
make_index_sequence< sizeof...(_Types)> index_sequence_for
Alias template index_sequence_for.