26 #ifndef MLN_MORPHO_ELEMENTARY_LIKE_ERO_FUN_HH
27 # define MLN_MORPHO_ELEMENTARY_LIKE_ERO_FUN_HH
34 # include <mln/morpho/includes.hh>
46 template <
typename A,
typename F,
47 typename I,
typename N>
50 const Image<I>& input, const Neighborhood<N>&
nbh);
54 # ifndef MLN_INCLUDE_ONLY
61 template <
typename V,
typename A>
62 V operator()(
const V& ,
const A& a)
const
77 template <
typename A,
typename F,
78 typename I,
typename N>
81 const Image<I>& input_, const Neighborhood<N>& nbh_)
83 mln_trace(
"morpho::elementary::impl::generic::like_ero_fun");
85 const I& input =
exact(input_);
86 const N& nbh =
exact(nbh_);
88 mln_accu_with(A, mln_value(I)) a = accu::unmeta(
exact(a_), mln_value(I)());
91 mln_concrete(I) output;
94 mln_piter(I)
p(input.domain());
95 mln_niter(N) n(nbh,
p);
98 a.take_as_init(input(p));
99 for_all(n) if (input.has(n))
101 output(p) = f(input(p), a);
110 template <typename A, typename F,
111 typename I, typename N>
113 like_ero_fun_fastest(const Meta_Accumulator<A>& a_, const F& f,
114 const Image<I>& input_, const Neighborhood<N>& nbh_)
116 mln_trace(
"morpho::elementary::impl::like_ero_fun_fastest");
118 const I& input =
exact(input_);
119 const N& nbh =
exact(nbh_);
121 mln_accu_with(A, mln_value(I)) a = accu::unmeta(
exact(a_), mln_value(I)());
124 mln_concrete(I) output;
127 mln_pixter(const I) p_in(input);
128 mln_pixter(I) p_out(output);
129 mln_nixter(const I, N) n(p_in, nbh);
130 for_all_2(p_in, p_out)
132 a.take_as_init(p_in.val());
135 p_out.val() = f(p_in.val(), a);
147 template <
typename A,
typename F,
148 typename I,
typename N>
150 like_ero_fun_dispatch(metal::false_,
151 const A& a, const F& f,
152 const I& input, const N& nbh)
157 template <
typename A,
typename F,
158 typename I,
typename N>
160 like_ero_fun_dispatch(metal::true_,
161 const A& a, const F& f,
162 const I& input, const N& nbh)
164 return impl::like_ero_fun_fastest(a, f, input, nbh);
167 template <
typename A,
typename F,
168 typename I,
typename N>
170 like_ero_fun_dispatch(const A& a, const F& f,
171 const I& input, const N& nbh)
173 typedef mlc_equal(mln_trait_image_speed(I),
174 trait::image::speed::fastest) I_fastest;
175 typedef mln_window(N) W;
176 typedef mln_is_simple_window(W) N_simple;
178 return like_ero_fun_dispatch(mlc_and(I_fastest, N_simple)(),
187 template <typename A, typename F,
188 typename I, typename N>
191 const Image<I>& input, const Neighborhood<N>& nbh)
193 return internal::like_ero_fun_dispatch(a, f,
197 # endif // ! MLN_INCLUDE_ONLY
206 #endif // ! MLN_MORPHO_ELEMENTARY_LIKE_ERO_FUN_HH