vecop_macros.h

Go to the documentation of this file.
00001 /* -*- C++ -*- ------------------------------------------------------------
00002  
00003 Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/
00004 
00005 The Configurable Math Library (CML) is distributed under the terms of the
00006 Boost Software License, v1.0 (see cml/LICENSE for details).
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 // vim:ft=cpp

Generated on Sat Jul 18 19:35:32 2009 for CML 1.0 by  doxygen 1.5.9