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_GEMTV_H
00025 #define TVMET_META_GEMTV_H
00026
00027 #include <tvmet/xpr/Null.h>
00028
00029 namespace tvmet {
00030
00031 namespace meta {
00032
00033
00042 template<std::size_t Rows, std::size_t Cols,
00043 std::size_t I>
00044 class gemtv
00045 {
00046 gemtv();
00047 gemtv(const gemtv&);
00048 gemtv& operator=(const gemtv&);
00049
00050 private:
00051 enum {
00052 doIt = I < (Rows-1)
00053 };
00054
00055 public:
00057 template<class E1, class E2>
00058 static inline
00059 typename PromoteTraits<
00060 typename E1::value_type,
00061 typename E2::value_type
00062 >::value_type
00063 prod(const E1& lhs, const E2& rhs, std::size_t j) {
00064 return lhs(I, j) * rhs(I)
00065 + gemtv<Rows * doIt, Cols * doIt,
00066 (I+1)* doIt>::prod(lhs, rhs, j);
00067 }
00068 };
00069
00070
00075 template<>
00076 class gemtv<0,0,0>
00077 {
00078 gemtv();
00079 gemtv(const gemtv&);
00080 gemtv& operator=(const gemtv&);
00081
00082 public:
00083 template<class E1, class E2>
00084 static inline
00085 XprNull prod(const E1&, const E2&, std::size_t) {
00086 return XprNull();
00087 }
00088 };
00089
00090
00091 }
00092
00093 }
00094
00095 #endif
00096
00097
00098
00099
00100