MathTrait.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_TRAITS_MATHTRAIT_H_
36 #define _BLAZE_MATH_TRAITS_MATHTRAIT_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <cstddef>
44 #include <blaze/util/Complex.h>
45 #include <blaze/util/InvalidType.h>
46 #include <blaze/util/mpl/If.h>
47 #include <blaze/util/mpl/Or.h>
52 
53 
54 namespace blaze {
55 
56 //=================================================================================================
57 //
58 // CLASS DEFINITION
59 //
60 //=================================================================================================
61 
62 //*************************************************************************************************
134 template< typename T1, typename T2 >
135 struct MathTrait
136 {
137  private:
138  //**********************************************************************************************
140  struct Failure {
141  using HighType = INVALID_TYPE;
142  using LowType = INVALID_TYPE;
143  };
145  //**********************************************************************************************
146 
147  //**********************************************************************************************
149  using Helper = MathTrait< Decay_<T1>, Decay_<T2> >;
151  //**********************************************************************************************
152 
153  public:
154  //**********************************************************************************************
156  using HighType = typename If_< Or< IsConst<T1>, IsVolatile<T1>, IsReference<T1>
158  , Helper
159  , Failure >::HighType;
160 
161  using LowType = typename If_< Or< IsConst<T1>, IsVolatile<T1>, IsReference<T1>
162  , IsConst<T2>, IsVolatile<T2>, IsReference<T2> >
163  , Helper
164  , Failure >::LowType;
166  //**********************************************************************************************
167 };
168 //*************************************************************************************************
169 
170 
171 
172 
173 //=================================================================================================
174 //
175 // MATHTRAIT SPECIALIZATION FOR IDENTICAL TYPES
176 //
177 //=================================================================================================
178 
179 //*************************************************************************************************
189 template< typename T >
190 struct MathTrait<T,T>
191 {
192  //**********************************************************************************************
193  using HighType = Decay_<T>;
194  using LowType = HighType;
195  //**********************************************************************************************
196 };
198 //*************************************************************************************************
199 
200 
201 
202 
203 //=================================================================================================
204 //
205 // MATHTRAIT SPECIALIZATION MACRO
206 //
207 //=================================================================================================
208 
209 //*************************************************************************************************
216 #define BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION(T1,T2,HIGH,LOW) \
217  template<> \
218  struct MathTrait< T1, T2 > \
219  { \
220  using HighType = HIGH; \
221  using LowType = LOW; \
222  }
223 
224 //*************************************************************************************************
225 
226 
227 //*************************************************************************************************
234 #define BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( T1 ) \
235  template< typename T2 > \
236  struct MathTrait< T1, complex<T2> > \
237  { \
238  using HighType = complex<T2>; \
239  using LowType = T1; \
240  }; \
241  template< typename T2 > \
242  struct MathTrait< complex<T2>, T1 > \
243  { \
244  using HighType = complex<T2>; \
245  using LowType = T1; \
246  }
247 
248 //*************************************************************************************************
249 
250 
251 
252 
253 //=================================================================================================
254 //
255 // UNSIGNED CHAR SPECIALIZATIONS
256 //
257 //=================================================================================================
258 
259 //*************************************************************************************************
261 // Type 1 Type 2 High type Low type
262 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , unsigned char , unsigned char , unsigned char );
263 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , char , char , unsigned char );
264 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , signed char , signed char , unsigned char );
265 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , wchar_t , wchar_t , unsigned char );
266 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , unsigned short, unsigned short, unsigned char );
267 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , short , short , unsigned char );
268 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , unsigned int , unsigned int , unsigned char );
269 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , int , int , unsigned char );
270 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , unsigned long , unsigned long , unsigned char );
271 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , long , long , unsigned char );
272 #if defined(_WIN64)
273 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , std::size_t , std::size_t , unsigned char );
274 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , std::ptrdiff_t, std::ptrdiff_t, unsigned char );
275 #endif
276 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , float , float , unsigned char );
277 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , double , double , unsigned char );
278 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned char , long double , long double , unsigned char );
280 //*************************************************************************************************
281 
282 
283 
284 
285 //=================================================================================================
286 //
287 // CHAR SPECIALIZATIONS
288 //
289 //=================================================================================================
290 
291 //*************************************************************************************************
293 // Type 1 Type 2 High type Low type
294 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , unsigned char , char , unsigned char );
295 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , char , char , char );
296 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , signed char , signed char , char );
297 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , wchar_t , wchar_t , char );
298 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , unsigned short, unsigned short, char );
299 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , short , short , char );
300 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , unsigned int , unsigned int , char );
301 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , int , int , char );
302 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , unsigned long , unsigned long , char );
303 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , long , long , char );
304 #if defined(_WIN64)
305 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , std::size_t , std::size_t , char );
306 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , std::ptrdiff_t, std::ptrdiff_t, char );
307 #endif
308 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , float , float , char );
309 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , double , double , char );
310 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( char , long double , long double , char );
312 //*************************************************************************************************
313 
314 
315 
316 
317 //=================================================================================================
318 //
319 // SIGNED CHAR SPECIALIZATIONS
320 //
321 //=================================================================================================
322 
323 //*************************************************************************************************
325 // Type 1 Type 2 High type Low type
326 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , unsigned char , signed char , unsigned char );
327 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , char , signed char , char );
328 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , signed char , signed char , signed char );
329 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , wchar_t , wchar_t , signed char );
330 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , unsigned short, unsigned short, signed char );
331 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , short , short , signed char );
332 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , unsigned int , unsigned int , signed char );
333 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , int , int , signed char );
334 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , unsigned long , unsigned long , signed char );
335 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , long , long , signed char );
336 #if defined(_WIN64)
337 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , std::size_t , std::size_t , signed char );
338 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , std::ptrdiff_t, std::ptrdiff_t, signed char );
339 #endif
340 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , float , float , signed char );
341 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , double , double , signed char );
342 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( signed char , long double , long double , signed char );
344 //*************************************************************************************************
345 
346 
347 
348 
349 //=================================================================================================
350 //
351 // WCHAR_T SPECIALIZATIONS
352 //
353 //=================================================================================================
354 
355 //*************************************************************************************************
357 // Type 1 Type 2 High type Low type
358 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , unsigned char , wchar_t , unsigned char );
359 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , char , wchar_t , char );
360 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , signed char , wchar_t , signed char );
361 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , wchar_t , wchar_t , wchar_t );
362 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , unsigned short, unsigned short, wchar_t );
363 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , short , short , wchar_t );
364 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , unsigned int , unsigned int , wchar_t );
365 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , int , int , wchar_t );
366 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , unsigned long , unsigned long , wchar_t );
367 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , long , long , wchar_t );
368 #if defined(_WIN64)
369 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , std::size_t , std::size_t , wchar_t );
370 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , std::ptrdiff_t, std::ptrdiff_t, wchar_t );
371 #endif
372 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , float , float , wchar_t );
373 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , double , double , wchar_t );
374 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( wchar_t , long double , long double , wchar_t );
376 //*************************************************************************************************
377 
378 
379 
380 
381 //=================================================================================================
382 //
383 // UNSIGNED SHORT SPECIALIZATIONS
384 //
385 //=================================================================================================
386 
387 //*************************************************************************************************
389 // Type 1 Type 2 High type Low type
390 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, unsigned char , unsigned short, unsigned char );
391 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, char , unsigned short, char );
392 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, signed char , unsigned short, signed char );
393 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, wchar_t , unsigned short, wchar_t );
394 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, unsigned short, unsigned short, unsigned short );
395 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, short , short , unsigned short );
396 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, unsigned int , unsigned int , unsigned short );
397 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, int , int , unsigned short );
398 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, unsigned long , unsigned long , unsigned short );
399 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, long , long , unsigned short );
400 #if defined(_WIN64)
401 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, std::size_t , std::size_t , unsigned short );
402 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, std::ptrdiff_t, std::ptrdiff_t, unsigned short );
403 #endif
404 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, float , float , unsigned short );
405 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, double , double , unsigned short );
406 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned short, long double , long double , unsigned short );
408 //*************************************************************************************************
409 
410 
411 
412 
413 //=================================================================================================
414 //
415 // SHORT SPECIALIZATIONS
416 //
417 //=================================================================================================
418 
419 //*************************************************************************************************
421 // Type 1 Type 2 High type Low type
422 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , unsigned char , short , unsigned char );
423 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , char , short , char );
424 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , signed char , short , signed char );
425 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , wchar_t , short , wchar_t );
426 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , unsigned short, short , unsigned short );
427 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , short , short , short );
428 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , unsigned int , unsigned int , short );
429 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , int , int , short );
430 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , unsigned long , unsigned long , short );
431 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , long , long , short );
432 #if defined(_WIN64)
433 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , std::size_t , std::size_t , short );
434 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , std::ptrdiff_t, std::ptrdiff_t, short );
435 #endif
436 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , float , float , short );
437 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , double , double , short );
438 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( short , long double , long double , short );
440 //*************************************************************************************************
441 
442 
443 
444 
445 //=================================================================================================
446 //
447 // UNSIGNED INT SPECIALIZATIONS
448 //
449 //=================================================================================================
450 
451 //*************************************************************************************************
453 // Type 1 Type 2 High type Low type
454 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , unsigned char , unsigned int , unsigned char );
455 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , char , unsigned int , char );
456 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , signed char , unsigned int , signed char );
457 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , wchar_t , unsigned int , wchar_t );
458 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , unsigned short, unsigned int , unsigned short );
459 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , short , unsigned int , short );
460 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , unsigned int , unsigned int , unsigned int );
461 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , int , int , unsigned int );
462 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , unsigned long , unsigned long , unsigned int );
463 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , long , long , unsigned int );
464 #if defined(_WIN64)
465 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , std::size_t , std::size_t , unsigned int );
466 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , std::ptrdiff_t, std::ptrdiff_t, unsigned int );
467 #endif
468 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , float , float , unsigned int );
469 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , double , double , unsigned int );
470 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned int , long double , long double , unsigned int );
472 //*************************************************************************************************
473 
474 
475 
476 
477 //=================================================================================================
478 //
479 // INT SPECIALIZATIONS
480 //
481 //=================================================================================================
482 
483 //*************************************************************************************************
485 // Type 1 Type 2 High type Low type
486 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , unsigned char , int , unsigned char );
487 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , char , int , wchar_t );
488 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , signed char , int , signed char );
489 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , wchar_t , int , wchar_t );
490 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , unsigned short, int , unsigned short );
491 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , short , int , short );
492 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , unsigned int , int , unsigned int );
493 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , int , int , int );
494 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , unsigned long , unsigned long , int );
495 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , long , long , int );
496 #if defined(_WIN64)
497 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , std::size_t , std::size_t , int );
498 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , std::ptrdiff_t, std::ptrdiff_t, int );
499 #endif
500 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , float , float , int );
501 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , double , double , int );
502 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( int , long double , long double , int );
504 //*************************************************************************************************
505 
506 
507 
508 
509 //=================================================================================================
510 //
511 // UNSIGNED LONG SPECIALIZATIONS
512 //
513 //=================================================================================================
514 
515 //*************************************************************************************************
517 // Type 1 Type 2 High type Low type
518 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , unsigned char , unsigned long , unsigned char );
519 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , char , unsigned long , char );
520 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , signed char , unsigned long , signed char );
521 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , wchar_t , unsigned long , wchar_t );
522 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , unsigned short, unsigned long , unsigned short );
523 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , short , unsigned long , short );
524 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , unsigned int , unsigned long , unsigned int );
525 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , int , unsigned long , int );
526 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , unsigned long , unsigned long , unsigned long );
527 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , long , long , unsigned long );
528 #if defined(_WIN64)
529 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , std::size_t , std::size_t , unsigned long );
530 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , std::ptrdiff_t, std::ptrdiff_t, unsigned long );
531 #endif
532 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , float , float , unsigned long );
533 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , double , double , unsigned long );
534 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( unsigned long , long double , long double , unsigned long );
536 //*************************************************************************************************
537 
538 
539 
540 
541 //=================================================================================================
542 //
543 // LONG SPECIALIZATIONS
544 //
545 //=================================================================================================
546 
547 //*************************************************************************************************
549 // Type 1 Type 2 High type Low type
550 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , unsigned char , long , unsigned char );
551 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , char , long , char );
552 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , signed char , long , signed char );
553 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , wchar_t , long , wchar_t );
554 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , unsigned short, long , unsigned short );
555 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , short , long , short );
556 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , unsigned int , long , unsigned int );
557 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , int , long , int );
558 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , unsigned long , long , unsigned long );
559 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , long , long , long );
560 #if defined(_WIN64)
561 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , std::size_t , std::size_t , long );
562 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , std::ptrdiff_t, std::ptrdiff_t, long );
563 #endif
564 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , float , float , long );
565 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , double , double , long );
566 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long , long double , long double , long );
568 //*************************************************************************************************
569 
570 
571 
572 
573 //=================================================================================================
574 //
575 // SIZE_T SPECIALIZATIONS
576 //
577 //=================================================================================================
578 
579 //*************************************************************************************************
580 #if defined(_WIN64)
581 
582 // Type 1 Type 2 High type Low type
583 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , unsigned char , std::size_t , unsigned char );
584 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , char , std::size_t , char );
585 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , signed char , std::size_t , signed char );
586 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , wchar_t , std::size_t , wchar_t );
587 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , unsigned short, std::size_t , unsigned short );
588 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , short , std::size_t , short );
589 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , unsigned int , std::size_t , unsigned int );
590 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , int , std::size_t , int );
591 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , unsigned long , std::size_t , unsigned long );
592 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , long , std::size_t , long );
593 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , std::size_t , std::size_t , std::size_t );
594 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , std::ptrdiff_t, std::ptrdiff_t, std::size_t );
595 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , float , float , std::size_t );
596 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , double , double , std::size_t );
597 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::size_t , long double , long double , std::size_t );
599 #endif
600 //*************************************************************************************************
601 
602 
603 
604 
605 //=================================================================================================
606 //
607 // PTRDIFF_T SPECIALIZATIONS
608 //
609 //=================================================================================================
610 
611 //*************************************************************************************************
612 #if defined(_WIN64)
613 
614 // Type 1 Type 2 High type Low type
615 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, unsigned char , std::ptrdiff_t, unsigned char );
616 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, char , std::ptrdiff_t, char );
617 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, signed char , std::ptrdiff_t, signed char );
618 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, wchar_t , std::ptrdiff_t, wchar_t );
619 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, unsigned short, std::ptrdiff_t, unsigned short );
620 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, short , std::ptrdiff_t, short );
621 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, unsigned int , std::ptrdiff_t, unsigned int );
622 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, int , std::ptrdiff_t, int );
623 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, unsigned long , std::ptrdiff_t, unsigned long );
624 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, long , std::ptrdiff_t, long );
625 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, std::size_t , std::ptrdiff_t, std::size_t );
626 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, std::ptrdiff_t, std::ptrdiff_t, std::ptrdiff_t );
627 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, float , float , std::ptrdiff_t );
628 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, double , double , std::ptrdiff_t );
629 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t, long double , long double , std::ptrdiff_t );
631 #endif
632 //*************************************************************************************************
633 
634 
635 
636 
637 //=================================================================================================
638 //
639 // FLOAT SPECIALIZATIONS
640 //
641 //=================================================================================================
642 
643 //*************************************************************************************************
645 // Type 1 Type 2 High type Low type
646 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , unsigned char , float , unsigned char );
647 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , char , float , char );
648 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , signed char , float , signed char );
649 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , wchar_t , float , wchar_t );
650 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , unsigned short, float , unsigned short );
651 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , short , float , short );
652 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , unsigned int , float , unsigned int );
653 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , int , float , int );
654 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , unsigned long , float , unsigned long );
655 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , long , float , long );
656 #if defined(_WIN64)
657 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , std::size_t , float , std::size_t );
658 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , std::ptrdiff_t, float , std::ptrdiff_t );
659 #endif
660 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , float , float , float );
661 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , double , double , float );
662 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( float , long double , long double , float );
664 //*************************************************************************************************
665 
666 
667 
668 
669 //=================================================================================================
670 //
671 // DOUBLE SPECIALIZATIONS
672 //
673 //=================================================================================================
674 
675 //*************************************************************************************************
677 // Type 1 Type 2 High type Low type
678 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , unsigned char , double , unsigned char );
679 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , char , double , char );
680 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , signed char , double , signed char );
681 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , wchar_t , double , wchar_t );
682 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , unsigned short, double , unsigned short );
683 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , short , double , short );
684 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , unsigned int , double , unsigned int );
685 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , int , double , int );
686 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , unsigned long , double , unsigned long );
687 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , long , double , long );
688 #if defined(_WIN64)
689 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , std::size_t , double , std::size_t );
690 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , std::ptrdiff_t, double , std::ptrdiff_t );
691 #endif
692 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , float , double , float );
693 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , double , double , double );
694 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( double , long double , long double , double );
696 //*************************************************************************************************
697 
698 
699 
700 
701 //=================================================================================================
702 //
703 // LONG DOUBLE SPECIALIZATIONS
704 //
705 //=================================================================================================
706 
707 //*************************************************************************************************
709 // Type 1 Type 2 High type Low type
710 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , unsigned char , long double , unsigned char );
711 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , char , long double , char );
712 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , signed char , long double , signed char );
713 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , wchar_t , long double , wchar_t );
714 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , unsigned short, long double , unsigned short );
715 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , short , long double , short );
716 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , unsigned int , long double , unsigned int );
717 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , int , long double , int );
718 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , unsigned long , long double , unsigned long );
719 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , long , long double , long );
720 #if defined(_WIN64)
721 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , std::size_t , long double , std::size_t );
722 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , std::ptrdiff_t, long double , std::ptrdiff_t );
723 #endif
724 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , float , long double , float );
725 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , double , long double , double );
726 BLAZE_CREATE_BUILTIN_MATHTRAIT_SPECIALIZATION( long double , long double , long double , long double );
728 //*************************************************************************************************
729 
730 
731 
732 
733 //=================================================================================================
734 //
735 // COMPLEX SPECIALIZATIONS
736 //
737 //=================================================================================================
738 
739 //*************************************************************************************************
741 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( unsigned char );
742 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( char );
743 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( signed char );
744 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( wchar_t );
745 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( unsigned short );
746 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( short );
747 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( unsigned int );
748 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( int );
749 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( unsigned long );
750 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( long );
751 #if defined(_WIN64)
752 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( std::size_t );
753 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( std::ptrdiff_t );
754 #endif
755 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( float );
756 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( double );
757 BLAZE_CREATE_COMPLEX_MATHTRAIT_SPECIALIZATION( long double );
759 //*************************************************************************************************
760 
761 
762 //*************************************************************************************************
764 template< typename T1, typename T2 >
765 struct MathTrait< complex<T1>, complex<T2> >
766 {
767  using HighType = complex<typename MathTrait<T1,T2>::HighType>;
768  using LowType = complex<typename MathTrait<T1,T2>::LowType>;
769 };
771 //*************************************************************************************************
772 
773 } // namespace blaze
774 
775 #endif
Compile time check for volatile data types.The IsVolatile type trait tests whether or not the given t...
Definition: IsVolatile.h:75
typename Decay< T >::Type Decay_
Auxiliary alias declaration for the Decay type trait.The Decay_ alias declaration provides a convenie...
Definition: Decay.h:98
Header file for the IsVolatile type trait.
Base template for the MathTrait class.
Definition: MathTrait.h:135
Header file for the Decay type trait.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
Header file for the If class template.
Header file for the Or class template.
Header file for the IsConst type trait.
Utility type for generic codes.
typename If< T1, T2, T3 >::Type If_
Auxiliary alias declaration for the If class template.The If_ alias declaration provides a convenient...
Definition: If.h:160
Header file for the IsReference type trait.
Compile time check for constant data types.The IsConst type trait tests whether or not the given temp...
Definition: IsConst.h:75
Compile time type check.This class tests whether the given template parameter T is a reference type (...
Definition: IsReference.h:75
Header file for the complex data type.