00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef _VIENNACL_TOOLS_MATRIX_SIZE_DEDUCER_HPP_
00016 #define _VIENNACL_TOOLS_MATRIX_SIZE_DEDUCER_HPP_
00017
00022 #include <string>
00023 #include <fstream>
00024 #include <sstream>
00025 #include "viennacl/forwards.h"
00026 #include "viennacl/tools/adapter.hpp"
00027
00028 #include <vector>
00029 #include <map>
00030
00031 namespace viennacl
00032 {
00033 namespace tools
00034 {
00035
00042 template <typename LHS, typename RHS, typename OP>
00043 struct MATRIX_SIZE_DEDUCER
00044 {
00045
00046 static size_t size1(LHS & lhs, RHS & rhs) { return lhs.size1(); }
00047 static size_t size2(LHS & lhs, RHS & rhs) { return rhs.size2(); }
00048 };
00049
00050
00051 template <typename ScalarType, unsigned int A1, unsigned int A2>
00052 struct MATRIX_SIZE_DEDUCER<viennacl::vector<ScalarType, A1>,
00053 viennacl::vector<ScalarType, A2>,
00054 viennacl::op_prod>
00055 {
00056 static size_t size1(viennacl::vector<ScalarType, A1> & lhs,
00057 viennacl::vector<ScalarType, A2> & rhs) { return lhs.size1(); }
00058
00059 static size_t size2(viennacl::vector<ScalarType, A1> & lhs,
00060 viennacl::vector<ScalarType, A2> & rhs) { return rhs.size2(); }
00061 };
00062
00063
00064
00065
00066
00067
00068
00069
00070 template <typename ScalarType, typename F1, unsigned int A1, typename F2, unsigned int A2>
00071 struct MATRIX_SIZE_DEDUCER<const viennacl::matrix_expression<const viennacl::matrix<ScalarType, F1, A1>,
00072 const viennacl::matrix<ScalarType, F1, A1>, op_trans>,
00073 const viennacl::matrix<ScalarType, F2, A2>,
00074 viennacl::op_prod>
00075 {
00076 static size_t size1(viennacl::matrix_expression<const viennacl::matrix<ScalarType, F1, A1>,
00077 const viennacl::matrix<ScalarType, F1, A1>,
00078 op_trans> const & lhs,
00079 viennacl::matrix<ScalarType, F2, A2> const & rhs) { return lhs.lhs().size2(); }
00080 static size_t size2(viennacl::matrix_expression<const viennacl::matrix<ScalarType, F1, A1>,
00081 const viennacl::matrix<ScalarType, F1, A1>,
00082 op_trans> const & lhs,
00083 viennacl::matrix<ScalarType, F2, A2> const & rhs) { return rhs.size2(); }
00084 };
00085
00086 template <typename ScalarType, typename F1, unsigned int A1, typename F2, unsigned int A2>
00087 struct MATRIX_SIZE_DEDUCER<const viennacl::matrix<ScalarType, F1, A1>,
00088 const viennacl::matrix_expression<const viennacl::matrix<ScalarType, F2, A2>,
00089 const viennacl::matrix<ScalarType, F2, A2>, op_trans>,
00090 viennacl::op_prod>
00091 {
00092 static size_t size1(viennacl::matrix<ScalarType, F1, A1> const & lhs,
00093 viennacl::matrix_expression<const viennacl::matrix<ScalarType, F2, A2>,
00094 const viennacl::matrix<ScalarType, F2, A2>,
00095 op_trans> const & rhs) { return lhs.size1(); }
00096 static size_t size2(viennacl::matrix<ScalarType, F1, A1> const & lhs,
00097 viennacl::matrix_expression<const viennacl::matrix<ScalarType, F2, A2>,
00098 const viennacl::matrix<ScalarType, F2, A2>,
00099 op_trans> const & rhs) { return rhs.lhs().size1(); }
00100 };
00101
00102 }
00103 }
00104
00105 #endif
00106