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