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>
89 #if __cplusplus <= 201402L 90 template<
typename _Tp,
typename =
void>
91 struct __tuple_size_cv_impl { };
93 template<
typename _Tp>
94 struct __tuple_size_cv_impl<_Tp, __void_t<decltype(tuple_size<_Tp>::value)>>
95 : integral_constant<size_t, tuple_size<_Tp>::value> { };
99 template<
typename _Tp>
100 struct tuple_size<const _Tp> : __tuple_size_cv_impl<_Tp> { };
102 template<
typename _Tp>
103 struct tuple_size<volatile _Tp> : __tuple_size_cv_impl<_Tp> { };
105 template<
typename _Tp>
106 struct tuple_size<const volatile _Tp> : __tuple_size_cv_impl<_Tp> { };
108 template<
typename _Tp,
109 typename _Up =
typename remove_cv<_Tp>::type,
110 typename =
typename enable_if<is_same<_Tp, _Up>::value>::type,
111 size_t = tuple_size<_Tp>::value>
112 using __enable_if_has_tuple_size = _Tp;
114 template<
typename _Tp>
115 struct tuple_size<const __enable_if_has_tuple_size<_Tp>>
116 :
public tuple_size<_Tp> { };
118 template<
typename _Tp>
119 struct tuple_size<volatile __enable_if_has_tuple_size<_Tp>>
120 :
public tuple_size<_Tp> { };
122 template<
typename _Tp>
123 struct tuple_size<const volatile __enable_if_has_tuple_size<_Tp>>
124 :
public tuple_size<_Tp> { };
128 template<std::
size_t __i,
typename _Tp>
129 struct tuple_element;
132 template<std::
size_t __i,
typename _Tp>
133 using __tuple_element_t =
typename tuple_element<__i, _Tp>::type;
135 template<std::
size_t __i,
typename _Tp>
136 struct tuple_element<__i, const _Tp>
138 typedef typename add_const<__tuple_element_t<__i, _Tp>>::type type;
141 template<std::
size_t __i,
typename _Tp>
142 struct tuple_element<__i, volatile _Tp>
144 typedef typename add_volatile<__tuple_element_t<__i, _Tp>>::type type;
147 template<std::
size_t __i,
typename _Tp>
148 struct tuple_element<__i, const volatile _Tp>
150 typedef typename add_cv<__tuple_element_t<__i, _Tp>>::type type;
153 #if __cplusplus > 201103L 154 #define __cpp_lib_tuple_element_t 201402 156 template<std::
size_t __i,
typename _Tp>
157 using tuple_element_t =
typename tuple_element<__i, _Tp>::type;
163 template<
typename _T1,
typename _T2>
168 template<
class _Tp1,
class _Tp2>
173 template<
class _Tp1,
class _Tp2>
175 {
typedef _Tp1 type; };
178 template<
class _Tp1,
class _Tp2>
180 {
typedef _Tp2 type; };
182 template<std::
size_t _Int>
188 template<
typename _Tp1,
typename _Tp2>
189 static constexpr _Tp1&
191 {
return __pair.
first; }
193 template<
typename _Tp1,
typename _Tp2>
194 static constexpr _Tp1&&
196 {
return std::forward<_Tp1>(__pair.
first); }
198 template<
typename _Tp1,
typename _Tp2>
199 static constexpr
const _Tp1&
201 {
return __pair.
first; }
207 template<
typename _Tp1,
typename _Tp2>
208 static constexpr _Tp2&
212 template<
typename _Tp1,
typename _Tp2>
213 static constexpr _Tp2&&
215 {
return std::forward<_Tp2>(__pair.
second); }
217 template<
typename _Tp1,
typename _Tp2>
218 static constexpr
const _Tp2&
223 template<std::
size_t _Int,
class _Tp1,
class _Tp2>
226 {
return __pair_get<_Int>::__get(__in); }
228 template<std::
size_t _Int,
class _Tp1,
class _Tp2>
231 {
return __pair_get<_Int>::__move_get(std::move(__in)); }
233 template<std::
size_t _Int,
class _Tp1,
class _Tp2>
236 {
return __pair_get<_Int>::__const_get(__in); }
238 #if __cplusplus > 201103L 240 #define __cpp_lib_tuples_by_type 201304 242 template <
typename _Tp,
typename _Up>
245 {
return __p.first; }
247 template <
typename _Tp,
typename _Up>
250 {
return __p.first; }
252 template <
typename _Tp,
typename _Up>
255 {
return std::move(__p.first); }
257 template <
typename _Tp,
typename _Up>
260 {
return __p.second; }
262 template <
typename _Tp,
typename _Up>
265 {
return __p.second; }
267 template <
typename _Tp,
typename _Up>
270 {
return std::move(__p.second); }
272 #define __cpp_lib_exchange_function 201304 275 template <
typename _Tp,
typename _Up = _Tp>
278 {
return std::__exchange(__obj, std::forward<_Up>(__new_val)); }
283 template<
size_t... _Indexes>
struct _Index_tuple { };
286 template<
typename _Itup1,
typename _Itup2>
struct _Itup_cat;
288 template<
size_t... _Ind1,
size_t... _Ind2>
289 struct _Itup_cat<_Index_tuple<_Ind1...>, _Index_tuple<_Ind2...>>
291 using __type = _Index_tuple<_Ind1..., (_Ind2 +
sizeof...(_Ind1))...>;
295 template<
size_t _Num>
296 struct _Build_index_tuple
297 : _Itup_cat<typename _Build_index_tuple<_Num / 2>::__type,
298 typename _Build_index_tuple<_Num - _Num / 2>::__type>
302 struct _Build_index_tuple<1>
304 typedef _Index_tuple<0> __type;
308 struct _Build_index_tuple<0>
310 typedef _Index_tuple<> __type;
313 #if __cplusplus > 201103L 315 #define __cpp_lib_integer_sequence 201304 318 template<
typename _Tp, _Tp... _Idx>
321 typedef _Tp value_type;
322 static constexpr
size_t size() noexcept {
return sizeof...(_Idx); }
325 template<
typename _Tp, _Tp _Num,
326 typename _ISeq =
typename _Build_index_tuple<_Num>::__type>
327 struct _Make_integer_sequence;
329 template<
typename _Tp, _Tp _Num,
size_t... _Idx>
330 struct _Make_integer_sequence<_Tp, _Num, _Index_tuple<_Idx...>>
332 static_assert( _Num >= 0,
333 "Cannot make integer sequence of negative length" );
339 template<
typename _Tp, _Tp _Num>
341 =
typename _Make_integer_sequence<_Tp, _Num>::__type;
344 template<
size_t... _Idx>
348 template<
size_t _Num>
352 template<
typename... _Types>
356 #if __cplusplus > 201402L 359 explicit in_place_t() =
default;
362 inline constexpr in_place_t
in_place{};
364 template<
typename _Tp>
struct in_place_type_t
366 explicit in_place_type_t() =
default;
369 template<
typename _Tp>
370 inline constexpr in_place_type_t<_Tp> in_place_type{};
372 template<
size_t _Idx>
struct in_place_index_t
374 explicit in_place_index_t() =
default;
377 template<
size_t _Idx>
378 inline constexpr in_place_index_t<_Idx> in_place_index{};
384 template<
typename _Tp>
385 struct __is_in_place_type_impl<in_place_type_t<_Tp>> :
true_type 388 template<
typename _Tp>
389 struct __is_in_place_type
390 :
public __is_in_place_type_impl<_Tp>
393 #define __cpp_lib_as_const 201510 394 template<
typename _Tp>
395 constexpr add_const_t<_Tp>& as_const(_Tp& __t) noexcept {
return __t; }
397 template<
typename _Tp>
398 void as_const(
const _Tp&&) =
delete;
402 _GLIBCXX_END_NAMESPACE_VERSION
constexpr in_place_t in_place
Tag for in-place construction.
_T2 second
first is a copy of the first object
_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.
Struct holding two objects of arbitrary type.
ISO C++ entities toplevel namespace is std.
make_index_sequence< sizeof...(_Types)> index_sequence_for
Alias template index_sequence_for.
_T1 first
second_type is the second bound type
Class template integer_sequence.