34 #ifndef __INCLUDE_MIST_TYPE_TRAIT_H__
35 #define __INCLUDE_MIST_TYPE_TRAIT_H__
37 #ifndef __INCLUDE_MIST_CONF_H__
55 template<
class T >
struct is_char { _MIST_CONST(
bool, value,
false ); };
56 template<>
struct is_char< unsigned char >{ _MIST_CONST(
bool, value,
true ); };
57 template<>
struct is_char< signed char > { _MIST_CONST(
bool, value,
true ); };
58 template<>
struct is_char< char > { _MIST_CONST(
bool, value,
true ); };
67 template<
class T >
struct is_float { _MIST_CONST(
bool, value,
false ); };
68 template<>
struct is_float< float > { _MIST_CONST(
bool, value,
true ); };
69 template<>
struct is_float< double > { _MIST_CONST(
bool, value,
true ); };
70 template<>
struct is_float< long double > { _MIST_CONST(
bool, value,
true ); };
80 template<
class T >
struct is_integer { _MIST_CONST(
bool, value,
false ); };
81 template<>
struct is_integer< unsigned char > { _MIST_CONST(
bool, value,
true ); };
82 template<>
struct is_integer< unsigned short >{ _MIST_CONST(
bool, value,
true ); };
83 template<>
struct is_integer< unsigned int > { _MIST_CONST(
bool, value,
true ); };
84 template<>
struct is_integer< unsigned long > { _MIST_CONST(
bool, value,
true ); };
85 template<>
struct is_integer< signed char > { _MIST_CONST(
bool, value,
true ); };
86 template<>
struct is_integer< signed short > { _MIST_CONST(
bool, value,
true ); };
87 template<>
struct is_integer< signed int > { _MIST_CONST(
bool, value,
true ); };
88 template<>
struct is_integer< signed long > { _MIST_CONST(
bool, value,
true ); };
89 template<>
struct is_integer< bool > { _MIST_CONST(
bool, value,
true ); };
90 template<>
struct is_integer< char > { _MIST_CONST(
bool, value,
true ); };
92 #if defined( __MIST64__ ) && __MIST64__ != 0 && !( defined( __GNUC__ ) || defined( __APPLE__ ) || defined( __ICC ) )
93 template<>
struct is_integer< size_t > { _MIST_CONST(
bool, value,
true ); };
94 template<>
struct is_integer< ptrdiff_t > { _MIST_CONST(
bool, value,
true ); };
103 template<
class T >
struct is_signed { _MIST_CONST(
bool, value,
false ); };
104 template<>
struct is_signed< signed char > { _MIST_CONST(
bool, value,
true ); };
105 template<>
struct is_signed< signed short > { _MIST_CONST(
bool, value,
true ); };
106 template<>
struct is_signed< signed int > { _MIST_CONST(
bool, value,
true ); };
107 template<>
struct is_signed< signed long > { _MIST_CONST(
bool, value,
true ); };
108 template<>
struct is_signed< char > { _MIST_CONST(
bool, value,
true ); };
109 template<>
struct is_signed< float > { _MIST_CONST(
bool, value,
true ); };
110 template<>
struct is_signed< double > { _MIST_CONST(
bool, value,
true ); };
111 template<>
struct is_signed< long double > { _MIST_CONST(
bool, value,
true ); };
113 #if defined( __MIST64__ ) && __MIST64__ != 0 && !( defined( __GNUC__ ) || defined( __APPLE__ ) || defined( __ICC ) )
114 template<>
struct is_signed< ptrdiff_t > { _MIST_CONST(
bool, value,
true ); };
125 template<
class T >
struct is_arithmetic { _MIST_CONST(
bool, value,
false ); };
126 template<>
struct is_arithmetic< unsigned char > { _MIST_CONST(
bool, value,
true ); };
127 template<>
struct is_arithmetic< unsigned short >{ _MIST_CONST(
bool, value,
true ); };
128 template<>
struct is_arithmetic< unsigned int > { _MIST_CONST(
bool, value,
true ); };
129 template<>
struct is_arithmetic< unsigned long > { _MIST_CONST(
bool, value,
true ); };
130 template<>
struct is_arithmetic< signed char > { _MIST_CONST(
bool, value,
true ); };
131 template<>
struct is_arithmetic< signed short > { _MIST_CONST(
bool, value,
true ); };
132 template<>
struct is_arithmetic< signed int > { _MIST_CONST(
bool, value,
true ); };
133 template<>
struct is_arithmetic< signed long > { _MIST_CONST(
bool, value,
true ); };
134 template<>
struct is_arithmetic< bool > { _MIST_CONST(
bool, value,
true ); };
135 template<>
struct is_arithmetic< char > { _MIST_CONST(
bool, value,
true ); };
136 template<>
struct is_arithmetic< float > { _MIST_CONST(
bool, value,
true ); };
137 template<>
struct is_arithmetic< double > { _MIST_CONST(
bool, value,
true ); };
138 template<>
struct is_arithmetic< long double > { _MIST_CONST(
bool, value,
true ); };
140 #if defined( __MIST64__ ) && __MIST64__ != 0 && !( defined( __GNUC__ ) || defined( __APPLE__ ) || defined( __ICC ) )
141 template<>
struct is_arithmetic< size_t > { _MIST_CONST(
bool, value,
true ); };
142 template<>
struct is_arithmetic< ptrdiff_t > { _MIST_CONST(
bool, value,
true ); };
152 template<
class T >
struct is_builtin { _MIST_CONST(
bool, value,
false ); };
153 template<>
struct is_builtin< unsigned char > { _MIST_CONST(
bool, value,
true ); };
154 template<>
struct is_builtin< unsigned short >{ _MIST_CONST(
bool, value,
true ); };
155 template<>
struct is_builtin< unsigned int > { _MIST_CONST(
bool, value,
true ); };
156 template<>
struct is_builtin< unsigned long > { _MIST_CONST(
bool, value,
true ); };
157 template<>
struct is_builtin< signed char > { _MIST_CONST(
bool, value,
true ); };
158 template<>
struct is_builtin< signed short > { _MIST_CONST(
bool, value,
true ); };
159 template<>
struct is_builtin< signed int > { _MIST_CONST(
bool, value,
true ); };
160 template<>
struct is_builtin< signed long > { _MIST_CONST(
bool, value,
true ); };
161 template<>
struct is_builtin< bool > { _MIST_CONST(
bool, value,
true ); };
162 template<>
struct is_builtin< char > { _MIST_CONST(
bool, value,
true ); };
163 template<>
struct is_builtin< float > { _MIST_CONST(
bool, value,
true ); };
164 template<>
struct is_builtin< double > { _MIST_CONST(
bool, value,
true ); };
165 template<>
struct is_builtin< long double > { _MIST_CONST(
bool, value,
true ); };
167 #if defined( __MIST64__ ) && __MIST64__ != 0 && !( defined( __GNUC__ ) || defined( __APPLE__ ) || defined( __ICC ) )
168 template<>
struct is_builtin< size_t > { _MIST_CONST(
bool, value,
true ); };
169 template<>
struct is_builtin< ptrdiff_t > { _MIST_CONST(
bool, value,
true ); };
179 template<
class T >
struct float_type {
typedef double value_type; };
180 template<>
struct float_type< float > {
typedef float value_type; };
181 template<>
struct float_type< long double > {
typedef long double value_type; };
194 template<
class T1,
class T2 >
struct promote_trait {
typedef T1 value_type; };
196 #define PROMOTE_TRAIT( T1, T2, T3 ) \
197 template< > struct promote_trait< T1, T2 > { typedef T3 value_type; }; \
198 template< > struct promote_trait< T2, T1 > { typedef T3 value_type; };
200 PROMOTE_TRAIT(
unsigned char,
unsigned short,
unsigned short )
201 PROMOTE_TRAIT(
unsigned char,
unsigned int,
unsigned int )
202 PROMOTE_TRAIT(
unsigned char,
unsigned long,
unsigned long )
203 PROMOTE_TRAIT(
unsigned char,
signed char,
signed short )
204 PROMOTE_TRAIT(
unsigned char,
signed short,
signed short )
205 PROMOTE_TRAIT(
unsigned char,
signed int,
signed int )
206 PROMOTE_TRAIT(
unsigned char,
signed long,
signed long )
207 PROMOTE_TRAIT(
unsigned char,
bool,
unsigned char )
208 PROMOTE_TRAIT(
unsigned char,
char,
signed char )
209 PROMOTE_TRAIT(
unsigned char,
float,
float )
210 PROMOTE_TRAIT(
unsigned char,
double,
double )
211 PROMOTE_TRAIT(
unsigned char,
long double,
long double )
212 PROMOTE_TRAIT(
signed char,
unsigned short,
signed int )
213 PROMOTE_TRAIT(
signed char,
unsigned int,
signed long )
214 PROMOTE_TRAIT(
signed char,
unsigned long,
signed long )
215 PROMOTE_TRAIT(
signed char,
signed short,
signed short )
216 PROMOTE_TRAIT(
signed char,
signed int,
signed int )
217 PROMOTE_TRAIT(
signed char,
signed long,
signed long )
218 PROMOTE_TRAIT(
signed char,
bool,
signed char )
219 PROMOTE_TRAIT(
signed char,
char,
signed char )
220 PROMOTE_TRAIT(
signed char,
float,
float )
221 PROMOTE_TRAIT(
signed char,
double,
double )
222 PROMOTE_TRAIT(
signed char,
long double,
long double )
223 PROMOTE_TRAIT(
char,
unsigned short,
signed int )
224 PROMOTE_TRAIT(
char,
unsigned int,
signed long )
225 PROMOTE_TRAIT(
char,
unsigned long,
signed long )
226 PROMOTE_TRAIT(
char,
signed short,
signed short )
227 PROMOTE_TRAIT(
char,
signed int,
signed int )
228 PROMOTE_TRAIT(
char,
signed long,
signed long )
229 PROMOTE_TRAIT(
char,
bool,
char )
230 PROMOTE_TRAIT(
char,
float,
float )
231 PROMOTE_TRAIT(
char,
double,
double )
232 PROMOTE_TRAIT(
char,
long double,
long double )
233 PROMOTE_TRAIT(
unsigned short,
unsigned int,
unsigned int )
234 PROMOTE_TRAIT(
unsigned short,
unsigned long,
unsigned long )
235 PROMOTE_TRAIT(
unsigned short,
signed short,
signed int )
236 PROMOTE_TRAIT(
unsigned short,
signed int,
signed int )
237 PROMOTE_TRAIT(
unsigned short,
signed long,
signed long )
238 PROMOTE_TRAIT(
unsigned short,
bool,
unsigned short )
239 PROMOTE_TRAIT(
unsigned short,
float,
float )
240 PROMOTE_TRAIT(
unsigned short,
double,
double )
241 PROMOTE_TRAIT(
unsigned short,
long double,
long double )
242 PROMOTE_TRAIT(
signed short,
unsigned int,
signed int )
243 PROMOTE_TRAIT(
signed short,
unsigned long,
signed long )
244 PROMOTE_TRAIT(
signed short,
signed int,
signed int )
245 PROMOTE_TRAIT(
signed short,
signed long,
signed long )
246 PROMOTE_TRAIT(
signed short,
bool,
signed short )
247 PROMOTE_TRAIT(
signed short,
float,
float )
248 PROMOTE_TRAIT(
signed short,
double,
double )
249 PROMOTE_TRAIT(
signed short,
long double,
long double )
250 PROMOTE_TRAIT(
unsigned int,
unsigned long,
unsigned long )
251 PROMOTE_TRAIT(
unsigned int,
signed int,
signed long )
252 PROMOTE_TRAIT(
unsigned int,
signed long,
signed long )
253 PROMOTE_TRAIT(
unsigned int,
bool,
unsigned int )
254 PROMOTE_TRAIT(
unsigned int,
float,
double )
255 PROMOTE_TRAIT(
unsigned int,
double,
double )
256 PROMOTE_TRAIT(
unsigned int,
long double,
long double )
257 PROMOTE_TRAIT(
signed int,
unsigned long,
signed long )
258 PROMOTE_TRAIT(
signed int,
signed long,
signed long )
259 PROMOTE_TRAIT(
signed int,
bool,
signed int )
260 PROMOTE_TRAIT(
signed int,
float,
double )
261 PROMOTE_TRAIT(
signed int,
double,
double )
262 PROMOTE_TRAIT(
signed int,
long double,
long double )
263 PROMOTE_TRAIT(
unsigned long,
signed long,
signed long )
264 PROMOTE_TRAIT(
unsigned long,
bool,
unsigned long )
265 PROMOTE_TRAIT(
unsigned long,
float,
long double )
266 PROMOTE_TRAIT(
unsigned long,
double,
double )
267 PROMOTE_TRAIT(
unsigned long,
long double,
long double )
268 PROMOTE_TRAIT(
signed long,
bool,
signed int )
269 PROMOTE_TRAIT(
signed long,
float,
double )
270 PROMOTE_TRAIT(
signed long,
double,
double )
271 PROMOTE_TRAIT(
signed long,
long double,
long double )
272 PROMOTE_TRAIT(
bool,
float,
float )
273 PROMOTE_TRAIT(
bool,
double,
double )
274 PROMOTE_TRAIT(
bool,
long double,
long double )
275 PROMOTE_TRAIT(
float,
double,
double )
276 PROMOTE_TRAIT(
float,
long double,
long double )
277 PROMOTE_TRAIT(
double,
long double,
long double )
281 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
289 #define DEFINE_PROMOTE_BIND_OPERATOR1( TYPE, OPERATOR ) \
290 template < class T1, class T2 > \
291 inline TYPE< promote_trait< T1, T2 >::value_type > \
292 operator OPERATOR( const TYPE< T1 > &t1, const TYPE< T2 > &t2 ) \
294 return( TYPE< promote_trait< T1, T2 >::value_type >( t1 ) OPERATOR ## = t2 ); \
301 #define DEFINE_PROMOTE_BIND_OPERATOR2( TYPE, OPERATOR ) \
302 template < class T > \
303 inline TYPE< promote_trait< T, double >::value_type > \
304 operator OPERATOR( const TYPE< T > &t1, const double &t2 ) \
306 return( TYPE< promote_trait< T, double >::value_type >( t1 ) OPERATOR ## = t2 ); \
313 #define DEFINE_PROMOTE_BIND_OPERATOR3( TYPE, OPERATOR ) \
314 template < class T > \
315 inline TYPE< promote_trait< T, double >::value_type > \
316 operator OPERATOR( const double &t1, const TYPE< T > &t2 ) \
318 return( TYPE< promote_trait< T, double >::value_type >( t2 ) OPERATOR ## = t1 ); \
325 #define DEFINE_PROMOTE_BIND_OPERATOR4( TYPE, OPERATOR ) \
326 template < class T > \
327 inline TYPE< promote_trait< T, double >::value_type > \
328 operator OPERATOR( const double &t1, const TYPE< T > &t2 ) \
330 return( TYPE< promote_trait< T, double >::value_type >( t1 ) OPERATOR ## = t2 ); \
339 #define DEFINE_PROMOTE_BIND_OPERATOR1( TYPE, OPERATOR ) \
340 template < class T1, class T2 > \
341 inline TYPE< typename promote_trait< T1, T2 >::value_type > \
342 operator OPERATOR( const TYPE< T1 > &t1, const TYPE< T2 > &t2 ) \
344 return( TYPE< typename promote_trait< T1, T2 >::value_type >( t1 ) OPERATOR ## = t2 ); \
351 #define DEFINE_PROMOTE_BIND_OPERATOR2( TYPE, OPERATOR ) \
352 template < class T1, class T2 > \
353 inline TYPE< typename promote_trait< T1, T2 >::value_type > \
354 operator OPERATOR( const TYPE< T1 > &t1, const T2 &t2 ) \
356 return( TYPE< typename promote_trait< T1, T2 >::value_type >( t1 ) OPERATOR ## = t2 ); \
363 #define DEFINE_PROMOTE_BIND_OPERATOR3( TYPE, OPERATOR ) \
364 template < class T1, class T2 > \
365 inline TYPE< typename promote_trait< T1, T2 >::value_type > \
366 operator OPERATOR( const T1 &t1, const TYPE< T2 > &t2 ) \
368 return( TYPE< typename promote_trait< T1, T2 >::value_type >( t2 ) OPERATOR ## = t1 ); \
375 #define DEFINE_PROMOTE_BIND_OPERATOR4( TYPE, OPERATOR ) \
376 template < class T1, class T2 > \
377 inline TYPE< typename promote_trait< T1, T2 >::value_type > \
378 operator OPERATOR( const T1 &t1, const TYPE< T2 > &t2 ) \
380 return( TYPE< typename promote_trait< T1, T2 >::value_type >( t1 ) OPERATOR ## = t2 ); \
387 #define DEFINE_PROMOTE_BIND_OPERATOR1_( TYPE, OPERATOR ) \
388 template < class T1, class T2, size_t NDIM > \
389 inline TYPE< typename promote_trait< T1, T2 >::value_type, NDIM > \
390 operator OPERATOR( const TYPE< T1, NDIM > &t1, const TYPE< T2, NDIM > &t2 ) \
392 return( TYPE< typename promote_trait< T1, T2 >::value_type, NDIM >( t1 ) OPERATOR ## = t2 ); \
399 #define DEFINE_PROMOTE_BIND_OPERATOR2_( TYPE, OPERATOR ) \
400 template < class T1, class T2, size_t NDIM > \
401 inline TYPE< typename promote_trait< T1, T2 >::value_type, NDIM > \
402 operator OPERATOR( const TYPE< T1, NDIM > &t1, const T2 &t2 ) \
404 return( TYPE< typename promote_trait< T1, T2 >::value_type, NDIM >( t1 ) OPERATOR ## = t2 ); \
411 #define DEFINE_PROMOTE_BIND_OPERATOR3_( TYPE, OPERATOR ) \
412 template < class T1, class T2, size_t NDIM > \
413 inline TYPE< typename promote_trait< T1, T2 >::value_type, NDIM > \
414 operator OPERATOR( const T1 &t1, const TYPE< T2, NDIM > &t2 ) \
416 return( TYPE< typename promote_trait< T1, T2 >::value_type, NDIM >( t2 ) OPERATOR ## = t1 ); \
423 #define DEFINE_PROMOTE_BIND_OPERATOR4_( TYPE, OPERATOR ) \
424 template < class T1, class T2, size_t NDIM > \
425 inline TYPE< typename promote_trait< T1, T2 >::value_type, NDIM > \
426 operator OPERATOR( const T1 &t1, const TYPE< T2, NDIM > &t2 ) \
428 return( TYPE< typename promote_trait< T1, T2 >::value_type, NDIM >( t1 ) OPERATOR ## = t2 ); \
445 struct __half_adjust__
447 static double convert(
const double value )
449 return( value + 0.5 );
456 struct __half_adjust__< false >
458 static double convert(
const double value )
472 typedef T value_type;
474 static value_type
convert(
const double value )
493 template <
bool b1,
bool b2,
bool b3 = true,
bool b4 = true,
bool b5 = true,
bool b6 = true,
bool b7 = true >
496 _MIST_CONST(
bool, value,
false );
500 struct type_and< true, true, true, true, true, true, true >
502 _MIST_CONST(
bool, value,
true );
519 template <
bool b1,
bool b2,
bool b3 = false,
bool b4 = false,
bool b5 = false,
bool b6 = false,
bool b7 = false >
522 _MIST_CONST(
bool, value,
true );
526 struct type_or< false, false, false, false, false, false, false >
528 _MIST_CONST(
bool, value,
false );
543 _MIST_CONST(
bool, value,
true );
549 _MIST_CONST(
bool, value,
false );
562 template <
bool b1,
bool b2 >
565 _MIST_CONST(
bool, value,
false );
571 _MIST_CONST(
bool, value,
true );
575 struct type_equal< false, false >
577 _MIST_CONST(
bool, value,
true );
587 #endif // __INCLUDE_MIST_TYPE_TRAIT_H__