1988
|
1 // Nothing like a little CPP abuse to brighten everyone's day. Would |
|
2 // have been nice to do this with template functions but as of 2.5.x, |
|
3 // g++ seems to fail to resolve them properly. |
|
4 |
3504
|
5 #define DO_VS_OP(r, l, v, OP, s) \ |
1988
|
6 if (l > 0) \ |
|
7 { \ |
|
8 for (int i = 0; i < l; i++) \ |
3504
|
9 r[i] = v[i] OP s; \ |
1988
|
10 } |
|
11 |
3504
|
12 #define DO_SV_OP(r, l, s, OP, v) \ |
1988
|
13 if (l > 0) \ |
|
14 { \ |
|
15 for (int i = 0; i < l; i++) \ |
3504
|
16 r[i] = s OP v[i]; \ |
1988
|
17 } |
|
18 |
3504
|
19 #define DO_VV_OP(r, l, x, OP, y) \ |
1988
|
20 if (l > 0) \ |
|
21 { \ |
|
22 for (int i = 0; i < l; i++) \ |
3504
|
23 r[i] = x[i] OP y[i]; \ |
1988
|
24 } |
|
25 |
3504
|
26 #define NEG_V(r, l, x) \ |
1988
|
27 if (l > 0) \ |
|
28 { \ |
|
29 for (int i = 0; i < l; i++) \ |
3504
|
30 r[i] = -x[i]; \ |
1988
|
31 } |
|
32 |
|
33 #define DO_VS_OP2(OP) \ |
|
34 int l = a.length (); \ |
|
35 if (l > 0) \ |
|
36 { \ |
|
37 T *tmp = a.fortran_vec (); \ |
|
38 for (int i = 0; i < l; i++) \ |
|
39 tmp[i] OP s; \ |
|
40 } |
|
41 |
|
42 #define DO_VV_OP2(OP) \ |
|
43 do \ |
|
44 { \ |
|
45 T *a_tmp = a.fortran_vec (); \ |
|
46 const T *b_tmp = b.data (); \ |
|
47 for (int i = 0; i < l; i++) \ |
3243
|
48 a_tmp[i] OP b_tmp[i]; \ |
1988
|
49 } \ |
|
50 while (0) |
|
51 |
3573
|
52 // A macro that can be used to declare and instantiate OP= operators. |
|
53 #define MARRAY_OP_ASSIGN_DECL(A_T, E_T, OP, PFX, LTGT, RHS_T) \ |
|
54 PFX A_T<E_T>& \ |
|
55 operator OP LTGT (A_T<E_T>&, const RHS_T&) |
|
56 |
|
57 // All the OP= operators that we care about. |
|
58 #define MARRAY_OP_ASSIGN_DECLS(A_T, E_T, PFX, LTGT, RHS_T) \ |
|
59 MARRAY_OP_ASSIGN_DECL (A_T, E_T, +=, PFX, LTGT, RHS_T); \ |
|
60 MARRAY_OP_ASSIGN_DECL (A_T, E_T, -=, PFX, LTGT, RHS_T); |
|
61 |
|
62 // Generate forward declarations for OP= operators. |
3580
|
63 #define MARRAY_OP_ASSIGN_FWD_DECLS(A_T, RHS_T) \ |
|
64 MARRAY_OP_ASSIGN_DECLS (A_T, T, template <typename T>, , RHS_T) |
3573
|
65 |
|
66 // Generate friend declarations for the OP= operators. |
3580
|
67 #define MARRAY_OP_ASSIGN_FRIENDS(A_T, RHS_T) \ |
|
68 MARRAY_OP_ASSIGN_DECLS (A_T, T, friend, <>, RHS_T) |
3573
|
69 |
|
70 // Instantiate the OP= operators. |
3580
|
71 #define MARRAY_OP_ASSIGN_DEFS(A_T, E_T, RHS_T) \ |
|
72 MARRAY_OP_ASSIGN_DECLS (A_T, E_T, template, , RHS_T) |
3573
|
73 |
|
74 // A function that can be used to forward OP= operations from derived |
|
75 // classes back to us. |
|
76 #define MARRAY_OP_ASSIGN_FWD_FCN(R, F, T, C_X, X_T, C_Y, Y_T) \ |
|
77 inline R \ |
|
78 F (X_T& x, const Y_T& y) \ |
|
79 { \ |
|
80 return R (F (C_X (x), C_Y (y))); \ |
|
81 } |
|
82 |
|
83 // All the OP= operators that we care about forwarding. |
|
84 #define MARRAY_OP_ASSIGN_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ |
|
85 MARRAY_OP_ASSIGN_FWD_FCN (R, operator +=, T, C_X, X_T, C_Y, Y_T) \ |
|
86 MARRAY_OP_ASSIGN_FWD_FCN (R, operator -=, T, C_X, X_T, C_Y, Y_T) |
|
87 |
|
88 // A macro that can be used to declare and instantiate unary operators. |
|
89 #define MARRAY_UNOP(A_T, E_T, F, PFX, LTGT) \ |
|
90 PFX A_T<E_T> \ |
|
91 F LTGT (const A_T<E_T>&) |
|
92 |
|
93 // All the unary operators that we care about. |
|
94 #define MARRAY_UNOP_DECLS(A_T, E_T, PFX, LTGT) \ |
|
95 MARRAY_UNOP (A_T, E_T, operator +, PFX, LTGT); \ |
|
96 MARRAY_UNOP (A_T, E_T, operator -, PFX, LTGT); |
|
97 |
|
98 // Generate forward declarations for unary operators. |
|
99 #define MARRAY_UNOP_FWD_DECLS(A_T) \ |
|
100 MARRAY_UNOP_DECLS (A_T, T, template <typename T>, ) |
|
101 |
|
102 // Generate friend declarations for the unary operators. |
|
103 #define MARRAY_UNOP_FRIENDS(A_T) \ |
|
104 MARRAY_UNOP_DECLS (A_T, T, friend, <>) |
|
105 |
|
106 // Instantiate the unary operators. |
|
107 #define MARRAY_UNOP_DEFS(A_T, E_T) \ |
|
108 MARRAY_UNOP_DECLS (A_T, E_T, template, ) |
|
109 |
|
110 // A function that can be used to forward unary operations from derived |
|
111 // classes back to us. |
|
112 #define MARRAY_UNOP_FWD_FCN(R, F, T, C_X, X_T) \ |
|
113 inline R \ |
|
114 F (const X_T& x) \ |
|
115 { \ |
|
116 return R (F (C_X (x))); \ |
|
117 } |
|
118 |
|
119 // All the unary operators that we care about forwarding. |
|
120 #define MARRAY_UNOP_FWD_DEFS(R, T, C_X, X_T) \ |
|
121 MARRAY_UNOP_FWD_FCN (R, operator +, T, C_X, X_T) \ |
|
122 MARRAY_UNOP_FWD_FCN (R, operator -, T, C_X, X_T) |
|
123 |
|
124 // A macro that can be used to declare and instantiate binary operators. |
|
125 #define MARRAY_BINOP_DECL(A_T, E_T, F, PFX, LTGT, X_T, Y_T) \ |
|
126 PFX A_T<E_T> \ |
|
127 F LTGT (const X_T&, const Y_T&) |
|
128 |
|
129 // All the binary operators that we care about. We have two |
|
130 // sets of macros since the MArray OP MArray operations use functions |
|
131 // (product and quotient) instead of operators (*, /). |
|
132 #define MARRAY_BINOP_DECLS(A_T, E_T, PFX, LTGT, X_T, Y_T) \ |
|
133 MARRAY_BINOP_DECL (A_T, E_T, operator +, PFX, LTGT, X_T, Y_T); \ |
|
134 MARRAY_BINOP_DECL (A_T, E_T, operator -, PFX, LTGT, X_T, Y_T); \ |
|
135 MARRAY_BINOP_DECL (A_T, E_T, operator *, PFX, LTGT, X_T, Y_T); \ |
|
136 MARRAY_BINOP_DECL (A_T, E_T, operator /, PFX, LTGT, X_T, Y_T); |
|
137 |
|
138 #define MARRAY_AA_BINOP_DECLS(A_T, E_T, PFX, LTGT) \ |
|
139 MARRAY_BINOP_DECL (A_T, E_T, operator +, PFX, LTGT, A_T<E_T>, A_T<E_T>); \ |
|
140 MARRAY_BINOP_DECL (A_T, E_T, operator -, PFX, LTGT, A_T<E_T>, A_T<E_T>); \ |
|
141 MARRAY_BINOP_DECL (A_T, E_T, quotient, PFX, LTGT, A_T<E_T>, A_T<E_T>); \ |
|
142 MARRAY_BINOP_DECL (A_T, E_T, product, PFX, LTGT, A_T<E_T>, A_T<E_T>); |
|
143 |
3580
|
144 #define MDIAGARRAY2_DAS_BINOP_DECLS(A_T, E_T, PFX, LTGT, X_T, Y_T) \ |
|
145 MARRAY_BINOP_DECL (A_T, E_T, operator *, PFX, LTGT, X_T, Y_T); \ |
|
146 MARRAY_BINOP_DECL (A_T, E_T, operator /, PFX, LTGT, X_T, Y_T); |
|
147 |
|
148 #define MDIAGARRAY2_SDA_BINOP_DECLS(A_T, E_T, PFX, LTGT, X_T, Y_T) \ |
|
149 MARRAY_BINOP_DECL (A_T, E_T, operator *, PFX, LTGT, X_T, Y_T); |
|
150 |
|
151 #define MDIAGARRAY2_DADA_BINOP_DECLS(A_T, E_T, PFX, LTGT) \ |
|
152 MARRAY_BINOP_DECL (A_T, E_T, operator +, PFX, LTGT, A_T<E_T>, A_T<E_T>); \ |
|
153 MARRAY_BINOP_DECL (A_T, E_T, operator -, PFX, LTGT, A_T<E_T>, A_T<E_T>); \ |
|
154 MARRAY_BINOP_DECL (A_T, E_T, product, PFX, LTGT, A_T<E_T>, A_T<E_T>); |
|
155 |
3573
|
156 // Generate forward declarations for binary operators. |
|
157 #define MARRAY_BINOP_FWD_DECLS(A_T) \ |
|
158 MARRAY_BINOP_DECLS (A_T, T, template <typename T>, , A_T<T>, T) \ |
|
159 MARRAY_BINOP_DECLS (A_T, T, template <typename T>, , T, A_T<T>) \ |
|
160 MARRAY_AA_BINOP_DECLS (A_T, T, template <typename T>, ) |
|
161 |
3580
|
162 #define MDIAGARRAY2_BINOP_FWD_DECLS(A_T) \ |
|
163 MDIAGARRAY2_DAS_BINOP_DECLS (A_T, T, template <typename T>, , A_T<T>, T) \ |
|
164 MDIAGARRAY2_SDA_BINOP_DECLS (A_T, T, template <typename T>, , T, A_T<T>) \ |
|
165 MDIAGARRAY2_DADA_BINOP_DECLS (A_T, T, template <typename T>, ) |
|
166 |
3573
|
167 // Generate friend declarations for the binary operators. |
|
168 #define MARRAY_BINOP_FRIENDS(A_T) \ |
|
169 MARRAY_BINOP_DECLS (A_T, T, friend, <>, A_T<T>, T) \ |
|
170 MARRAY_BINOP_DECLS (A_T, T, friend, <>, T, A_T<T>) \ |
|
171 MARRAY_AA_BINOP_DECLS (A_T, T, friend, <>) |
|
172 |
3580
|
173 #define MDIAGARRAY2_BINOP_FRIENDS(A_T) \ |
|
174 MDIAGARRAY2_DAS_BINOP_DECLS (A_T, T, friend, <>, A_T<T>, T) \ |
|
175 MDIAGARRAY2_SDA_BINOP_DECLS (A_T, T, friend, <>, T, A_T<T>) \ |
|
176 MDIAGARRAY2_DADA_BINOP_DECLS (A_T, T, friend, <>) |
|
177 |
3573
|
178 // Instantiate the binary operators. |
|
179 #define MARRAY_BINOP_DEFS(A_T, E_T) \ |
|
180 MARRAY_BINOP_DECLS (A_T, E_T, template, , A_T<E_T>, E_T) \ |
|
181 MARRAY_BINOP_DECLS (A_T, E_T, template, , E_T, A_T<E_T>) \ |
|
182 MARRAY_AA_BINOP_DECLS (A_T, E_T, template, ) |
|
183 |
3580
|
184 #define MDIAGARRAY2_BINOP_DEFS(A_T, E_T) \ |
|
185 MDIAGARRAY2_DAS_BINOP_DECLS (A_T, E_T, template, , A_T<E_T>, E_T) \ |
|
186 MDIAGARRAY2_SDA_BINOP_DECLS (A_T, E_T, template, , E_T, A_T<E_T>) \ |
|
187 MDIAGARRAY2_DADA_BINOP_DECLS (A_T, E_T, template, ) |
|
188 |
3573
|
189 // A function that can be used to forward binary operations from derived |
|
190 // classes back to us. |
|
191 #define MARRAY_BINOP_FWD_FCN(R, F, T, C_X, X_T, C_Y, Y_T) \ |
|
192 inline R \ |
|
193 F (const X_T& x, const Y_T& y) \ |
|
194 { \ |
|
195 return R (F (C_X (x), C_Y (y))); \ |
|
196 } |
|
197 |
|
198 // The binary operators that we care about forwarding. We have two |
|
199 // sets of macros since the MArray OP MArray operations use functions |
|
200 // (product and quotient) instead of operators (*, /). |
|
201 #define MARRAY_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ |
|
202 MARRAY_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \ |
|
203 MARRAY_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \ |
|
204 MARRAY_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T) \ |
|
205 MARRAY_BINOP_FWD_FCN (R, operator /, T, C_X, X_T, C_Y, Y_T) |
|
206 |
|
207 #define MARRAY_AA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ |
|
208 MARRAY_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \ |
|
209 MARRAY_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \ |
|
210 MARRAY_BINOP_FWD_FCN (R, product, T, C_X, X_T, C_Y, Y_T) \ |
|
211 MARRAY_BINOP_FWD_FCN (R, quotient, T, C_X, X_T, C_Y, Y_T) |
|
212 |
3580
|
213 #define MDIAGARRAY2_DAS_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ |
|
214 MARRAY_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T) \ |
|
215 MARRAY_BINOP_FWD_FCN (R, operator /, T, C_X, X_T, C_Y, Y_T) |
|
216 |
|
217 #define MDIAGARRAY2_SDA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ |
|
218 MARRAY_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T) |
|
219 |
|
220 #define MDIAGARRAY2_DADA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ |
|
221 MARRAY_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \ |
|
222 MARRAY_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \ |
|
223 MARRAY_BINOP_FWD_FCN (R, product, T, C_X, X_T, C_Y, Y_T) |
|
224 |
3573
|
225 // Forward declarations for the MArray operators. |
|
226 #define MARRAY_OPS_FORWARD_DECLS(A_T) \ |
|
227 template <class T> \ |
|
228 class A_T; \ |
|
229 \ |
3580
|
230 MARRAY_OP_ASSIGN_FWD_DECLS (A_T, T) \ |
|
231 MARRAY_OP_ASSIGN_FWD_DECLS (A_T, A_T<T>) \ |
3573
|
232 MARRAY_UNOP_FWD_DECLS (A_T) \ |
|
233 MARRAY_BINOP_FWD_DECLS (A_T) |
|
234 |
3580
|
235 #define MDIAGARRAY2_OPS_FORWARD_DECLS(A_T) \ |
|
236 template <class T> \ |
|
237 class A_T; \ |
|
238 \ |
|
239 MARRAY_OP_ASSIGN_FWD_DECLS (A_T, A_T<T>) \ |
|
240 MARRAY_UNOP_FWD_DECLS (A_T) \ |
|
241 MDIAGARRAY2_BINOP_FWD_DECLS (A_T) |
|
242 |
3573
|
243 // Friend declarations for the MArray operators. |
|
244 #define MARRAY_OPS_FRIEND_DECLS(A_T) \ |
3580
|
245 MARRAY_OP_ASSIGN_FRIENDS (A_T, T) \ |
|
246 MARRAY_OP_ASSIGN_FRIENDS (A_T, A_T<T>) \ |
3573
|
247 MARRAY_UNOP_FRIENDS (A_T) \ |
|
248 MARRAY_BINOP_FRIENDS (A_T) |
|
249 |
3580
|
250 #define MDIAGARRAY2_OPS_FRIEND_DECLS(A_T) \ |
|
251 MARRAY_OP_ASSIGN_FRIENDS (A_T, A_T<T>) \ |
|
252 MARRAY_UNOP_FRIENDS (A_T) \ |
|
253 MDIAGARRAY2_BINOP_FRIENDS (A_T) |
|
254 |
3573
|
255 // The following macros are for external use. |
|
256 |
|
257 // Instantiate all the MArray friends for MArray element type T. |
|
258 #define INSTANTIATE_MARRAY_FRIENDS(T) \ |
3581
|
259 MARRAY_OP_ASSIGN_DEFS (MArray, T, T) \ |
|
260 MARRAY_OP_ASSIGN_DEFS (MArray, T, MArray<T>) \ |
3573
|
261 MARRAY_UNOP_DEFS (MArray, T) \ |
|
262 MARRAY_BINOP_DEFS (MArray, T) |
|
263 |
|
264 // Instantiate all the MArray friends for MArray element type T. |
|
265 #define INSTANTIATE_MARRAY2_FRIENDS(T) \ |
3580
|
266 MARRAY_OP_ASSIGN_DEFS (MArray2, T, T) \ |
|
267 MARRAY_OP_ASSIGN_DEFS (MArray2, T, MArray2<T>) \ |
3573
|
268 MARRAY_UNOP_DEFS (MArray2, T) \ |
|
269 MARRAY_BINOP_DEFS (MArray2, T) |
|
270 |
3580
|
271 // Instantiate all the MArray friends for MArray element type T. |
|
272 #define INSTANTIATE_MDIAGARRAY2_FRIENDS(T) \ |
3581
|
273 MARRAY_OP_ASSIGN_DEFS (MDiagArray2, T, MDiagArray2<T>) \ |
|
274 MARRAY_UNOP_DEFS (MDiagArray2, T) \ |
|
275 MDIAGARRAY2_BINOP_DEFS (MDiagArray2, T) |
3580
|
276 |
3573
|
277 // Define all the MArray forwarding functions for return type R and |
|
278 // MArray element type T |
|
279 #define MARRAY_FORWARD_DEFS(B, R, T) \ |
|
280 MARRAY_OP_ASSIGN_FWD_DEFS \ |
|
281 (R, T, dynamic_cast<B<T>&>, R, , T) \ |
|
282 \ |
|
283 MARRAY_OP_ASSIGN_FWD_DEFS \ |
|
284 (R, T, \ |
|
285 dynamic_cast<B<T>&>, R, dynamic_cast<const B<T>&>, R) \ |
|
286 \ |
|
287 MARRAY_UNOP_FWD_DEFS \ |
|
288 (R, T, dynamic_cast<const B<T>&>, R) \ |
|
289 \ |
|
290 MARRAY_BINOP_FWD_DEFS \ |
|
291 (R, T, dynamic_cast<const B<T>&>, R, , T) \ |
|
292 \ |
|
293 MARRAY_BINOP_FWD_DEFS \ |
|
294 (R, T, , T, dynamic_cast<const B<T>&>, R) \ |
|
295 \ |
|
296 MARRAY_AA_BINOP_FWD_DEFS \ |
|
297 (R, T, dynamic_cast<const B<T>&>, R, dynamic_cast<const B<T>&>, R) |
|
298 |
3580
|
299 #define MDIAGARRAY2_FORWARD_DEFS(B, R, T) \ |
|
300 MARRAY_OP_ASSIGN_FWD_DEFS \ |
|
301 (R, T, \ |
|
302 dynamic_cast<B<T>&>, R, dynamic_cast<const B<T>&>, R) \ |
|
303 \ |
|
304 MARRAY_UNOP_FWD_DEFS \ |
|
305 (R, T, dynamic_cast<const B<T>&>, R) \ |
|
306 \ |
|
307 MDIAGARRAY2_DAS_BINOP_FWD_DEFS \ |
|
308 (R, T, dynamic_cast<const B<T>&>, R, , T) \ |
|
309 \ |
|
310 MDIAGARRAY2_SDA_BINOP_FWD_DEFS \ |
|
311 (R, T, , T, dynamic_cast<const B<T>&>, R) \ |
|
312 \ |
|
313 MDIAGARRAY2_DADA_BINOP_FWD_DEFS \ |
|
314 (R, T, dynamic_cast<const B<T>&>, R, dynamic_cast<const B<T>&>, R) |
|
315 |
3573
|
316 // Now we have all the definitions we need. |
|
317 |