00001 #if !defined (octave_MArray_defs_h)
00002 #define octave_MArray_defs_h 1
00003
00004
00005
00006 #define DO_VS_OP(r, l, v, OP, s) \
00007 if (l > 0) \
00008 { \
00009 for (int i = 0; i < l; i++) \
00010 r[i] = v[i] OP s; \
00011 }
00012
00013 #define DO_SV_OP(r, l, s, OP, v) \
00014 if (l > 0) \
00015 { \
00016 for (int i = 0; i < l; i++) \
00017 r[i] = s OP v[i]; \
00018 }
00019
00020 #define DO_VV_OP(r, l, x, OP, y) \
00021 if (l > 0) \
00022 { \
00023 for (int i = 0; i < l; i++) \
00024 r[i] = x[i] OP y[i]; \
00025 }
00026
00027 #define NEG_V(r, l, x) \
00028 if (l > 0) \
00029 { \
00030 for (int i = 0; i < l; i++) \
00031 r[i] = -x[i]; \
00032 }
00033
00034 #define DO_VS_OP2(T, a, OP, s) \
00035 int l = a.length (); \
00036 if (l > 0) \
00037 { \
00038 T *tmp = a.fortran_vec (); \
00039 for (int i = 0; i < l; i++) \
00040 tmp[i] OP s; \
00041 }
00042
00043 #define DO_VV_OP2(T, a, OP, b) \
00044 do \
00045 { \
00046 T *a_tmp = a.fortran_vec (); \
00047 const T *b_tmp = b.data (); \
00048 for (int i = 0; i < l; i++) \
00049 a_tmp[i] OP b_tmp[i]; \
00050 } \
00051 while (0)
00052
00053
00054 #define MARRAY_OP_ASSIGN_DECL(A_T, E_T, OP, PFX, LTGT, RHS_T) \
00055 PFX A_T<E_T>& \
00056 operator OP LTGT (A_T<E_T>&, const RHS_T&)
00057
00058
00059 #define MARRAY_OP_ASSIGN_DECLS(A_T, E_T, PFX, LTGT, RHS_T) \
00060 MARRAY_OP_ASSIGN_DECL (A_T, E_T, +=, PFX, LTGT, RHS_T); \
00061 MARRAY_OP_ASSIGN_DECL (A_T, E_T, -=, PFX, LTGT, RHS_T);
00062
00063
00064 #define MARRAY_OP_ASSIGN_FWD_DECLS(A_T, RHS_T) \
00065 MARRAY_OP_ASSIGN_DECLS (A_T, T, template <typename T>, , RHS_T)
00066
00067
00068 #define MARRAY_OP_ASSIGN_FRIENDS(A_T, RHS_T) \
00069 MARRAY_OP_ASSIGN_DECLS (A_T, T, friend, <>, RHS_T)
00070
00071
00072 #define MARRAY_OP_ASSIGN_DEFS(A_T, E_T, RHS_T) \
00073 MARRAY_OP_ASSIGN_DECLS (A_T, E_T, template, , RHS_T)
00074
00075
00076
00077 #define MARRAY_OP_ASSIGN_FWD_FCN(R, F, T, C_X, X_T, C_Y, Y_T) \
00078 inline R \
00079 F (X_T& x, const Y_T& y) \
00080 { \
00081 return R (F (C_X (x), C_Y (y))); \
00082 }
00083
00084
00085 #define MARRAY_OP_ASSIGN_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \
00086 MARRAY_OP_ASSIGN_FWD_FCN (R, operator +=, T, C_X, X_T, C_Y, Y_T) \
00087 MARRAY_OP_ASSIGN_FWD_FCN (R, operator -=, T, C_X, X_T, C_Y, Y_T)
00088
00089
00090 #define MARRAY_UNOP(A_T, E_T, F, PFX, LTGT) \
00091 PFX A_T<E_T> \
00092 F LTGT (const A_T<E_T>&)
00093
00094
00095 #define MARRAY_UNOP_DECLS(A_T, E_T, PFX, LTGT) \
00096 MARRAY_UNOP (A_T, E_T, operator +, PFX, LTGT); \
00097 MARRAY_UNOP (A_T, E_T, operator -, PFX, LTGT);
00098
00099
00100 #define MARRAY_UNOP_FWD_DECLS(A_T) \
00101 MARRAY_UNOP_DECLS (A_T, T, template <typename T>, )
00102
00103
00104 #define MARRAY_UNOP_FRIENDS(A_T) \
00105 MARRAY_UNOP_DECLS (A_T, T, friend, <>)
00106
00107
00108 #define MARRAY_UNOP_DEFS(A_T, E_T) \
00109 MARRAY_UNOP_DECLS (A_T, E_T, template, )
00110
00111
00112
00113 #define MARRAY_UNOP_FWD_FCN(R, F, T, C_X, X_T) \
00114 inline R \
00115 F (const X_T& x) \
00116 { \
00117 return R (F (C_X (x))); \
00118 }
00119
00120
00121 #define MARRAY_UNOP_FWD_DEFS(R, T, C_X, X_T) \
00122 MARRAY_UNOP_FWD_FCN (R, operator +, T, C_X, X_T) \
00123 MARRAY_UNOP_FWD_FCN (R, operator -, T, C_X, X_T)
00124
00125
00126 #define MARRAY_BINOP_DECL(A_T, E_T, F, PFX, LTGT, X_T, Y_T) \
00127 PFX A_T<E_T> \
00128 F LTGT (const X_T&, const Y_T&)
00129
00130
00131
00132
00133 #define MARRAY_BINOP_DECLS(A_T, E_T, PFX, LTGT, X_T, Y_T) \
00134 MARRAY_BINOP_DECL (A_T, E_T, operator +, PFX, LTGT, X_T, Y_T); \
00135 MARRAY_BINOP_DECL (A_T, E_T, operator -, PFX, LTGT, X_T, Y_T); \
00136 MARRAY_BINOP_DECL (A_T, E_T, operator *, PFX, LTGT, X_T, Y_T); \
00137 MARRAY_BINOP_DECL (A_T, E_T, operator /, PFX, LTGT, X_T, Y_T);
00138
00139 #define MARRAY_AA_BINOP_DECLS(A_T, E_T, PFX, LTGT) \
00140 MARRAY_BINOP_DECL (A_T, E_T, operator +, PFX, LTGT, A_T<E_T>, A_T<E_T>); \
00141 MARRAY_BINOP_DECL (A_T, E_T, operator -, PFX, LTGT, A_T<E_T>, A_T<E_T>); \
00142 MARRAY_BINOP_DECL (A_T, E_T, quotient, PFX, LTGT, A_T<E_T>, A_T<E_T>); \
00143 MARRAY_BINOP_DECL (A_T, E_T, product, PFX, LTGT, A_T<E_T>, A_T<E_T>);
00144
00145 #define MDIAGARRAY2_DAS_BINOP_DECLS(A_T, E_T, PFX, LTGT, X_T, Y_T) \
00146 MARRAY_BINOP_DECL (A_T, E_T, operator *, PFX, LTGT, X_T, Y_T); \
00147 MARRAY_BINOP_DECL (A_T, E_T, operator /, PFX, LTGT, X_T, Y_T);
00148
00149 #define MDIAGARRAY2_SDA_BINOP_DECLS(A_T, E_T, PFX, LTGT, X_T, Y_T) \
00150 MARRAY_BINOP_DECL (A_T, E_T, operator *, PFX, LTGT, X_T, Y_T);
00151
00152 #define MDIAGARRAY2_DADA_BINOP_DECLS(A_T, E_T, PFX, LTGT) \
00153 MARRAY_BINOP_DECL (A_T, E_T, operator +, PFX, LTGT, A_T<E_T>, A_T<E_T>); \
00154 MARRAY_BINOP_DECL (A_T, E_T, operator -, PFX, LTGT, A_T<E_T>, A_T<E_T>); \
00155 MARRAY_BINOP_DECL (A_T, E_T, product, PFX, LTGT, A_T<E_T>, A_T<E_T>);
00156
00157
00158 #define MARRAY_BINOP_FWD_DECLS(A_T) \
00159 MARRAY_BINOP_DECLS (A_T, T, template <typename T>, , A_T<T>, T) \
00160 MARRAY_BINOP_DECLS (A_T, T, template <typename T>, , T, A_T<T>) \
00161 MARRAY_AA_BINOP_DECLS (A_T, T, template <typename T>, )
00162
00163 #define MDIAGARRAY2_BINOP_FWD_DECLS(A_T) \
00164 MDIAGARRAY2_DAS_BINOP_DECLS (A_T, T, template <typename T>, , A_T<T>, T) \
00165 MDIAGARRAY2_SDA_BINOP_DECLS (A_T, T, template <typename T>, , T, A_T<T>) \
00166 MDIAGARRAY2_DADA_BINOP_DECLS (A_T, T, template <typename T>, )
00167
00168
00169 #define MARRAY_BINOP_FRIENDS(A_T) \
00170 MARRAY_BINOP_DECLS (A_T, T, friend, <>, A_T<T>, T) \
00171 MARRAY_BINOP_DECLS (A_T, T, friend, <>, T, A_T<T>) \
00172 MARRAY_AA_BINOP_DECLS (A_T, T, friend, <>)
00173
00174 #define MDIAGARRAY2_BINOP_FRIENDS(A_T) \
00175 MDIAGARRAY2_DAS_BINOP_DECLS (A_T, T, friend, <>, A_T<T>, T) \
00176 MDIAGARRAY2_SDA_BINOP_DECLS (A_T, T, friend, <>, T, A_T<T>) \
00177 MDIAGARRAY2_DADA_BINOP_DECLS (A_T, T, friend, <>)
00178
00179
00180 #define MARRAY_BINOP_DEFS(A_T, E_T) \
00181 MARRAY_BINOP_DECLS (A_T, E_T, template, , A_T<E_T>, E_T) \
00182 MARRAY_BINOP_DECLS (A_T, E_T, template, , E_T, A_T<E_T>) \
00183 MARRAY_AA_BINOP_DECLS (A_T, E_T, template, )
00184
00185 #define MDIAGARRAY2_BINOP_DEFS(A_T, E_T) \
00186 MDIAGARRAY2_DAS_BINOP_DECLS (A_T, E_T, template, , A_T<E_T>, E_T) \
00187 MDIAGARRAY2_SDA_BINOP_DECLS (A_T, E_T, template, , E_T, A_T<E_T>) \
00188 MDIAGARRAY2_DADA_BINOP_DECLS (A_T, E_T, template, )
00189
00190
00191
00192 #define MARRAY_BINOP_FWD_FCN(R, F, T, C_X, X_T, C_Y, Y_T) \
00193 inline R \
00194 F (const X_T& x, const Y_T& y) \
00195 { \
00196 return R (F (C_X (x), C_Y (y))); \
00197 }
00198
00199
00200
00201
00202 #define MARRAY_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \
00203 MARRAY_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \
00204 MARRAY_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \
00205 MARRAY_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T) \
00206 MARRAY_BINOP_FWD_FCN (R, operator /, T, C_X, X_T, C_Y, Y_T)
00207
00208 #define MARRAY_AA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \
00209 MARRAY_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \
00210 MARRAY_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \
00211 MARRAY_BINOP_FWD_FCN (R, product, T, C_X, X_T, C_Y, Y_T) \
00212 MARRAY_BINOP_FWD_FCN (R, quotient, T, C_X, X_T, C_Y, Y_T)
00213
00214 #define MDIAGARRAY2_DAS_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \
00215 MARRAY_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T) \
00216 MARRAY_BINOP_FWD_FCN (R, operator /, T, C_X, X_T, C_Y, Y_T)
00217
00218 #define MDIAGARRAY2_SDA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \
00219 MARRAY_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T)
00220
00221 #define MDIAGARRAY2_DADA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \
00222 MARRAY_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \
00223 MARRAY_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \
00224 MARRAY_BINOP_FWD_FCN (R, product, T, C_X, X_T, C_Y, Y_T)
00225
00226
00227 #define MARRAY_OPS_FORWARD_DECLS(A_T) \
00228 template <class T> \
00229 class A_T; \
00230 \
00231 MARRAY_OP_ASSIGN_FWD_DECLS (A_T, T) \
00232 MARRAY_OP_ASSIGN_FWD_DECLS (A_T, A_T<T>) \
00233 MARRAY_UNOP_FWD_DECLS (A_T) \
00234 MARRAY_BINOP_FWD_DECLS (A_T)
00235
00236 #define MDIAGARRAY2_OPS_FORWARD_DECLS(A_T) \
00237 template <class T> \
00238 class A_T; \
00239 \
00240 MARRAY_OP_ASSIGN_FWD_DECLS (A_T, A_T<T>) \
00241 MARRAY_UNOP_FWD_DECLS (A_T) \
00242 MDIAGARRAY2_BINOP_FWD_DECLS (A_T)
00243
00244
00245 #define MARRAY_OPS_FRIEND_DECLS(A_T) \
00246 MARRAY_OP_ASSIGN_FRIENDS (A_T, T) \
00247 MARRAY_OP_ASSIGN_FRIENDS (A_T, A_T<T>) \
00248 MARRAY_UNOP_FRIENDS (A_T) \
00249 MARRAY_BINOP_FRIENDS (A_T)
00250
00251 #define MDIAGARRAY2_OPS_FRIEND_DECLS(A_T) \
00252 MARRAY_OP_ASSIGN_FRIENDS (A_T, A_T<T>) \
00253 MARRAY_UNOP_FRIENDS (A_T) \
00254 MDIAGARRAY2_BINOP_FRIENDS (A_T)
00255
00256
00257
00258
00259 #define INSTANTIATE_MARRAY_FRIENDS(T) \
00260 MARRAY_OP_ASSIGN_DEFS (MArray, T, T) \
00261 MARRAY_OP_ASSIGN_DEFS (MArray, T, MArray<T>) \
00262 MARRAY_UNOP_DEFS (MArray, T) \
00263 MARRAY_BINOP_DEFS (MArray, T)
00264
00265
00266 #define INSTANTIATE_MARRAY2_FRIENDS(T) \
00267 MARRAY_OP_ASSIGN_DEFS (MArray2, T, T) \
00268 MARRAY_OP_ASSIGN_DEFS (MArray2, T, MArray2<T>) \
00269 MARRAY_UNOP_DEFS (MArray2, T) \
00270 MARRAY_BINOP_DEFS (MArray2, T)
00271
00272
00273 #define INSTANTIATE_MARRAYN_FRIENDS(T) \
00274 MARRAY_OP_ASSIGN_DEFS (MArrayN, T, T) \
00275 MARRAY_OP_ASSIGN_DEFS (MArrayN, T, MArrayN<T>) \
00276 MARRAY_UNOP_DEFS (MArrayN, T) \
00277 MARRAY_BINOP_DEFS (MArrayN, T)
00278
00279
00280 #define INSTANTIATE_MDIAGARRAY2_FRIENDS(T) \
00281 MARRAY_OP_ASSIGN_DEFS (MDiagArray2, T, MDiagArray2<T>) \
00282 MARRAY_UNOP_DEFS (MDiagArray2, T) \
00283 MDIAGARRAY2_BINOP_DEFS (MDiagArray2, T)
00284
00285
00286
00287 #define MARRAY_FORWARD_DEFS(B, R, T) \
00288 MARRAY_OP_ASSIGN_FWD_DEFS \
00289 (R, T, dynamic_cast<B<T>&>, R, , T) \
00290 \
00291 MARRAY_OP_ASSIGN_FWD_DEFS \
00292 (R, T, \
00293 dynamic_cast<B<T>&>, R, dynamic_cast<const B<T>&>, R) \
00294 \
00295 MARRAY_UNOP_FWD_DEFS \
00296 (R, T, dynamic_cast<const B<T>&>, R) \
00297 \
00298 MARRAY_BINOP_FWD_DEFS \
00299 (R, T, dynamic_cast<const B<T>&>, R, , T) \
00300 \
00301 MARRAY_BINOP_FWD_DEFS \
00302 (R, T, , T, dynamic_cast<const B<T>&>, R) \
00303 \
00304 MARRAY_AA_BINOP_FWD_DEFS \
00305 (R, T, dynamic_cast<const B<T>&>, R, dynamic_cast<const B<T>&>, R)
00306
00307 #define MDIAGARRAY2_FORWARD_DEFS(B, R, T) \
00308 MARRAY_OP_ASSIGN_FWD_DEFS \
00309 (R, T, \
00310 dynamic_cast<B<T>&>, R, dynamic_cast<const B<T>&>, R) \
00311 \
00312 MARRAY_UNOP_FWD_DEFS \
00313 (R, T, dynamic_cast<const B<T>&>, R) \
00314 \
00315 MDIAGARRAY2_DAS_BINOP_FWD_DEFS \
00316 (R, T, dynamic_cast<const B<T>&>, R, , T) \
00317 \
00318 MDIAGARRAY2_SDA_BINOP_FWD_DEFS \
00319 (R, T, , T, dynamic_cast<const B<T>&>, R) \
00320 \
00321 MDIAGARRAY2_DADA_BINOP_FWD_DEFS \
00322 (R, T, dynamic_cast<const B<T>&>, R, dynamic_cast<const B<T>&>, R)
00323
00324
00325
00326 #endif