TECA
The Toolkit for Extreme Climate Analysis
teca_type_select.h
Go to the documentation of this file.
1 #ifndef teca_type_elevate_h
2 #define teca_type_elevate_h
3 
4 /// @file
5 
6 #include "teca_config.h"
7 
8 /// Select a type based on input type(s)
9 namespace teca_type_select
10 {
11 /// Select the higher precision type.
12 /** Given two arguments, an elevate cast, selects the type of or casts to the
13  * higher precision type. note that given a signed and unsigned argument,
14  * signed type is selected.
15  *
16  * @tparam t1 first input type
17  * @tparam t2 second input type
18  */
19 template <typename t1, typename t2>
20 struct TECA_EXPORT elevate {};
21 
22 /// Select the lower precision type.
23 /** Given two arguments, a decay cast, selects the type of or casts to the lower
24  * precision type. note that given a signed and unsigned argument, unsigned
25  * type is selected.
26  *
27  * @tparam t1 first input type
28  * @tparam t2 second input type
29  */
30 template <typename t1, typename t2>
31 struct TECA_EXPORT decay {};
32 
33 #define teca_type_select(_class, _ret, _t1, _t2) \
34 /** Given _t1 and _t2 _class to _ret */ \
35 template <> \
36 struct _class<_t1, _t2> \
37 { \
38  /** _class result type */ \
39  using type = _ret; \
40  \
41  /** cast to _ret */ \
42  static _ret cast(_t1 arg){ return arg; } \
43  \
44  /** name of the _class result type */ \
45  static constexpr const char *type_name() \
46  { return #_ret; } \
47 };
48 
49 #define teca_type_elevate_case(_ret, _t1, _t2) \
50 teca_type_select(elevate, _ret, _t1, _t2) \
51 
52 #define teca_type_elevate_sym_case(_ret, _t1, _t2) \
53 teca_type_elevate_case(_ret, _t1, _t2) \
54 teca_type_elevate_case(_ret, _t2, _t1)
55 
56 #define teca_type_decay_case(_ret, _t1, _t2) \
57 teca_type_select(decay, _ret, _t1, _t2) \
58 
59 #define teca_type_decay_sym_case(_ret, _t1, _t2) \
60 teca_type_decay_case(_ret, _t1, _t2) \
61 teca_type_decay_case(_ret, _t2, _t1)
62 
63 // elevate to double precision
64 teca_type_elevate_case(double, double, double)
65 teca_type_elevate_sym_case(double, double, float)
66 teca_type_elevate_sym_case(double, double, char)
67 teca_type_elevate_sym_case(double, double, short)
68 teca_type_elevate_sym_case(double, double, int)
69 teca_type_elevate_sym_case(double, double, long)
70 teca_type_elevate_sym_case(double, double, long long)
71 teca_type_elevate_sym_case(double, double, unsigned char)
72 teca_type_elevate_sym_case(double, double, unsigned short)
73 teca_type_elevate_sym_case(double, double, unsigned int)
74 teca_type_elevate_sym_case(double, double, unsigned long)
75 teca_type_elevate_sym_case(double, double, unsigned long long)
76 // elevate to single precision
77 teca_type_elevate_case(float, float, float)
78 teca_type_elevate_sym_case(float, float, char)
79 teca_type_elevate_sym_case(float, float, short)
80 teca_type_elevate_sym_case(float, float, int)
81 teca_type_elevate_sym_case(float, float, long)
82 teca_type_elevate_sym_case(float, float, long long)
83 teca_type_elevate_sym_case(float, float, unsigned char)
84 teca_type_elevate_sym_case(float, float, unsigned short)
85 teca_type_elevate_sym_case(float, float, unsigned int)
86 teca_type_elevate_sym_case(float, float, unsigned long)
87 teca_type_elevate_sym_case(float, float, unsigned long long)
88 // elevate to long long
89 teca_type_elevate_case(long long, long long, long long)
90 teca_type_elevate_sym_case(long long, long long, char)
91 teca_type_elevate_sym_case(long long, long long, short)
92 teca_type_elevate_sym_case(long long, long long, int)
93 teca_type_elevate_sym_case(long long, long long, long)
94 teca_type_elevate_sym_case(long long, long long, unsigned char)
95 teca_type_elevate_sym_case(long long, long long, unsigned short)
96 teca_type_elevate_sym_case(long long, long long, unsigned int)
97 teca_type_elevate_sym_case(long long, long long, unsigned long)
98 teca_type_elevate_sym_case(long long, long long, unsigned long long)
99 // elevate to unsigned long long
100 teca_type_elevate_case(unsigned long long, unsigned long long, unsigned long long)
101 teca_type_elevate_sym_case(long long, unsigned long long, char) // *
102 teca_type_elevate_sym_case(long long, unsigned long long, short) // *
103 teca_type_elevate_sym_case(long long, unsigned long long, int) // *
104 teca_type_elevate_sym_case(long long, unsigned long long, long) // *
105 teca_type_elevate_sym_case(unsigned long long, unsigned long long, unsigned char)
106 teca_type_elevate_sym_case(unsigned long long, unsigned long long, unsigned short)
107 teca_type_elevate_sym_case(unsigned long long, unsigned long long, unsigned int)
108 teca_type_elevate_sym_case(unsigned long long, unsigned long long, unsigned long)
109 // elevate to long
110 teca_type_elevate_case(long, long, long)
111 teca_type_elevate_sym_case(long, long, char)
112 teca_type_elevate_sym_case(long, long, short)
113 teca_type_elevate_sym_case(long, long, int)
114 teca_type_elevate_sym_case(long, long, unsigned char)
115 teca_type_elevate_sym_case(long, long, unsigned short)
116 teca_type_elevate_sym_case(long, long, unsigned int)
117 teca_type_elevate_sym_case(long, long, unsigned long)
118 // elevate to unsigned long
119 teca_type_elevate_case(unsigned long, unsigned long, unsigned long)
120 teca_type_elevate_sym_case(long, unsigned long, char) // *
121 teca_type_elevate_sym_case(long, unsigned long, short) // *
122 teca_type_elevate_sym_case(long, unsigned long, int) // *
123 teca_type_elevate_sym_case(unsigned long, unsigned long, unsigned char)
124 teca_type_elevate_sym_case(unsigned long, unsigned long, unsigned short)
125 teca_type_elevate_sym_case(unsigned long, unsigned long, unsigned int)
126 // elevate to int
127 teca_type_elevate_case(int, int, int)
128 teca_type_elevate_sym_case(int, int, char)
129 teca_type_elevate_sym_case(int, int, short)
130 teca_type_elevate_sym_case(int, int, unsigned char)
131 teca_type_elevate_sym_case(int, int, unsigned short)
132 teca_type_elevate_sym_case(int, int, unsigned int)
133 // elevate to unsigned int
134 teca_type_elevate_case(unsigned int, unsigned int, unsigned int)
135 teca_type_elevate_sym_case(int, unsigned int, char) // *
136 teca_type_elevate_sym_case(int, unsigned int, short) // *
137 teca_type_elevate_sym_case(unsigned int, unsigned int, unsigned char)
138 teca_type_elevate_sym_case(unsigned int, unsigned int, unsigned short)
139 // elevate to short
140 teca_type_elevate_case(short, short, short)
141 teca_type_elevate_sym_case(short, short, char)
142 teca_type_elevate_sym_case(short, short, unsigned char)
143 teca_type_elevate_sym_case(short, short, unsigned short)
144 // elevate to unsigned short
145 teca_type_elevate_case(unsigned short, unsigned short, unsigned short)
146 teca_type_elevate_sym_case(short, unsigned short, char) // *
147 teca_type_elevate_sym_case(unsigned short, unsigned short, unsigned char)
148 // elevate to char
149 teca_type_elevate_case(char, char, char)
150 teca_type_elevate_sym_case(char, char, unsigned char)
151 // elevate to unsigned char
152 teca_type_elevate_case(unsigned char, unsigned char, unsigned char)
153 
154 // decay from double precision
155 teca_type_decay_case(double, double, double)
156 teca_type_decay_sym_case(float, double, float)
157 teca_type_decay_sym_case(char, double, char)
158 teca_type_decay_sym_case(int, double, int)
159 teca_type_decay_sym_case(long, double, long)
160 teca_type_decay_sym_case(long long, double, long long)
161 teca_type_decay_sym_case(unsigned char, double, unsigned char)
162 teca_type_decay_sym_case(unsigned int, double, unsigned int)
163 teca_type_decay_sym_case(unsigned long, double, unsigned long)
164 teca_type_decay_sym_case(unsigned long long, double, unsigned long long)
165 // decay from single precision
166 teca_type_decay_case(float, float, float)
167 teca_type_decay_sym_case(char, float, char)
168 teca_type_decay_sym_case(int, float, int)
169 teca_type_decay_sym_case(long, float, long)
170 teca_type_decay_sym_case(long long, float, long long)
171 teca_type_decay_sym_case(unsigned char, float, unsigned char)
172 teca_type_decay_sym_case(unsigned int, float, unsigned int)
173 teca_type_decay_sym_case(unsigned long, float, unsigned long)
174 teca_type_decay_sym_case(unsigned long long, float, unsigned long long)
175 // decay from long long
176 teca_type_decay_case(long long, long long, long long)
177 teca_type_decay_sym_case(char, long long, char)
178 teca_type_decay_sym_case(int, long long, int)
179 teca_type_decay_sym_case(long, long long, long)
180 teca_type_decay_sym_case(unsigned char, long long, unsigned char)
181 teca_type_decay_sym_case(unsigned int, long long, unsigned int)
182 teca_type_decay_sym_case(unsigned long, long long, unsigned long)
183 teca_type_decay_sym_case(unsigned long long, long long, unsigned long long)
184 // decay from unsigned long long
185 teca_type_decay_case(unsigned long long, unsigned long long, unsigned long long)
186 teca_type_decay_sym_case(unsigned char, unsigned long long, char)
187 teca_type_decay_sym_case(unsigned int, unsigned long long, int)
188 teca_type_decay_sym_case(unsigned long, unsigned long long, long)
189 teca_type_decay_sym_case(unsigned char, unsigned long long, unsigned char)
190 teca_type_decay_sym_case(unsigned int, unsigned long long, unsigned int)
191 teca_type_decay_sym_case(unsigned long, unsigned long long, unsigned long)
192 // decay from long
193 teca_type_decay_case(long, long, long)
194 teca_type_decay_sym_case(char, long, char)
195 teca_type_decay_sym_case(int, long, int)
196 teca_type_decay_sym_case(unsigned char, long, unsigned char)
197 teca_type_decay_sym_case(unsigned int, long, unsigned int)
198 teca_type_decay_sym_case(unsigned long, long, unsigned long)
199 // decay from unsigned long
200 teca_type_decay_case(unsigned long, unsigned long, unsigned long)
201 teca_type_decay_sym_case(unsigned char, unsigned long, char)
202 teca_type_decay_sym_case(unsigned int, unsigned long, int)
203 teca_type_decay_sym_case(unsigned char, unsigned long, unsigned char)
204 teca_type_decay_sym_case(unsigned int, unsigned long, unsigned int)
205 // decay from int
206 teca_type_decay_case(int, int, int)
207 teca_type_decay_sym_case(char, int, char)
208 teca_type_decay_sym_case(unsigned char, int, unsigned char)
209 teca_type_decay_sym_case(unsigned int, int, unsigned int)
210 // decay from unsigned int
211 teca_type_decay_case(unsigned int, unsigned int, unsigned int)
212 teca_type_decay_sym_case(unsigned char, unsigned int, char)
213 teca_type_decay_sym_case(unsigned char, unsigned int, unsigned char)
214 // decay from char
215 teca_type_decay_case(char, char, char)
216 teca_type_decay_sym_case(unsigned char, char, unsigned char)
217 // decay from unsigned char
218 teca_type_decay_case(unsigned char, unsigned char, unsigned char)
219 };
220 
221 #endif
p_teca_error_handler error_handler TECA_EXPORT
The global error handler instance.
Select a type based on input type(s)
Definition: teca_type_select.h:10
Select the lower precision type.
Definition: teca_type_select.h:31
Select the higher precision type.
Definition: teca_type_select.h:20