55 #ifndef _GLIBCXX_UTILITY 56 #define _GLIBCXX_UTILITY 1 58 #pragma GCC system_header 72 #if __cplusplus >= 201103L 78 #if __cplusplus > 201402L 82 namespace std _GLIBCXX_VISIBILITY(default)
84 _GLIBCXX_BEGIN_NAMESPACE_VERSION
87 template<
typename _Tp>
94 template<
typename _Tp,
95 typename _Up =
typename remove_cv<_Tp>::type,
96 typename =
typename enable_if<is_same<_Tp, _Up>::value>::type,
97 size_t = tuple_size<_Tp>::value>
98 using __enable_if_has_tuple_size = _Tp;
100 template<
typename _Tp>
101 struct tuple_size<const __enable_if_has_tuple_size<_Tp>>
102 :
public tuple_size<_Tp> { };
104 template<
typename _Tp>
105 struct tuple_size<volatile __enable_if_has_tuple_size<_Tp>>
106 :
public tuple_size<_Tp> { };
108 template<
typename _Tp>
109 struct tuple_size<const volatile __enable_if_has_tuple_size<_Tp>>
110 :
public tuple_size<_Tp> { };
113 template<std::
size_t __i,
typename _Tp>
114 struct tuple_element;
117 template<std::
size_t __i,
typename _Tp>
118 using __tuple_element_t =
typename tuple_element<__i, _Tp>::type;
120 template<std::
size_t __i,
typename _Tp>
121 struct tuple_element<__i, const _Tp>
123 typedef typename add_const<__tuple_element_t<__i, _Tp>>::type type;
126 template<std::
size_t __i,
typename _Tp>
127 struct tuple_element<__i, volatile _Tp>
129 typedef typename add_volatile<__tuple_element_t<__i, _Tp>>::type type;
132 template<std::
size_t __i,
typename _Tp>
133 struct tuple_element<__i, const volatile _Tp>
135 typedef typename add_cv<__tuple_element_t<__i, _Tp>>::type type;
138 #if __cplusplus > 201103L 139 #define __cpp_lib_tuple_element_t 201402 141 template<std::
size_t __i,
typename _Tp>
142 using tuple_element_t =
typename tuple_element<__i, _Tp>::type;
148 template<
typename _T1,
typename _T2>
153 template<
class _Tp1,
class _Tp2>
158 template<
class _Tp1,
class _Tp2>
160 {
typedef _Tp1 type; };
163 template<
class _Tp1,
class _Tp2>
165 {
typedef _Tp2 type; };
167 template<std::
size_t _Int>
173 template<
typename _Tp1,
typename _Tp2>
174 static constexpr _Tp1&
176 {
return __pair.
first; }
178 template<
typename _Tp1,
typename _Tp2>
179 static constexpr _Tp1&&
181 {
return std::forward<_Tp1>(__pair.
first); }
183 template<
typename _Tp1,
typename _Tp2>
184 static constexpr
const _Tp1&
186 {
return __pair.
first; }
188 template<
typename _Tp1,
typename _Tp2>
189 static constexpr
const _Tp1&&
191 {
return std::forward<const _Tp1>(__pair.
first); }
197 template<
typename _Tp1,
typename _Tp2>
198 static constexpr _Tp2&
202 template<
typename _Tp1,
typename _Tp2>
203 static constexpr _Tp2&&
205 {
return std::forward<_Tp2>(__pair.
second); }
207 template<
typename _Tp1,
typename _Tp2>
208 static constexpr
const _Tp2&
212 template<
typename _Tp1,
typename _Tp2>
213 static constexpr
const _Tp2&&
215 {
return std::forward<const _Tp2>(__pair.
second); }
218 template<std::
size_t _Int,
class _Tp1,
class _Tp2>
221 {
return __pair_get<_Int>::__get(__in); }
223 template<std::
size_t _Int,
class _Tp1,
class _Tp2>
226 {
return __pair_get<_Int>::__move_get(std::move(__in)); }
228 template<std::
size_t _Int,
class _Tp1,
class _Tp2>
231 {
return __pair_get<_Int>::__const_get(__in); }
233 template<std::
size_t _Int,
class _Tp1,
class _Tp2>
236 {
return __pair_get<_Int>::__const_move_get(std::move(__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>
258 constexpr
const _Tp&&
260 {
return std::move(__p.first); }
262 template <
typename _Tp,
typename _Up>
265 {
return __p.second; }
267 template <
typename _Tp,
typename _Up>
270 {
return __p.second; }
272 template <
typename _Tp,
typename _Up>
275 {
return std::move(__p.second); }
277 template <
typename _Tp,
typename _Up>
278 constexpr
const _Tp&&
280 {
return std::move(__p.second); }
282 #define __cpp_lib_exchange_function 201304 285 template <
typename _Tp,
typename _Up = _Tp>
288 {
return std::__exchange(__obj, std::forward<_Up>(__new_val)); }
293 template<
size_t... _Indexes>
struct _Index_tuple { };
296 # if __has_builtin(__make_integer_seq) 297 # define _GLIBCXX_USE_MAKE_INTEGER_SEQ 1 302 template<
size_t _Num>
303 struct _Build_index_tuple
305 #if _GLIBCXX_USE_MAKE_INTEGER_SEQ 306 template<
typename,
size_t... _Indices>
307 using _IdxTuple = _Index_tuple<_Indices...>;
309 using __type = __make_integer_seq<_IdxTuple, size_t, _Num>;
311 using __type = _Index_tuple<__integer_pack(_Num)...>;
315 #if __cplusplus > 201103L 317 #define __cpp_lib_integer_sequence 201304 320 template<
typename _Tp, _Tp... _Idx>
323 typedef _Tp value_type;
324 static constexpr
size_t size() noexcept {
return sizeof...(_Idx); }
328 template<
typename _Tp, _Tp _Num>
330 #if _GLIBCXX_USE_MAKE_INTEGER_SEQ 331 = __make_integer_seq<integer_sequence, _Tp, _Num>;
336 #undef _GLIBCXX_USE_MAKE_INTEGER_SEQ 339 template<
size_t... _Idx>
343 template<
size_t _Num>
347 template<
typename... _Types>
351 #if __cplusplus > 201402L 354 explicit in_place_t() =
default;
357 inline constexpr in_place_t
in_place{};
359 template<
typename _Tp>
struct in_place_type_t
361 explicit in_place_type_t() =
default;
364 template<
typename _Tp>
365 inline constexpr in_place_type_t<_Tp> in_place_type{};
367 template<
size_t _Idx>
struct in_place_index_t
369 explicit in_place_index_t() =
default;
372 template<
size_t _Idx>
373 inline constexpr in_place_index_t<_Idx> in_place_index{};
379 template<
typename _Tp>
380 struct __is_in_place_type_impl<in_place_type_t<_Tp>> :
true_type 383 template<
typename _Tp>
384 struct __is_in_place_type
385 :
public __is_in_place_type_impl<_Tp>
388 #define __cpp_lib_as_const 201510 389 template<
typename _Tp>
392 template<
typename _Tp>
393 void as_const(
const _Tp&&) =
delete;
397 _GLIBCXX_END_NAMESPACE_VERSION
constexpr in_place_t in_place
Tag for in-place construction.
typename add_const< _Tp >::type add_const_t
Alias template for add_const.
_Tp exchange(_Tp &__obj, _Up &&__new_val)
Assign __new_val to __obj and return its previous value.
Class template integer_sequence.
_T2 second
first is a copy of the first object
_T1 first
second_type is the second bound type
ISO C++ entities toplevel namespace is std.
Struct holding two objects of arbitrary type.