00001
00002
00003
00004
00005
00006
00007
00008
00040 #ifndef vecop_macros_h
00041 #define vecop_macros_h
00042
00044 #define CML_VEC_UNIOP(_op_, _OpT_) \
00045 template<typename E, class AT> \
00046 inline et::VectorXpr< \
00047 et::UnaryVectorOp< vector<E,AT>, _OpT_ <E> > \
00048 > \
00049 \
00050 _op_ (const vector<E,AT>& arg) \
00051 { \
00052 typedef et::UnaryVectorOp< \
00053 vector<E,AT>, _OpT_ <E> \
00054 > ExprT; \
00055 return et::VectorXpr<ExprT>(ExprT(arg)); \
00056 }
00057
00058
00060 #define CML_VECXPR_UNIOP(_op_, _OpT_) \
00061 template<class XprT> \
00062 inline et::VectorXpr< \
00063 et::UnaryVectorOp< XprT, _OpT_ <typename XprT::value_type> > \
00064 > \
00065 \
00066 _op_ (VECXPR_ARG_TYPE arg) \
00067 { \
00068 typedef et::UnaryVectorOp< \
00069 XprT, _OpT_ <typename XprT::value_type> \
00070 > ExprT; \
00071 return et::VectorXpr<ExprT>(ExprT(arg.expression())); \
00072 }
00073
00074
00076 #define CML_VEC_VEC_BINOP(_op_, _OpT_) \
00077 template<typename E1, class AT1, typename E2, class AT2> \
00078 inline et::VectorXpr< \
00079 et::BinaryVectorOp< \
00080 vector<E1,AT1>, vector<E2,AT2>, _OpT_ <E1,E2> \
00081 > \
00082 > \
00083 \
00084 _op_ ( \
00085 const vector<E1,AT1>& left, \
00086 const vector<E2,AT2>& right) \
00087 { \
00088 typedef et::BinaryVectorOp< \
00089 vector<E1,AT1>, vector<E2,AT2>, _OpT_ <E1,E2> \
00090 > ExprT; \
00091 return et::VectorXpr<ExprT>(ExprT(left,right)); \
00092 }
00093
00094
00096 #define CML_VEC_VECXPR_BINOP(_op_, _OpT_) \
00097 template<typename E, class AT, class XprT> \
00098 inline et::VectorXpr< \
00099 et::BinaryVectorOp< \
00100 vector<E,AT>, XprT, _OpT_ <E, typename XprT::value_type> \
00101 > \
00102 > \
00103 \
00104 _op_ ( \
00105 const vector<E,AT>& left, \
00106 VECXPR_ARG_TYPE right) \
00107 { \
00108 typedef et::BinaryVectorOp< \
00109 vector<E,AT>, XprT, \
00110 _OpT_ <E, typename XprT::value_type> \
00111 > ExprT; \
00112 return et::VectorXpr<ExprT>(ExprT(left,right.expression())); \
00113 }
00114
00115
00117 #define CML_VECXPR_VEC_BINOP(_op_, _OpT_) \
00118 template<class XprT, typename E, class AT> \
00119 inline et::VectorXpr< \
00120 et::BinaryVectorOp< \
00121 XprT, vector<E,AT>, _OpT_ <typename XprT::value_type, E> \
00122 > \
00123 > \
00124 \
00125 _op_ ( \
00126 VECXPR_ARG_TYPE left, \
00127 const vector<E,AT>& right) \
00128 { \
00129 typedef et::BinaryVectorOp< \
00130 XprT, vector<E,AT>, \
00131 _OpT_ <typename XprT::value_type, E> \
00132 > ExprT; \
00133 return et::VectorXpr<ExprT>(ExprT(left.expression(),right)); \
00134 }
00135
00136
00138 #define CML_VECXPR_VECXPR_BINOP(_op_, _OpT_) \
00139 template<class XprT1, class XprT2> \
00140 inline et::VectorXpr< \
00141 et::BinaryVectorOp< \
00142 XprT1, XprT2, \
00143 _OpT_ < \
00144 typename XprT1::value_type, \
00145 typename XprT2::value_type \
00146 > \
00147 > \
00148 > \
00149 \
00150 _op_ ( \
00151 VECXPR_ARG_TYPE_N(1) left, \
00152 VECXPR_ARG_TYPE_N(2) right) \
00153 { \
00154 typedef et::BinaryVectorOp< \
00155 XprT1, XprT2, \
00156 _OpT_ < \
00157 typename XprT1::value_type, \
00158 typename XprT2::value_type> \
00159 > ExprT; \
00160 return et::VectorXpr<ExprT>( \
00161 ExprT(left.expression(),right.expression())); \
00162 }
00163
00164
00166 #define CML_VEC_SCALAR_BINOP(_op_, _OpT_) \
00167 template<typename E, class AT, typename ScalarT> \
00168 inline et::VectorXpr< \
00169 et::BinaryVectorOp< \
00170 vector<E,AT>, ScalarT, _OpT_ <E,ScalarT> \
00171 > \
00172 > \
00173 \
00174 _op_ ( \
00175 const vector<E,AT>& left, \
00176 SCALAR_ARG_TYPE right) \
00177 { \
00178 typedef et::BinaryVectorOp< \
00179 vector<E,AT>, ScalarT, _OpT_ <E,ScalarT> \
00180 > ExprT; \
00181 return et::VectorXpr<ExprT>(ExprT(left,right)); \
00182 }
00183
00184
00186 #define CML_SCALAR_VEC_BINOP(_op_, _OpT_) \
00187 template<typename ScalarT, typename E, class AT> \
00188 inline et::VectorXpr< \
00189 et::BinaryVectorOp< \
00190 ScalarT, vector<E,AT>, _OpT_ <ScalarT,E> \
00191 > \
00192 > \
00193 \
00194 _op_ ( \
00195 SCALAR_ARG_TYPE left, \
00196 const vector<E,AT>& right) \
00197 { \
00198 typedef et::BinaryVectorOp< \
00199 ScalarT, vector<E,AT>, _OpT_ <ScalarT,E> \
00200 > ExprT; \
00201 return et::VectorXpr<ExprT>(ExprT(left,right)); \
00202 }
00203
00204
00206 #define CML_VECXPR_SCALAR_BINOP(_op_, _OpT_) \
00207 template<class XprT, typename ScalarT> \
00208 inline et::VectorXpr< \
00209 et::BinaryVectorOp< \
00210 XprT, ScalarT, _OpT_ <typename XprT::value_type,ScalarT> \
00211 > \
00212 > \
00213 \
00214 _op_ ( \
00215 VECXPR_ARG_TYPE left, \
00216 SCALAR_ARG_TYPE right) \
00217 { \
00218 typedef et::BinaryVectorOp< \
00219 XprT, ScalarT, _OpT_ <typename XprT::value_type,ScalarT> \
00220 > ExprT; \
00221 return et::VectorXpr<ExprT>(ExprT(left.expression(),right)); \
00222 }
00223
00224
00226 #define CML_SCALAR_VECXPR_BINOP(_op_, _OpT_) \
00227 template<typename ScalarT, class XprT> \
00228 inline et::VectorXpr< \
00229 et::BinaryVectorOp< \
00230 ScalarT, XprT, _OpT_ <ScalarT, typename XprT::value_type> \
00231 > \
00232 > \
00233 \
00234 _op_ ( \
00235 SCALAR_ARG_TYPE left, \
00236 VECXPR_ARG_TYPE right) \
00237 { \
00238 typedef et::BinaryVectorOp< \
00239 ScalarT, XprT, \
00240 _OpT_ <ScalarT, typename XprT::value_type> \
00241 > ExprT; \
00242 return et::VectorXpr<ExprT>(ExprT(left,right.expression())); \
00243 }
00244
00245 #endif
00246
00247
00248