29#ifndef _EXT_TYPE_TRAITS
30#define _EXT_TYPE_TRAITS 1
32#pragma GCC system_header
39namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
41_GLIBCXX_BEGIN_NAMESPACE_VERSION
44 template<
bool,
typename>
48 template<
typename _Tp>
49 struct __enable_if<true, _Tp>
50 {
typedef _Tp __type; };
54 template<
bool _Cond,
typename _Iftrue,
typename _Iffalse>
55 struct __conditional_type
56 {
typedef _Iftrue __type; };
58 template<
typename _Iftrue,
typename _Iffalse>
59 struct __conditional_type<false, _Iftrue, _Iffalse>
60 {
typedef _Iffalse __type; };
64 template<
typename _Tp>
68 typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
71 typedef typename __if_type::__type __type;
75 struct __add_unsigned<char>
76 {
typedef unsigned char __type; };
79 struct __add_unsigned<signed char>
80 {
typedef unsigned char __type; };
83 struct __add_unsigned<short>
84 {
typedef unsigned short __type; };
87 struct __add_unsigned<int>
88 {
typedef unsigned int __type; };
91 struct __add_unsigned<long>
92 {
typedef unsigned long __type; };
95 struct __add_unsigned<long long>
96 {
typedef unsigned long long __type; };
100 struct __add_unsigned<bool>;
103 struct __add_unsigned<wchar_t>;
107 template<
typename _Tp>
108 struct __remove_unsigned
111 typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
114 typedef typename __if_type::__type __type;
118 struct __remove_unsigned<char>
119 {
typedef signed char __type; };
122 struct __remove_unsigned<unsigned char>
123 {
typedef signed char __type; };
126 struct __remove_unsigned<unsigned short>
127 {
typedef short __type; };
130 struct __remove_unsigned<unsigned int>
131 {
typedef int __type; };
134 struct __remove_unsigned<unsigned long>
135 {
typedef long __type; };
138 struct __remove_unsigned<unsigned long long>
139 {
typedef long long __type; };
143 struct __remove_unsigned<bool>;
146 struct __remove_unsigned<wchar_t>;
150 template<
typename _Type>
152 __is_null_pointer(_Type* __ptr)
153 {
return __ptr == 0; }
155 template<
typename _Type>
157 __is_null_pointer(_Type)
160#if __cplusplus >= 201103L
162 __is_null_pointer(std::nullptr_t)
168 template<typename _Tp, bool = std::__is_integer<_Tp>::__value>
170 {
typedef double __type; };
175 template<
typename _Tp>
176 struct __promote<_Tp, false>
180 struct __promote<long double>
181 {
typedef long double __type; };
184 struct __promote<double>
185 {
typedef double __type; };
188 struct __promote<float>
189 {
typedef float __type; };
191#if __cpp_fold_expressions
192 template<
typename... _Tp>
193 using __promoted_t =
decltype((
typename __promote<_Tp>::__type(0) + ...));
196 template<
typename _Tp,
typename _Up,
197 typename _Tp2 =
typename __promote<_Tp>::__type,
198 typename _Up2 =
typename __promote<_Up>::__type>
201 typedef __typeof__(_Tp2() + _Up2()) __type;
204 template<typename _Tp, typename _Up, typename _Vp,
205 typename _Tp2 = typename __promote<_Tp>::__type,
206 typename _Up2 = typename __promote<_Up>::__type,
207 typename _Vp2 = typename __promote<_Vp>::__type>
210 typedef __typeof__(_Tp2() + _Up2() + _Vp2()) __type;
213 template<typename _Tp, typename _Up, typename _Vp, typename _Wp,
214 typename _Tp2 = typename __promote<_Tp>::__type,
215 typename _Up2 = typename __promote<_Up>::__type,
216 typename _Vp2 = typename __promote<_Vp>::__type,
217 typename _Wp2 = typename __promote<_Wp>::__type>
220 typedef __typeof__(_Tp2() + _Up2() + _Vp2() + _Wp2()) __type;
223_GLIBCXX_END_NAMESPACE_VERSION
GNU extensions for public use.