Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

src/AppTypes/TSVMeta.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 /***************************************************************************
00003  *
00004  * The IPPL Framework
00005  * 
00006  *
00007  * Visit http://people.web.psi.ch/adelmann/ for more details
00008  *
00009  ***************************************************************************/
00010 
00011 #ifndef TSV_META_H
00012 #define TSV_META_H
00013 
00014 // include files
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 // forward declarations
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 // Define the macro TSV_ELEMENTWISE_OPERATOR which will let
00032 // Vektor, Tenzor and SymTenzor define their operators easily.
00033 //
00034 // The first argument of the macro is Vektor, Tenzor, SymTenzor, 
00035 // or AntiSymTenzor.
00036 // The second is the name of the operator (like operator+).
00037 // The third is the PETE tag class for that operation.
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  * $RCSfile: TSVMeta.h,v $   $Author: adelmann $
00091  * $Revision: 1.1.1.1 $   $Date: 2003/01/23 07:40:24 $
00092  * IPPL_VERSION_ID: $Id: TSVMeta.h,v 1.1.1.1 2003/01/23 07:40:24 adelmann Exp $ 
00093  ***************************************************************************/
00094 

Generated on Fri Nov 2 01:25:54 2007 for IPPL by doxygen 1.3.5