FreeFOAM The Cross-Platform CFD Toolkit
Hosted by SourceForge:
Get FreeFOAM at SourceForge.net.
            Fast, secure and Free Open Source software downloads

VectorSpaceM.H

Go to the documentation of this file.
00001 
00002 template<int N, int I> 
00003 class VectorSpaceOps
00004 {
00005 public:
00006 
00007     static const int endLoop = (I < N-1) ? 1 : 0;
00008 
00009     template<class V, class S, class EqOp>
00010     static inline void eqOpS(V& vs, const S& s, EqOp eo)
00011     {
00012         eo(vs.v_[I], s);
00013         VectorSpaceOps<endLoop*N, endLoop*(I+1)>::eqOpS(vs, s, eo);
00014     }
00015 
00016     template<class S, class V, class EqOp>
00017     static inline void SeqOp(S& s, const V& vs, EqOp eo)
00018     {
00019         eo(s, vs.v_[I]);
00020         VectorSpaceOps<endLoop*N, endLoop*(I+1)>::SeqOp(s, vs, eo);
00021     }
00022 
00023     template<class V1, class V2, class EqOp>
00024     static inline void eqOp(V1& vs1, const V2& vs2, EqOp eo)
00025     {
00026         eo(vs1.v_[I], vs2.v_[I]);
00027         VectorSpaceOps<endLoop*N, endLoop*(I+1)>::eqOp(vs1, vs2, eo);
00028     }
00029 
00030 
00031     template<class V, class V1, class S, class Op>
00032     static inline void opVS(V& vs, const V1& vs1, const S& s, Op o)
00033     {
00034         vs.v_[I] = o(vs1.v_[I], s);
00035         VectorSpaceOps<endLoop*N, endLoop*(I+1)>::opVS(vs, vs1, s, o);
00036     }
00037 
00038     template<class V, class S, class V1, class Op>
00039     static inline void opSV(V& vs, const S& s,  const V1& vs1, Op o)
00040     {
00041         vs.v_[I] = o(s, vs1.v_[I]);
00042         VectorSpaceOps<endLoop*N, endLoop*(I+1)>::opSV(vs, s, vs1, o);
00043     }
00044 
00045     template<class V, class V1, class Op>
00046     static inline void op(V& vs, const V1& vs1, const V1& vs2, Op o)
00047     {
00048         vs.v_[I] = o(vs1.v_[I], vs2.v_[I]);
00049         VectorSpaceOps<endLoop*N, endLoop*(I+1)>::op(vs, vs1, vs2, o);
00050     }
00051 };
00052 
00053 
00054 template<>
00055 class VectorSpaceOps<0, 0>
00056 {
00057 public:
00058 
00059     template<class V, class S, class EqOp>
00060     static inline void eqOpS(V&, const S&, EqOp)
00061     {}
00062 
00063     template<class S, class V, class EqOp>
00064     static inline void SeqOp(S&, const V&, EqOp)
00065     {}
00066 
00067     template<class V1, class V2, class EqOp>
00068     static inline void eqOp(V1&, const V2&, EqOp)
00069     {}
00070 
00071 
00072     template<class V, class V1, class S, class Op>
00073     static inline void opVS(V& vs, const V1&, const S&, Op)
00074     {}
00075 
00076     template<class V, class S, class V1, class Op>
00077     static inline void opSV(V& vs, const S&, const V1&, Op)
00078     {}
00079 
00080     template<class V, class V1, class Op>
00081     static inline void op(V& vs, const V1&, const V1&, Op)
00082     {}
00083 };
00084 
00085 // ************************ vim: set sw=4 sts=4 et: ************************ //
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines