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