![]() |
|
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