00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef TSV_META_H
00012 #define TSV_META_H
00013
00014
00015 #include "AppTypes/TSVMetaAssign.h"
00016 #include "AppTypes/TSVMetaUnary.h"
00017 #include "AppTypes/TSVMetaBinary.h"
00018 #include "AppTypes/TSVMetaDot.h"
00019 #include "AppTypes/TSVMetaCross.h"
00020 #include "AppTypes/TSVMetaDotDot.h"
00021 #include "AppTypes/TSVMetaCompare.h"
00022
00023
00024 template<class T, unsigned D> class Vektor;
00025 template<class T, unsigned D> class Tenzor;
00026 template<class T, unsigned D> class SymTenzor;
00027 template<class T, unsigned D> class AntiSymTenzor;
00028
00030
00031
00032
00033
00034
00035
00036
00037
00038
00040
00041
00042 #define TSV_ELEMENTWISE_OPERATOR_WITH_SCALAR(TSV,SCA,OP,APP) \
00043 \
00044 template < class T1 , unsigned D > \
00045 inline TSV<typename PETEBinaryReturn<T1,SCA,APP>::type,D> \
00046 OP(const TSV<T1,D>& lhs, SCA sca) \
00047 { \
00048 return TSV_MetaBinaryScalar< TSV<T1,D> , SCA , APP > :: apply(lhs,sca);\
00049 } \
00050 \
00051 template < class T1 , unsigned D > \
00052 inline TSV<typename PETEBinaryReturn<T1,SCA,APP>::type,D> \
00053 OP(SCA sca, const TSV<T1,D>& rhs) \
00054 { \
00055 return TSV_MetaBinaryScalar< SCA , TSV<T1,D> , APP > :: apply(sca,rhs);\
00056 }
00057
00058 #define TSV_ELEMENTWISE_OPERATOR(TSV,OP,APP) \
00059 \
00060 template < class T1, class T2, unsigned D > \
00061 inline TSV<typename PETEBinaryReturn<T1,T2,APP>::type,D> \
00062 OP(const TSV<T1,D> &lhs, const TSV<T2,D> &rhs) \
00063 { \
00064 return TSV_MetaBinary< TSV<T1,D> , TSV<T2,D> , APP > :: apply(lhs,rhs);\
00065 } \
00066 \
00067 TSV_ELEMENTWISE_OPERATOR_WITH_SCALAR(TSV,short,OP,APP) \
00068 TSV_ELEMENTWISE_OPERATOR_WITH_SCALAR(TSV,int,OP,APP) \
00069 TSV_ELEMENTWISE_OPERATOR_WITH_SCALAR(TSV,unsigned int,OP,APP) \
00070 TSV_ELEMENTWISE_OPERATOR_WITH_SCALAR(TSV,long,OP,APP) \
00071 TSV_ELEMENTWISE_OPERATOR_WITH_SCALAR(TSV,float,OP,APP) \
00072 TSV_ELEMENTWISE_OPERATOR_WITH_SCALAR(TSV,double,OP,APP) \
00073 TSV_ELEMENTWISE_OPERATOR_WITH_SCALAR(TSV,dcomplex,OP,APP)
00074
00075 #define TSV_ELEMENTWISE_OPERATOR2(TSV1,TSV2,OP,APP) \
00076 \
00077 template < class T1, class T2, unsigned D > \
00078 inline typename PETEBinaryReturn<TSV1<T1,D>,TSV2<T2,D>,APP>::type \
00079 OP(const TSV1<T1,D> &lhs, const TSV2<T2,D> &rhs) \
00080 { \
00081 return TSV_MetaBinary< TSV1<T1,D>, TSV2<T2,D>, APP >:: \
00082 apply(lhs,rhs); \
00083 }
00084
00086
00087 #endif // TSV_META_H
00088
00089
00090
00091
00092
00093
00094