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