00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef MTL_DIVIDE_BY_INCLUDE
00010 #define MTL_DIVIDE_BY_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 divide_by
00022 {
00023 typedef typename Multiplicable<Value1, Value2>::result_type result_type;
00024
00025 explicit divide_by(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 divide_by<Matrix, Value2, tag::matrix>
00038 {
00039 typedef matrix::divide_by_view<Matrix,Value2> result_type;
00040
00041 explicit divide_by(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 divide_by<Vector, Value2, tag::vector>
00054 {
00055 typedef vector::divide_by_view<Vector, Value2> result_type;
00056
00057 explicit divide_by(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::divide_by<Value1, Value2, typename traits::algebraic_category<Value1>::type>::result_type
00075 inline divide_by(const Value1& value1, const Value2& value2)
00076 {
00077 return tfunctor::divide_by<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::divide_by<Value1, Value2, typename traits::algebraic_category<Value1>::type>::result_type
00085 inline divide_by(const Value1& value1, const Value2& value2)
00086 {
00087 return tfunctor::divide_by<Value1, Value2, typename traits::algebraic_category<Value1>::type>(value2)(value1);
00088 }
00089 }
00090
00091 }
00092
00093 #endif // MTL_DIVIDE_BY_INCLUDE