1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc. 2 3 //Distributed under the Boost Software License, Version 1.0. (See accompanying 4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef UUID_F20566FC196311E0B99D606CDFD72085 7 #define UUID_F20566FC196311E0B99D606CDFD72085 8 9 #include <boost/qvm/scalar_traits.hpp> 10 11 namespace 12 boost 13 { 14 namespace 15 qvm 16 { 17 namespace 18 deduce_scalar_detail 19 { 20 template <class A,class B> struct deduce_scalar_impl { }; 21 22 template <class T> 23 struct 24 deduce_scalar_impl<T,T> 25 { 26 typedef T type; 27 }; 28 29 template <> struct deduce_scalar_impl<signed char,unsigned char> { typedef unsigned char type; }; 30 template <> struct deduce_scalar_impl<signed char,unsigned short> { typedef unsigned short type; }; 31 template <> struct deduce_scalar_impl<signed char,unsigned int> { typedef unsigned int type; }; 32 template <> struct deduce_scalar_impl<signed char,unsigned long> { typedef unsigned long type; }; 33 template <> struct deduce_scalar_impl<signed char,signed short> { typedef signed short type; }; 34 template <> struct deduce_scalar_impl<signed char,signed int> { typedef signed int type; }; 35 template <> struct deduce_scalar_impl<signed char,signed long> { typedef signed long type; }; 36 template <> struct deduce_scalar_impl<signed char,float> { typedef float type; }; 37 template <> struct deduce_scalar_impl<signed char,double> { typedef double type; }; 38 template <> struct deduce_scalar_impl<unsigned char,unsigned short> { typedef unsigned short type; }; 39 template <> struct deduce_scalar_impl<unsigned char,unsigned int> { typedef unsigned int type; }; 40 template <> struct deduce_scalar_impl<unsigned char,unsigned long> { typedef unsigned long type; }; 41 template <> struct deduce_scalar_impl<unsigned char,signed short> { typedef signed short type; }; 42 template <> struct deduce_scalar_impl<unsigned char,signed int> { typedef signed int type; }; 43 template <> struct deduce_scalar_impl<unsigned char,signed long> { typedef signed long type; }; 44 template <> struct deduce_scalar_impl<unsigned char,float> { typedef float type; }; 45 template <> struct deduce_scalar_impl<unsigned char,double> { typedef double type; }; 46 template <> struct deduce_scalar_impl<signed short,unsigned short> { typedef unsigned short type; }; 47 template <> struct deduce_scalar_impl<signed short,unsigned int> { typedef unsigned int type; }; 48 template <> struct deduce_scalar_impl<signed short,unsigned long> { typedef unsigned long type; }; 49 template <> struct deduce_scalar_impl<signed short,signed int> { typedef signed int type; }; 50 template <> struct deduce_scalar_impl<signed short,signed long> { typedef signed long type; }; 51 template <> struct deduce_scalar_impl<signed short,float> { typedef float type; }; 52 template <> struct deduce_scalar_impl<signed short,double> { typedef double type; }; 53 template <> struct deduce_scalar_impl<unsigned short,unsigned int> { typedef unsigned int type; }; 54 template <> struct deduce_scalar_impl<unsigned short,unsigned long> { typedef unsigned long type; }; 55 template <> struct deduce_scalar_impl<unsigned short,signed int> { typedef signed int type; }; 56 template <> struct deduce_scalar_impl<unsigned short,signed long> { typedef signed long type; }; 57 template <> struct deduce_scalar_impl<unsigned short,float> { typedef float type; }; 58 template <> struct deduce_scalar_impl<unsigned short,double> { typedef double type; }; 59 template <> struct deduce_scalar_impl<signed int,unsigned int> { typedef unsigned int type; }; 60 template <> struct deduce_scalar_impl<signed int,unsigned long> { typedef unsigned long type; }; 61 template <> struct deduce_scalar_impl<signed int,signed long> { typedef signed long type; }; 62 template <> struct deduce_scalar_impl<signed int,float> { typedef float type; }; 63 template <> struct deduce_scalar_impl<signed int,double> { typedef double type; }; 64 template <> struct deduce_scalar_impl<unsigned int,unsigned long> { typedef unsigned long type; }; 65 template <> struct deduce_scalar_impl<unsigned int,signed long> { typedef signed long type; }; 66 template <> struct deduce_scalar_impl<unsigned int,float> { typedef float type; }; 67 template <> struct deduce_scalar_impl<unsigned int,double> { typedef double type; }; 68 template <> struct deduce_scalar_impl<signed long,unsigned long> { typedef unsigned long type; }; 69 template <> struct deduce_scalar_impl<signed long,float> { typedef float type; }; 70 template <> struct deduce_scalar_impl<signed long,double> { typedef double type; }; 71 template <> struct deduce_scalar_impl<unsigned long,float> { typedef float type; }; 72 template <> struct deduce_scalar_impl<unsigned long,double> { typedef double type; }; 73 template <> struct deduce_scalar_impl<float,double> { typedef double type; }; 74 75 template <> struct deduce_scalar_impl<unsigned char,signed char> { typedef unsigned char type; }; 76 template <> struct deduce_scalar_impl<unsigned short,signed char> { typedef unsigned short type; }; 77 template <> struct deduce_scalar_impl<unsigned int,signed char> { typedef unsigned int type; }; 78 template <> struct deduce_scalar_impl<unsigned long,signed char> { typedef unsigned long type; }; 79 template <> struct deduce_scalar_impl<signed short,signed char> { typedef signed short type; }; 80 template <> struct deduce_scalar_impl<signed int,signed char> { typedef signed int type; }; 81 template <> struct deduce_scalar_impl<signed long,signed char> { typedef signed long type; }; 82 template <> struct deduce_scalar_impl<float,signed char> { typedef float type; }; 83 template <> struct deduce_scalar_impl<double,signed char> { typedef double type; }; 84 template <> struct deduce_scalar_impl<unsigned short,unsigned char> { typedef unsigned short type; }; 85 template <> struct deduce_scalar_impl<unsigned int,unsigned char> { typedef unsigned int type; }; 86 template <> struct deduce_scalar_impl<unsigned long,unsigned char> { typedef unsigned long type; }; 87 template <> struct deduce_scalar_impl<signed short,unsigned char> { typedef signed short type; }; 88 template <> struct deduce_scalar_impl<signed int,unsigned char> { typedef signed int type; }; 89 template <> struct deduce_scalar_impl<signed long,unsigned char> { typedef signed long type; }; 90 template <> struct deduce_scalar_impl<float,unsigned char> { typedef float type; }; 91 template <> struct deduce_scalar_impl<double,unsigned char> { typedef double type; }; 92 template <> struct deduce_scalar_impl<unsigned short,signed short> { typedef unsigned short type; }; 93 template <> struct deduce_scalar_impl<unsigned int,signed short> { typedef unsigned int type; }; 94 template <> struct deduce_scalar_impl<unsigned long,signed short> { typedef unsigned long type; }; 95 template <> struct deduce_scalar_impl<signed int,signed short> { typedef signed int type; }; 96 template <> struct deduce_scalar_impl<signed long,signed short> { typedef signed long type; }; 97 template <> struct deduce_scalar_impl<float,signed short> { typedef float type; }; 98 template <> struct deduce_scalar_impl<double,signed short> { typedef double type; }; 99 template <> struct deduce_scalar_impl<unsigned int,unsigned short> { typedef unsigned int type; }; 100 template <> struct deduce_scalar_impl<unsigned long,unsigned short> { typedef unsigned long type; }; 101 template <> struct deduce_scalar_impl<signed int,unsigned short> { typedef signed int type; }; 102 template <> struct deduce_scalar_impl<signed long,unsigned short> { typedef signed long type; }; 103 template <> struct deduce_scalar_impl<float,unsigned short> { typedef float type; }; 104 template <> struct deduce_scalar_impl<double,unsigned short> { typedef double type; }; 105 template <> struct deduce_scalar_impl<unsigned int,signed int> { typedef unsigned int type; }; 106 template <> struct deduce_scalar_impl<unsigned long,signed int> { typedef unsigned long type; }; 107 template <> struct deduce_scalar_impl<signed long,signed int> { typedef signed long type; }; 108 template <> struct deduce_scalar_impl<float,signed int> { typedef float type; }; 109 template <> struct deduce_scalar_impl<double,signed int> { typedef double type; }; 110 template <> struct deduce_scalar_impl<unsigned long,unsigned int> { typedef unsigned long type; }; 111 template <> struct deduce_scalar_impl<signed long,unsigned int> { typedef signed long type; }; 112 template <> struct deduce_scalar_impl<float,unsigned int> { typedef float type; }; 113 template <> struct deduce_scalar_impl<double,unsigned int> { typedef double type; }; 114 template <> struct deduce_scalar_impl<unsigned long,signed long> { typedef unsigned long type; }; 115 template <> struct deduce_scalar_impl<float,signed long> { typedef float type; }; 116 template <> struct deduce_scalar_impl<double,signed long> { typedef double type; }; 117 template <> struct deduce_scalar_impl<float,unsigned long> { typedef float type; }; 118 template <> struct deduce_scalar_impl<double,unsigned long> { typedef double type; }; 119 template <> struct deduce_scalar_impl<double,float> { typedef double type; }; 120 } 121 122 template <class A,class B> 123 struct 124 deduce_scalar 125 { 126 typedef typename deduce_scalar_detail::deduce_scalar_impl<A,B>::type type; 127 }; 128 } 129 } 130 131 #endif 132