00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef MTL_MULT_RESULT_INCLUDE
00013 #define MTL_MULT_RESULT_INCLUDE
00014
00015 #include <boost/numeric/mtl/utility/ashape.hpp>
00016 #include <boost/numeric/mtl/matrix/map_view.hpp>
00017 #include <boost/numeric/mtl/matrix/mat_mat_times_expr.hpp>
00018 #include <boost/numeric/mtl/vector/map_view.hpp>
00019 #include <boost/numeric/mtl/operation/mat_cvec_times_expr.hpp>
00020
00021 namespace mtl { namespace traits {
00022
00023 template <typename Op1, typename Op2, typename MultOp> struct mult_result_aux;
00024 template <typename Op1, typename Op2, typename MultOp> struct vec_mult_result_aux;
00025
00026
00028
00031 template <typename Op1, typename Op2>
00032 struct mult_result
00033 : public mult_result_aux<Op1, Op2, typename ashape::mult_op<typename ashape::ashape<Op1>::type,
00034 typename ashape::ashape<Op2>::type >::type>
00035 {};
00036
00037
00039
00042 template <typename Op1, typename Op2>
00043 struct vec_mult_result
00044 : public vec_mult_result_aux<Op1, Op2, typename ashape::mult_op<typename ashape::ashape<Op1>::type,
00045 typename ashape::ashape<Op2>::type >::type>
00046 {};
00047
00048
00050
00051 template <typename Op1, typename Op2, typename MultOp>
00052 struct mult_result_aux {};
00053
00055 template <typename Op1, typename Op2>
00056 struct mult_result_aux<Op1, Op2, ::mtl::ashape::scal_mat_mult>
00057 {
00058 typedef matrix::scaled_view<Op1, Op2> type;
00059 };
00060
00061
00063 template <typename Op1, typename Op2>
00064 struct mult_result_aux<Op1, Op2, ::mtl::ashape::mat_scal_mult>
00065 {
00066 typedef matrix::rscaled_view<Op1, Op2> type;
00067 };
00068
00070 template <typename Op1, typename Op2>
00071 struct mult_result_aux<Op1, Op2, ::mtl::ashape::mat_mat_mult>
00072 {
00073 typedef matrix::mat_mat_times_expr<Op1, Op2> type;
00074 };
00075
00077 template <typename Op1, typename Op2>
00078 struct mult_result_aux<Op1, Op2, ::mtl::ashape::mat_cvec_mult>
00079 {
00080 typedef mat_cvec_times_expr<Op1, Op2> type;
00081 };
00082
00083
00085
00086 template <typename Op1, typename Op2, typename MultOp>
00087 struct vec_mult_result_aux {};
00088
00090 template <typename Op1, typename Op2>
00091 struct vec_mult_result_aux<Op1, Op2, ::mtl::ashape::scal_rvec_mult>
00092 {
00093 typedef vector::scaled_view<Op1, Op2> type;
00094 };
00095
00096
00097
00098
00100 template <typename Op1, typename Op2>
00101 struct vec_mult_result_aux<Op1, Op2, ::mtl::ashape::scal_cvec_mult>
00102 {
00103 typedef vector::scaled_view<Op1, Op2> type;
00104 };
00105
00107
00108 template <typename Op1, typename Op2>
00109 struct vec_mult_result_aux<Op1, Op2, ::mtl::ashape::rvec_scal_mult>
00110 {
00111 typedef vector::rscaled_view<Op1, Op2> type;
00112 };
00113
00115
00116 template <typename Op1, typename Op2>
00117 struct vec_mult_result_aux<Op1, Op2, ::mtl::ashape::cvec_scal_mult>
00118 {
00119 typedef vector::rscaled_view<Op1, Op2> type;
00120 };
00121
00122
00124 template <typename Op1, typename Op2, typename Result>
00125 struct lazy_enable_if_rvec_cvec_mult
00126 : boost::lazy_enable_if<boost::is_same<typename ashape::mult_op<typename ashape::ashape<Op1>::type,
00127 typename ashape::ashape<Op2>::type >::type,
00128 ashape::rvec_cvec_mult>,
00129 Result>
00130 {};
00131
00132
00133 }}
00134
00135 #endif // MTL_MULT_RESULT_INCLUDE