00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef TVMET_META_VECTOR_H
00025 #define TVMET_META_VECTOR_H
00026
00027 #include <tvmet/NumericTraits.h>
00028 #include <tvmet/xpr/Null.h>
00029
00030 namespace tvmet {
00031
00032
00033 template<class T, std::size_t Sz> class Vector;
00034
00035
00036 namespace meta {
00037
00038
00043 template<std::size_t Sz, std::size_t K=0>
00044 class Vector
00045 {
00046 Vector();
00047 Vector(const Vector&);
00048 Vector& operator=(const Vector&);
00049
00050 private:
00051 enum {
00052 doIt = (K < (Sz-1)) ? 1 : 0
00053 };
00054
00055 public:
00057 template <class Dest, class Src, class Assign>
00058 static inline
00059 void assign(Dest& lhs, const Src& rhs, const Assign& assign_fn) {
00060 assign_fn.apply_on(lhs(K), rhs(K));
00061 meta::Vector<Sz * doIt, (K+1) * doIt>::assign(lhs, rhs, assign_fn);
00062 }
00063
00065 template<class E>
00066 static inline
00067 typename E::value_type
00068 sum(const E& e) {
00069 return e(K) + meta::Vector<Sz * doIt, (K+1) * doIt>::sum(e);
00070 }
00071
00073 template<class E>
00074 static inline
00075 typename NumericTraits<
00076 typename E::value_type
00077 >::sum_type
00078 product(const E& e) {
00079 return e(K) * meta::Vector<Sz * doIt, (K+1) * doIt>::product(e);
00080 }
00081
00083 template<class Dest, class Src>
00084 static inline
00085 typename PromoteTraits<
00086 typename Dest::value_type,
00087 typename Src::value_type
00088 >::value_type
00089 dot(const Dest& lhs, const Src& rhs) {
00090 return lhs(K) * rhs(K)
00091 + meta::Vector<Sz * doIt, (K+1) * doIt>::dot(lhs, rhs);
00092 }
00093
00095 template<class E>
00096 static inline
00097 bool
00098 all_elements(const E& e) {
00099 if(!e(K)) return false;
00100 return meta::Vector<Sz * doIt, (K+1) * doIt>::all_elements(e);
00101 }
00102
00104 template<class E>
00105 static inline
00106 bool
00107 any_elements(const E& e) {
00108 if(e(K)) return true;
00109 return meta::Vector<Sz * doIt, (K+1) * doIt>::any_elements(e);
00110 }
00111 };
00112
00113
00118 template<>
00119 class Vector<0,0>
00120 {
00121 Vector();
00122 Vector(const Vector&);
00123 Vector& operator=(const Vector&);
00124
00125 public:
00126 template <class Dest, class Src, class Assign>
00127 static inline void assign(Dest&, const Src&, const Assign&) { }
00128
00129 template<class E>
00130 static inline XprNull sum(const E&) { return XprNull(); }
00131
00132 template<class E>
00133 static inline XprNull product(const E&) { return XprNull(); }
00134
00135 template<class Dest, class Src>
00136 static inline XprNull dot(const Dest&, const Src&) { return XprNull(); }
00137
00138 template<class E>
00139 static inline bool all_elements(const E&) { return true; }
00140
00141 template<class E>
00142 static inline bool any_elements(const E&) { return false; }
00143 };
00144
00145
00146 }
00147
00148 }
00149
00150 #endif
00151
00152
00153
00154
00155