29#ifndef _EXT_TYPE_TRAITS
30#define _EXT_TYPE_TRAITS 1
33#pragma GCC system_header
39#pragma GCC diagnostic push
40#pragma GCC diagnostic ignored "-Wlong-long"
44namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
46_GLIBCXX_BEGIN_NAMESPACE_VERSION
49 template<
bool,
typename>
53 template<
typename _Tp>
54 struct __enable_if<true, _Tp>
55 {
typedef _Tp __type; };
59 template<
bool _Cond,
typename _Iftrue,
typename _Iffalse>
60 struct __conditional_type
61 {
typedef _Iftrue __type; };
63 template<
typename _Iftrue,
typename _Iffalse>
64 struct __conditional_type<false, _Iftrue, _Iffalse>
65 {
typedef _Iffalse __type; };
69 template<
typename _Tp>
73 typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
76 typedef typename __if_type::__type __type;
80 struct __add_unsigned<char>
81 {
typedef unsigned char __type; };
84 struct __add_unsigned<signed char>
85 {
typedef unsigned char __type; };
88 struct __add_unsigned<short>
89 {
typedef unsigned short __type; };
92 struct __add_unsigned<int>
93 {
typedef unsigned int __type; };
96 struct __add_unsigned<long>
97 {
typedef unsigned long __type; };
100 struct __add_unsigned<long long>
101 {
typedef unsigned long long __type; };
105 struct __add_unsigned<bool>;
108 struct __add_unsigned<wchar_t>;
112 template<
typename _Tp>
113 struct __remove_unsigned
116 typedef __enable_if<std::__is_integer<_Tp>::__value, _Tp> __if_type;
119 typedef typename __if_type::__type __type;
123 struct __remove_unsigned<char>
124 {
typedef signed char __type; };
127 struct __remove_unsigned<unsigned char>
128 {
typedef signed char __type; };
131 struct __remove_unsigned<unsigned short>
132 {
typedef short __type; };
135 struct __remove_unsigned<unsigned int>
136 {
typedef int __type; };
139 struct __remove_unsigned<unsigned long>
140 {
typedef long __type; };
143 struct __remove_unsigned<unsigned long long>
144 {
typedef long long __type; };
148 struct __remove_unsigned<bool>;
151 struct __remove_unsigned<wchar_t>;
155 template<
typename _Type>
158 __is_null_pointer(_Type* __ptr)
159 {
return __ptr == 0; }
161 template<
typename _Type>
164 __is_null_pointer(_Type)
167#if __cplusplus >= 201103L
169 __is_null_pointer(std::nullptr_t)
175 template<typename _Tp, bool = std::__is_integer<_Tp>::__value>
177 {
typedef double __type; };
182 template<
typename _Tp>
183 struct __promote<_Tp, false>
187 struct __promote<long double>
188 {
typedef long double __type; };
191 struct __promote<double>
192 {
typedef double __type; };
195 struct __promote<float>
196 {
typedef float __type; };
198#ifdef __STDCPP_FLOAT16_T__
200 struct __promote<_Float16>
201 {
typedef _Float16 __type; };
204#ifdef __STDCPP_FLOAT32_T__
206 struct __promote<_Float32>
207 {
typedef _Float32 __type; };
210#ifdef __STDCPP_FLOAT64_T__
212 struct __promote<_Float64>
213 {
typedef _Float64 __type; };
216#ifdef __STDCPP_FLOAT128_T__
218 struct __promote<_Float128>
219 {
typedef _Float128 __type; };
222#ifdef __STDCPP_BFLOAT16_T__
224 struct __promote<__gnu_cxx::__bfloat16_t>
225 {
typedef __gnu_cxx::__bfloat16_t __type; };
228#if __cpp_fold_expressions
230 template<
typename... _Tp>
231 using __promoted_t =
decltype((
typename __promote<_Tp>::__type(0) + ...));
235 template<
typename _Tp,
typename _Up>
236 using __promote_2 = __promote<__promoted_t<_Tp, _Up>>;
238 template<
typename _Tp,
typename _Up,
typename _Vp>
239 using __promote_3 = __promote<__promoted_t<_Tp, _Up, _Vp>>;
241 template<
typename _Tp,
typename _Up,
typename _Vp,
typename _Wp>
242 using __promote_4 = __promote<__promoted_t<_Tp, _Up, _Vp, _Wp>>;
246 template<
typename _Tp,
typename _Up,
247 typename _Tp2 =
typename __promote<_Tp>::__type,
248 typename _Up2 =
typename __promote<_Up>::__type>
251 typedef __typeof__(_Tp2() + _Up2()) __type;
254 template<typename _Tp, typename _Up, typename _Vp,
255 typename _Tp2 = typename __promote<_Tp>::__type,
256 typename _Up2 = typename __promote<_Up>::__type,
257 typename _Vp2 = typename __promote<_Vp>::__type>
260 typedef __typeof__(_Tp2() + _Up2() + _Vp2()) __type;
263 template<typename _Tp, typename _Up, typename _Vp, typename _Wp,
264 typename _Tp2 = typename __promote<_Tp>::__type,
265 typename _Up2 = typename __promote<_Up>::__type,
266 typename _Vp2 = typename __promote<_Vp>::__type,
267 typename _Wp2 = typename __promote<_Wp>::__type>
270 typedef __typeof__(_Tp2() + _Up2() + _Vp2() + _Wp2()) __type;
274_GLIBCXX_END_NAMESPACE_VERSION
278#pragma GCC diagnostic pop
GNU extensions for public use.