00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef MTL_TRAITS_EVAL_INCLUDE
00013 #define MTL_TRAITS_EVAL_INCLUDE
00014
00015 #include <boost/numeric/mtl/mtl_fwd.hpp>
00016 #include <boost/numeric/mtl/matrix/crtp_base_matrix.hpp>
00017 #include <boost/numeric/mtl/matrix/mat_expr.hpp>
00018
00019 namespace mtl { namespace traits {
00020
00021
00022 template <typename T>
00023 struct eval {};
00024
00025 #if 0 // To be done later
00026 template <typename Value, typename Parameter>
00027 struct eval< mtl::vector::dense_vector<Value, Parameter> >
00028 {};
00029
00030
00031 template <typename Value1, typename Vector>
00032 struct eval< mtl::vector::scaled_view<Value1, Vector> >
00033 {};
00034
00035 template <typename Value1, typename Vector>
00036 struct eval< mtl::vector::rscaled_view<Value1, Vector> >
00037 {};
00038 #endif
00039
00040
00041 namespace impl {
00042
00043 template<typename T>
00044 struct eval_self_ref
00045 {
00046 typedef const T& const_reference;
00047
00048 explicit eval_self_ref(const T& ref) : ref(ref) {}
00049
00050 const_reference value() const { return ref; }
00051
00052 const T& ref;
00053 };
00054 }
00055
00056
00057 template <typename Value, typename Parameter>
00058 struct eval< mtl::matrix::dense2D<Value, Parameter> >
00059 : public impl::eval_self_ref< mtl::matrix::dense2D<Value, Parameter> >
00060 {
00061 eval(const mtl::matrix::dense2D<Value, Parameter>& ref)
00062 : impl::eval_self_ref< mtl::matrix::dense2D<Value, Parameter> >(ref)
00063 {}
00064 };
00065
00066 template <typename Value, long unsigned Mask, typename Parameter>
00067 struct eval< mtl::matrix::morton_dense<Value, Mask, Parameter> >
00068 : public impl::eval_self_ref< mtl::matrix::morton_dense<Value, Mask, Parameter> >
00069 {
00070 eval(const mtl::matrix::morton_dense<Value, Mask, Parameter>& ref)
00071 : impl::eval_self_ref< mtl::matrix::morton_dense<Value, Mask, Parameter> >(ref)
00072 {}
00073 };
00074
00075 template <typename Value, typename Parameter>
00076 struct eval< mtl::matrix::compressed2D<Value, Parameter> >
00077 : public impl::eval_self_ref< mtl::matrix::compressed2D<Value, Parameter> >
00078 {
00079 eval(const mtl::matrix::compressed2D<Value, Parameter>& ref)
00080 : impl::eval_self_ref< mtl::matrix::compressed2D<Value, Parameter> >(ref)
00081 {}
00082 };
00083
00084
00085
00086
00087 #if 0 // only dummy
00088 template <typename E1, typename E2>
00089 struct eval< mtl::matrix::mat_mat_asgn_expr<E1, E2> >
00090 {};
00091 #endif
00092
00093
00094 template <typename E1, typename E2>
00095 struct eval< mtl::matrix::mat_mat_plus_expr<E1, E2> >
00096 : public impl::eval_self_ref< mtl::matrix::mat_mat_plus_expr<E1, E2> >
00097 {
00098 eval(const mtl::matrix::mat_mat_plus_expr<E1, E2>& ref)
00099 : impl::eval_self_ref< mtl::matrix::mat_mat_plus_expr<E1, E2> >(ref)
00100 {}
00101 };
00102
00103 template <typename E1, typename E2>
00104 struct eval< mtl::matrix::mat_mat_minus_expr<E1, E2> >
00105 : public impl::eval_self_ref< mtl::matrix::mat_mat_minus_expr<E1, E2> >
00106 {
00107 eval(const mtl::matrix::mat_mat_minus_expr<E1, E2>& ref)
00108 : impl::eval_self_ref< mtl::matrix::mat_mat_minus_expr<E1, E2> >(ref)
00109 {}
00110 };
00111
00112 template <typename E1, typename E2>
00113 struct eval< mtl::matrix::mat_mat_ele_times_expr<E1, E2> >
00114 : public impl::eval_self_ref< mtl::matrix::mat_mat_ele_times_expr<E1, E2> >
00115 {
00116 eval(const mtl::matrix::mat_mat_ele_times_expr<E1, E2>& ref)
00117 : impl::eval_self_ref< mtl::matrix::mat_mat_ele_times_expr<E1, E2> >(ref)
00118 {}
00119 };
00120
00121
00122 template <typename E1, typename E2>
00123 struct eval< mtl::matrix::mat_mat_times_expr<E1, E2> >
00124 {
00125
00126 typedef matrix::dense2D<double> matrix_type;
00127 typedef const matrix_type& const_reference;
00128
00129
00130 explicit eval(const mtl::matrix::mat_mat_times_expr<E1, E2>& expr)
00131 : prod(expr.first * expr.second)
00132 {}
00133
00134 const_reference value() { return prod; }
00135
00136 private:
00137 matrix_type prod;
00138 };
00139
00140
00141
00142
00143 template <typename Value1, typename Matrix>
00144 struct eval< mtl::matrix::scaled_view<Value1, Matrix> >
00145 {};
00146
00147 template <typename Value1, typename Matrix>
00148 struct eval< mtl::matrix::rscaled_view<Value1, Matrix> >
00149 {};
00150
00151
00152 template <typename T>
00153 eval<T> inline evaluate(const T& ref)
00154 {
00155 return eval<T>(ref);
00156 }
00157
00158
00159 }
00160
00161 namespace matrix {
00162 using mtl::traits::evaluate;
00163 }
00164
00165 namespace vector {
00166 using mtl::traits::evaluate;
00167 }
00168
00169
00170 }
00171
00172 #endif // MTL_TRAITS_EVAL_INCLUDE