00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_FUN_V2V_LINEAR_HH
00027 # define MLN_FUN_V2V_LINEAR_HH
00028
00032
00033 # include <mln/core/concept/function.hh>
00034 # include <mln/convert/to.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040 namespace fun
00041 {
00042
00043 namespace v2v
00044 {
00045
00054 template <typename V, typename T = V, typename R = T>
00055 struct linear : public Function_v2v< linear<V,T,R> >
00056 {
00057 typedef R result;
00058
00059 R operator()(const V& v) const;
00060
00061 template <typename U>
00062 R operator()(const U& u) const;
00063
00064 linear(T a, T b);
00065 T a, b;
00066 };
00067
00068
00069 template <typename V, typename T = V, typename R = T>
00070 struct linear_sat : public Function_v2v< linear_sat<V,T,R> >
00071 {
00072 typedef R result;
00073
00074 R operator()(const V& v) const;
00075
00076 template <typename U>
00077 R operator()(const U& u) const;
00078
00079 linear_sat(T a, T b);
00080 T a, b;
00081 };
00082
00083
00084 # ifndef MLN_INCLUDE_ONLY
00085
00086
00087
00088
00089 template <typename V, typename T, typename R>
00090 inline
00091 linear<V,T,R>::linear(T a, T b)
00092 : a(a),
00093 b(b)
00094 {
00095 }
00096
00097 template <typename V, typename T, typename R>
00098 inline
00099 R
00100 linear<V,T,R>::operator()(const V& v) const
00101 {
00102 return mln::convert::to<R>(a * static_cast<T>(v) + b);
00103 }
00104
00105 template <typename V, typename T, typename R>
00106 template <typename U>
00107 inline
00108 R
00109 linear<V,T,R>::operator()(const U& u) const
00110 {
00111 return this->operator()(static_cast<V>(u));
00112 }
00113
00114
00115
00116
00117 template <typename V, typename T, typename R>
00118 inline
00119 linear_sat<V,T,R>::linear_sat(T a, T b)
00120 : a(a),
00121 b(b)
00122 {
00123 }
00124
00125 template <typename V, typename T, typename R>
00126 inline
00127 R
00128 linear_sat<V,T,R>::operator()(const V& v) const
00129 {
00130 T res = a * static_cast<T>(v) + b;
00131 if (res > mln_max(R))
00132 res = mln_max(R);
00133 else if (res < mln_min(R))
00134 res = mln_min(R);
00135 return mln::convert::to<R>(res);
00136 }
00137
00138 template <typename V, typename T, typename R>
00139 template <typename U>
00140 inline
00141 R
00142 linear_sat<V,T,R>::operator()(const U& u) const
00143 {
00144 mlc_converts_to(U, V)::check();
00145 return this->operator()(static_cast<V>(u));
00146 }
00147
00148
00149 # endif // ! MLN_INCLUDE_ONLY
00150
00151 }
00152
00153 }
00154
00155 }
00156
00157
00158 #endif // ! MLN_FUN_V2V_LINEAR_HH