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_MORPHO_MIN_HH
00027 # define MLN_MORPHO_MIN_HH
00028
00036 # include <mln/data/compare.hh>
00037 # include <mln/logical/and.hh>
00038 # include <mln/arith/min.hh>
00039
00040
00041 namespace mln
00042 {
00043
00044 namespace morpho
00045 {
00046
00050 template <typename I, typename J>
00051 mln_concrete(I)
00052 min(const Image<I>& lhs, const Image<J>& rhs);
00053
00054
00059 template <typename I, typename J>
00060 void min_inplace(Image<I>& lhs, const Image<J>& rhs);
00061
00062
00063 # ifndef MLN_INCLUDE_ONLY
00064
00065 namespace impl
00066 {
00067
00068
00069
00070 template <typename I, typename J, typename O>
00071 inline
00072 mln_concrete(I) min_(trait::image::kind::logic,
00073 const I& lhs, const J& rhs)
00074 {
00075 return logical::and_(lhs, rhs);
00076 }
00077
00078 template <typename I, typename J>
00079 inline
00080 void min_inplace_(trait::image::kind::logic,
00081 I& lhs, const J& rhs)
00082 {
00083 logical::and_inplace(lhs, rhs);
00084 }
00085
00086
00087
00088 template <typename I, typename J>
00089 inline
00090 mln_concrete(I) min_(trait::image::kind::any,
00091 const I& lhs, const J& rhs)
00092 {
00093 return arith::min(lhs, rhs);
00094 }
00095
00096 template <typename I, typename J>
00097 inline
00098 void min_inplace_(trait::image::kind::any,
00099 I& lhs, const J& rhs)
00100 {
00101 arith::min_inplace(lhs, rhs);
00102 }
00103
00104 }
00105
00106
00107
00108
00109 template <typename I, typename J>
00110 inline
00111 mln_concrete(I)
00112 min(const Image<I>& lhs, const Image<J>& rhs)
00113 {
00114 trace::entering("morpho::min");
00115 mln_precondition(exact(rhs).domain() == exact(lhs).domain());
00116
00117 mln_concrete(I) output = impl::min_(mln_trait_image_kind(I)(), exact(lhs), exact(rhs));
00118
00119 trace::exiting("morpho::min");
00120 return output;
00121 }
00122
00123 template <typename I, typename J>
00124 inline
00125 void min_inplace(Image<I>& lhs, const Image<J>& rhs)
00126 {
00127 trace::entering("morpho::min_inplace");
00128 mln_precondition(exact(rhs).domain() == exact(lhs).domain());
00129
00130 impl::min_inplace_(mln_trait_image_kind(I)(), exact(lhs), exact(rhs));
00131
00132 trace::exiting("morpho::min_inplace_");
00133 }
00134
00135 # endif // ! MLN_INCLUDE_ONLY
00136
00137 }
00138
00139 }
00140
00141
00142 #endif // ! MLN_MORPHO_MIN_HH