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