comparison liboctave/MArray-decl.h @ 9557:3a1dd361f978

optimize .*=, ./= operators
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 24 Aug 2009 09:45:34 +0200
parents 1beb23d2b892
children b47ab50a6aa8
comparison
equal deleted inserted replaced
9556:948795dc1974 9557:3a1dd361f978
26 // A macro that can be used to declare and instantiate OP= operators. 26 // A macro that can be used to declare and instantiate OP= operators.
27 #define MARRAY_OP_ASSIGN_DECL(A_T, E_T, OP, PFX, API, LTGT, RHS_T) \ 27 #define MARRAY_OP_ASSIGN_DECL(A_T, E_T, OP, PFX, API, LTGT, RHS_T) \
28 PFX API A_T<E_T>& \ 28 PFX API A_T<E_T>& \
29 operator OP LTGT (A_T<E_T>&, const RHS_T&) 29 operator OP LTGT (A_T<E_T>&, const RHS_T&)
30 30
31 #define MARRAY_OP_ASSIGN_DECLX(A_T, E_T, OP, PFX, API, LTGT, RHS_T) \
32 PFX API A_T<E_T>& \
33 OP LTGT (A_T<E_T>&, const RHS_T&)
34
31 // All the OP= operators that we care about. 35 // All the OP= operators that we care about.
32 #define MARRAY_OP_ASSIGN_DECLS(A_T, E_T, PFX, API, LTGT, RHS_T) \ 36 #define MARRAY_OP_ASSIGN_DECLS(A_T, E_T, PFX, API, LTGT, RHS_T) \
33 MARRAY_OP_ASSIGN_DECL (A_T, E_T, +=, PFX, API, LTGT, RHS_T); \ 37 MARRAY_OP_ASSIGN_DECL (A_T, E_T, +=, PFX, API, LTGT, RHS_T); \
34 MARRAY_OP_ASSIGN_DECL (A_T, E_T, -=, PFX, API, LTGT, RHS_T); 38 MARRAY_OP_ASSIGN_DECL (A_T, E_T, -=, PFX, API, LTGT, RHS_T); \
39 MARRAY_OP_ASSIGN_DECLX (A_T, E_T, product_eq, PFX, API, LTGT, RHS_T); \
40 MARRAY_OP_ASSIGN_DECLX (A_T, E_T, quotient_eq, PFX, API, LTGT, RHS_T);
35 41
36 #define MARRAY_OP_ASSIGN_DECLS1(A_T, E_T, PFX, API, LTGT, RHS_T) \ 42 #define MARRAY_OP_ASSIGN_DECLS1(A_T, E_T, PFX, API, LTGT, RHS_T) \
37 MARRAY_OP_ASSIGN_DECL (A_T, E_T, +=, PFX, API, LTGT, RHS_T); \ 43 MARRAY_OP_ASSIGN_DECL (A_T, E_T, +=, PFX, API, LTGT, RHS_T); \
38 MARRAY_OP_ASSIGN_DECL (A_T, E_T, -=, PFX, API, LTGT, RHS_T); \ 44 MARRAY_OP_ASSIGN_DECL (A_T, E_T, -=, PFX, API, LTGT, RHS_T); \
39 MARRAY_OP_ASSIGN_DECL (A_T, E_T, *=, PFX, API, LTGT, RHS_T); \ 45 MARRAY_OP_ASSIGN_DECL (A_T, E_T, *=, PFX, API, LTGT, RHS_T); \
63 } 69 }
64 70
65 // All the OP= operators that we care about forwarding. 71 // All the OP= operators that we care about forwarding.
66 #define MARRAY_OP_ASSIGN_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ 72 #define MARRAY_OP_ASSIGN_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \
67 MARRAY_OP_ASSIGN_FWD_FCN (R, operator +=, T, C_X, X_T, C_Y, Y_T) \ 73 MARRAY_OP_ASSIGN_FWD_FCN (R, operator +=, T, C_X, X_T, C_Y, Y_T) \
68 MARRAY_OP_ASSIGN_FWD_FCN (R, operator -=, T, C_X, X_T, C_Y, Y_T) 74 MARRAY_OP_ASSIGN_FWD_FCN (R, operator -=, T, C_X, X_T, C_Y, Y_T) \
75 MARRAY_OP_ASSIGN_FWD_FCN (R, product_eq, T, C_X, X_T, C_Y, Y_T) \
76 MARRAY_OP_ASSIGN_FWD_FCN (R, quotient_eq, T, C_X, X_T, C_Y, Y_T)
69 77
70 #define MARRAY_OP_ASSIGN_FWD_DEFS1(R, T, C_X, X_T, C_Y, Y_T) \ 78 #define MARRAY_OP_ASSIGN_FWD_DEFS1(R, T, C_X, X_T, C_Y, Y_T) \
71 MARRAY_OP_ASSIGN_FWD_FCN (R, operator +=, T, C_X, X_T, C_Y, Y_T) \ 79 MARRAY_OP_ASSIGN_FWD_FCN (R, operator +=, T, C_X, X_T, C_Y, Y_T) \
72 MARRAY_OP_ASSIGN_FWD_FCN (R, operator -=, T, C_X, X_T, C_Y, Y_T) \ 80 MARRAY_OP_ASSIGN_FWD_FCN (R, operator -=, T, C_X, X_T, C_Y, Y_T) \
73 MARRAY_OP_ASSIGN_FWD_FCN (R, operator *=, T, C_X, X_T, C_Y, Y_T) \ 81 MARRAY_OP_ASSIGN_FWD_FCN (R, operator *=, T, C_X, X_T, C_Y, Y_T) \
207 215
208 #define MDIAGARRAY2_OPS_FORWARD_DECLS(A_T, API) \ 216 #define MDIAGARRAY2_OPS_FORWARD_DECLS(A_T, API) \
209 template <class T> \ 217 template <class T> \
210 class A_T; \ 218 class A_T; \
211 \ 219 \
212 MARRAY_OP_ASSIGN_FWD_DECLS (A_T, A_T<T>, API) \
213 MARRAY_UNOP_FWD_DECLS (A_T, API) \ 220 MARRAY_UNOP_FWD_DECLS (A_T, API) \
214 MDIAGARRAY2_BINOP_FWD_DECLS (A_T, API) 221 MDIAGARRAY2_BINOP_FWD_DECLS (A_T, API)
215 222
216 // Friend declarations for the MArray operators. 223 // Friend declarations for the MArray operators.
217 #define MARRAY_OPS_FRIEND_DECLS(A_T, API) \ 224 #define MARRAY_OPS_FRIEND_DECLS(A_T, API) \
226 MDIAGARRAY2_BINOP_FRIENDS (A_T, API) 233 MDIAGARRAY2_BINOP_FRIENDS (A_T, API)
227 234
228 // Define all the MArray forwarding functions for return type R and 235 // Define all the MArray forwarding functions for return type R and
229 // MArray element type T 236 // MArray element type T
230 #define MARRAY_FORWARD_DEFS(B, R, T) \ 237 #define MARRAY_FORWARD_DEFS(B, R, T) \
231 MARRAY_OP_ASSIGN_FWD_DEFS \ 238 MARRAY_OP_ASSIGN_FWD_DEFS1 \
232 (R, T, dynamic_cast<B<T>&>, R, , T) \ 239 (R, T, dynamic_cast<B<T>&>, R, , T) \
233 \ 240 \
234 MARRAY_OP_ASSIGN_FWD_DEFS \ 241 MARRAY_OP_ASSIGN_FWD_DEFS \
235 (R, T, \ 242 (R, T, \
236 dynamic_cast<B<T>&>, R, dynamic_cast<const B<T>&>, R) \ 243 dynamic_cast<B<T>&>, R, dynamic_cast<const B<T>&>, R) \
246 \ 253 \
247 MARRAY_AA_BINOP_FWD_DEFS \ 254 MARRAY_AA_BINOP_FWD_DEFS \
248 (R, T, dynamic_cast<const B<T>&>, R, dynamic_cast<const B<T>&>, R) 255 (R, T, dynamic_cast<const B<T>&>, R, dynamic_cast<const B<T>&>, R)
249 256
250 #define MDIAGARRAY2_FORWARD_DEFS(B, R, T) \ 257 #define MDIAGARRAY2_FORWARD_DEFS(B, R, T) \
251 MARRAY_OP_ASSIGN_FWD_DEFS \
252 (R, T, \
253 dynamic_cast<B<T>&>, R, dynamic_cast<const B<T>&>, R) \
254 \
255 MARRAY_UNOP_FWD_DEFS \ 258 MARRAY_UNOP_FWD_DEFS \
256 (R, T, dynamic_cast<const B<T>&>, R) \ 259 (R, T, dynamic_cast<const B<T>&>, R) \
257 \ 260 \
258 MDIAGARRAY2_DAS_BINOP_FWD_DEFS \ 261 MDIAGARRAY2_DAS_BINOP_FWD_DEFS \
259 (R, T, dynamic_cast<const B<T>&>, R, , T) \ 262 (R, T, dynamic_cast<const B<T>&>, R, , T) \