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_MINUS_HH
00027 # define MLN_MORPHO_MINUS_HH
00028
00036 # include <mln/data/compare.hh>
00037 # include <mln/logical/and_not.hh>
00038 # include <mln/arith/minus.hh>
00039
00040
00041 namespace mln
00042 {
00043
00044 namespace morpho
00045 {
00046
00050 template <typename I, typename J>
00051 mln_concrete(I) minus(const Image<I>& lhs, const Image<J>& rhs);
00052
00053
00054 # ifndef MLN_INCLUDE_ONLY
00055
00056 namespace impl
00057 {
00058
00059
00060
00061 template <typename I, typename J>
00062 inline
00063 mln_concrete(I) minus_(trait::image::kind::logic,
00064 const I& lhs, const J& rhs)
00065 {
00066 return logical::and_not(lhs, rhs);
00067 }
00068
00069
00070
00071 template <typename I, typename J>
00072 inline
00073 mln_concrete(I) minus_(trait::image::kind::any,
00074 const I& lhs, const J& rhs)
00075 {
00076 return arith::minus<mln_value(I)>(lhs, rhs);
00077 }
00078
00079 }
00080
00081
00082
00083
00084 template <typename I, typename J>
00085 inline
00086 mln_concrete(I)
00087 minus(const Image<I>& lhs, const Image<J>& rhs)
00088 {
00089 trace::entering("morpho::minus");
00090 mln_precondition(exact(rhs).domain() == exact(lhs).domain());
00091
00092 mln_concrete(I) output = impl::minus_(mln_trait_image_kind(I)(),
00093 exact(lhs), exact(rhs));
00094
00095 trace::exiting("morpho::minus");
00096 return output;
00097 }
00098
00099 # endif // ! MLN_INCLUDE_ONLY
00100
00101 }
00102
00103 }
00104
00105
00106 #endif // ! MLN_MORPHO_MINUS_HH