00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef MTL_COMPUTE_FACTORS_INCLUDE
00013 #define MTL_COMPUTE_FACTORS_INCLUDE
00014
00015 #include <boost/numeric/mtl/mtl_fwd.hpp>
00016
00017 namespace mtl { namespace operation {
00018
00019
00020 template <typename Result, typename Expr>
00021 struct compute_one_factor
00022 {
00023 typedef const Expr& type;
00024 typedef const Expr& const_reference;
00025
00026 compute_one_factor(type src) : value(src) {}
00027
00028 type value;
00029 };
00030
00031 template <typename Result, typename E1, typename E2>
00032 struct compute_one_factor<Result, matrix::mat_mat_times_expr<E1, E2> >
00033 {
00034 typedef Result type;
00035 typedef const Result& const_reference;
00036
00037 compute_one_factor(const matrix::mat_mat_times_expr<E1, E2>& src)
00038 : value(src.first * src.second) {}
00039
00040 type value;
00041 };
00042
00043 template <typename Result, typename E1, typename E2>
00044 struct compute_one_factor<Result, matrix::mat_mat_ele_times_expr<E1, E2> >
00045 {
00046 typedef Result type;
00047 typedef const Result& const_reference;
00048
00049 compute_one_factor(const matrix::mat_mat_ele_times_expr<E1, E2>& src)
00050 : value(ele_prod(src.first, src.second)) {}
00051
00052 type value;
00053 };
00054
00055
00056
00057 template <typename Result, typename Expr>
00058 struct compute_factors {};
00059
00060 template <typename Result, typename E1, typename E2>
00061 struct compute_factors<Result, matrix::mat_mat_times_expr<E1, E2> >
00062 {
00063 compute_factors(const matrix::mat_mat_times_expr<E1, E2>& src)
00064 : first_factor(src.first), second_factor(src.second),
00065 first(first_factor.value), second(second_factor.value)
00066 {}
00067
00068 compute_one_factor<Result, E1> first_factor;
00069 compute_one_factor<Result, E2> second_factor;
00070
00071 typename compute_one_factor<Result, E1>::const_reference first;
00072 typename compute_one_factor<Result, E2>::const_reference second;
00073 };
00074
00075
00076 template <typename Result, typename E1, typename E2>
00077 struct compute_factors<Result, matrix::mat_mat_ele_times_expr<E1, E2> >
00078 {
00079 compute_factors(const matrix::mat_mat_ele_times_expr<E1, E2>& src)
00080 : first(src.first), second_factor(src.second),
00081 second(second_factor.value)
00082 {}
00083
00084 const E1& first;
00085 compute_one_factor<Result, E2> second_factor;
00086 typename compute_one_factor<Result, E2>::const_reference second;
00087 };
00088
00089 }}
00090
00091 #endif // MTL_COMPUTE_FACTORS_INCLUDE