00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef MTL_RSCALE_INCLUDE
00010 #define MTL_RSCALE_INCLUDE
00011
00012 #include <boost/numeric/mtl/mtl_fwd.hpp>
00013 #include <boost/numeric/mtl/concept/std_concept.hpp>
00014 #include <boost/numeric/mtl/matrix/map_view.hpp>
00015 #include <boost/numeric/mtl/vector/map_view.hpp>
00016
00017 namespace mtl { namespace tfunctor {
00018
00019
00020 template <typename Value1, typename Value2, typename AlgebraicCategory>
00021 struct rscale
00022 {
00023 typedef typename Multiplicable<Value1, Value2>::result_type result_type;
00024
00025 explicit rscale(const Value2& v2) : v2(v2) {}
00026
00027 result_type operator() (const Value1& v1) const
00028 {
00029 return v1 * v2;
00030 }
00031 private:
00032 Value2 v2;
00033 };
00034
00035
00036 template <typename Matrix, typename Value2>
00037 struct rscale<Matrix, Value2, tag::matrix>
00038 {
00039 typedef matrix::rscaled_view<Matrix,Value2> result_type;
00040
00041 explicit rscale(const Value2& v2) : v2(v2) {}
00042
00043 result_type operator() (const Matrix& matrix) const
00044 {
00045 return result_type(matrix, v2);
00046 }
00047 private:
00048 Value2 v2;
00049 };
00050
00051
00052 template <typename Vector, typename Value2>
00053 struct rscale<Vector, Value2, tag::vector>
00054 {
00055 typedef vector::rscaled_view<Vector, Value2> result_type;
00056
00057 explicit rscale(const Value2& v2) : v2(v2) {}
00058
00059 result_type operator() (const Vector& vector) const
00060 {
00061 return result_type(vector, v2);
00062 }
00063 private:
00064 Value2 v2;
00065 };
00066
00067
00068 }
00069
00070
00071 namespace matrix {
00072
00073 template <typename Value1, typename Value2>
00074 typename tfunctor::rscale<Value1, Value2, typename traits::algebraic_category<Value1>::type>::result_type
00075 inline rscale(const Value1& value1, const Value2& value2)
00076 {
00077 return tfunctor::rscale<Value1, Value2, typename traits::algebraic_category<Value1>::type>(value2)(value1);
00078 }
00079 }
00080
00081 namespace vector {
00082
00083 template <typename Value1, typename Value2>
00084 typename tfunctor::rscale<Value1, Value2, typename traits::algebraic_category<Value1>::type>::result_type
00085 inline rscale(const Value1& value1, const Value2& value2)
00086 {
00087 return tfunctor::rscale<Value1, Value2, typename traits::algebraic_category<Value1>::type>(value2)(value1);
00088 }
00089 }
00090
00091
00092 }
00093
00094 #endif // MTL_RSCALE_INCLUDE