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_ARITH_MIN_HH
00027 # define MLN_ARITH_MIN_HH
00028
00032
00033 # include <mln/core/concept/image.hh>
00034
00035
00036
00037 # include <mln/arith/min.spe.hh>
00038
00039 namespace mln
00040 {
00041
00042 namespace arith
00043 {
00044
00046
00053 template <typename L, typename R>
00054 mln_concrete(L)
00055 min(const Image<L>& lhs, const Image<R>& rhs);
00056
00057
00059
00065 template <typename L, typename R>
00066 void min_inplace(Image<L>& lhs, const Image<R>& rhs);
00067
00068
00069 # ifndef MLN_INCLUDE_ONLY
00070
00071 namespace impl
00072 {
00073
00074 namespace generic
00075 {
00076 template <typename L, typename R, typename O>
00077 inline
00078 void min_(const L& lhs, const R& rhs, O& output)
00079 {
00080 trace::entering("data::arith::generic::min_");
00081
00082 mln_piter(L) p(lhs.domain());
00083 for_all(p)
00084 output(p) = lhs(p) < rhs(p) ? lhs(p) : rhs(p);
00085
00086 trace::entering("data::arith::generic::min_");
00087 }
00088
00089 template <typename L, typename R>
00090 inline
00091 void min_inplace_(L& lhs, const R& rhs)
00092 {
00093 trace::entering("data::arith::generic::min_inplace_");
00094
00095 mln_piter(L) p(lhs.domain());
00096 for_all(p)
00097 if (rhs(p) < lhs(p))
00098 lhs(p) = rhs(p);
00099
00100 trace::exiting("data::arith::generic::min_inplace_");
00101 }
00102
00103 }
00104
00105 }
00106
00107
00108
00109
00110 template <typename L, typename R>
00111 inline
00112 mln_concrete(L) min(const Image<L>& lhs, const Image<R>& rhs)
00113 {
00114 trace::entering("arith::min");
00115 mln_precondition(exact(rhs).domain() == exact(lhs).domain());
00116
00117 mln_concrete(L) output;
00118 initialize(output, lhs);
00119 impl::min_(mln_trait_image_speed(L)(), exact(lhs),
00120 mln_trait_image_speed(R)(), exact(rhs), output);
00121
00122 trace::exiting("arith::min");
00123 return output;
00124 }
00125
00126 template <typename L, typename R>
00127 inline
00128 void min_inplace(Image<L>& lhs, const Image<R>& rhs)
00129 {
00130 trace::entering("arith::min_inplace");
00131
00132 mln_precondition(exact(rhs).domain() == exact(lhs).domain());
00133 impl::min_inplace_(mln_trait_image_speed(L)(), exact(lhs),
00134 mln_trait_image_speed(R)(), exact(rhs));
00135
00136 trace::exiting("arith::min_inplace");
00137 }
00138
00139 # endif // ! MLN_INCLUDE_ONLY
00140
00141 }
00142
00143 }
00144
00145
00146 #endif // ! MLN_ARITH_MIN_HH