26 #ifndef MLN_ACCU_IMAGE_UNTAKE_HH
27 # define MLN_ACCU_IMAGE_UNTAKE_HH
34 # include <mln/core/concept/accumulator.hh>
35 # include <mln/core/concept/image.hh>
36 # include <mln/border/resize_equal.hh>
50 untake(Image<I>& input,
const mln_deduce(I, value, argument)& arg);
52 template <
typename I,
typename J>
54 untake(Image<I>& input,
const Image<J>& arg);
57 # ifndef MLN_INCLUDE_ONLY
65 template <
typename I,
typename J>
68 untake_tests(Image<I>& input_,
const Image<J>& arg_)
70 I& input = exact(input_);
71 const J& arg = exact(arg_);
73 mln_precondition(input.is_valid());
74 mln_precondition(arg.is_valid());
76 mln_precondition(arg.domain() <= input.domain());
99 untake(Image<I>& input_,
const mln_deduce(I, value, argument)& arg)
101 trace::entering(
"accu::impl::image::generic::untake");
103 mlc_is_a(mln_value(I), Accumulator)::check();
105 I& input = exact(input_);
106 mln_precondition(input.is_valid());
108 mln_piter(I) p(input.domain());
110 input(p).untake(arg);
112 trace::exiting("accu::impl::image::generic::untake");
115 template <typename I, typename J>
118 untake(Image<I>& input_, const Image<J>& arg_)
120 trace::entering(
"accu::impl::image::generic::untake");
122 mlc_is_a(mln_value(I), Accumulator)::check();
123 mlc_converts_to(mln_value(J), mln_deduce(I, value, argument))::check();
125 I& input = exact(input_);
126 const J& arg = exact(arg_);
128 internal::untake_tests(input, arg);
130 mln_piter(J) p(arg.domain());
132 input(p).untake(arg(p));
134 trace::exiting("accu::impl::image::generic::untake");
142 template <typename I>
145 untake_fastest(Image<I>& input_, const mln_deduce(I, value, argument)& arg)
147 trace::entering(
"accu::impl::image::untake_fastest");
149 mlc_is_a(mln_value(I), Accumulator)::check();
151 I& input = exact(input_);
152 mln_precondition(input.is_valid());
154 mln_pixter(I) px(input);
156 px.val().untake(arg);
158 trace::exiting("accu::impl::image::untake_fastest");
161 template <typename I, typename J>
164 untake_fastest(Image<I>& input_, const Image<J>& arg_)
166 trace::entering(
"accu::impl::image::untake_fastest");
168 mlc_is_a(mln_value(I), Accumulator)::check();
169 mlc_converts_to(mln_value(J), mln_deduce(I, value, argument))::check();
171 I& input = exact(input_);
172 const J& arg = exact(arg_);
174 internal::untake_tests(input, arg);
176 mln_precondition(arg.domain() == input.domain());
178 border::resize_equal(input, arg);
180 mln_pixter(I) p_in(input);
181 mln_pixter(const J) p_arg(arg);
182 for_all_2(p_in, p_arg)
183 p_in.val().untake( p_arg.val() );
185 trace::exiting("accu::impl::image::untake_fastest");
199 template <
typename I>
202 untake_dispatch(trait::image::speed::any,
203 Image<I>& input,
const mln_deduce(I, value, argument)& arg)
205 impl::generic::untake(input, arg);
208 template <
typename I>
211 untake_dispatch(trait::image::speed::fastest,
212 Image<I>& input,
const mln_deduce(I, value, argument)& arg)
214 impl::untake_fastest(input, arg);
217 template <
typename I>
220 untake_dispatch(Image<I>& input,
const mln_deduce(I, value, argument)& arg)
222 untake_dispatch(mln_trait_image_speed(I)(),
228 template <
typename I,
typename J>
231 untake_dispatch(trait::image::speed::any,
232 trait::image::speed::any,
233 Image<I>& input,
const Image<J>& arg)
235 impl::generic::untake(input, arg);
238 template <
typename I,
typename J>
241 untake_dispatch(trait::image::speed::fastest,
242 trait::image::speed::fastest,
243 Image<I>& input,
const Image<J>& arg)
245 if (exact(arg).domain() == exact(input).domain())
246 impl::untake_fastest(input, arg);
248 impl::generic::untake(input, arg);
251 template <
typename I,
typename J>
254 untake_dispatch(Image<I>& input,
const Image<J>& arg)
256 untake_dispatch(mln_trait_image_speed(I)(),
257 mln_trait_image_speed(J)(),
266 template <
typename I>
269 untake(Image<I>& input,
const mln_deduce(I, value, argument)& arg)
271 trace::entering(
"accu::image::untake");
273 typedef mln_value(I) A;
274 mlc_is_a(A, Accumulator)::check();
275 mlc_equal(mln_trait_accumulator_has_untake(A),
276 trait::accumulator::has_untake::yes)::check();
278 mln_precondition(exact(input).is_valid());
279 internal::untake_dispatch(input, arg);
281 trace::exiting("accu::image::untake");
284 template <typename I, typename J>
287 untake(Image<I>& input, const Image<J>& arg)
289 trace::entering(
"accu::image::untake");
291 typedef mln_value(I) A;
292 mlc_is_a(A, Accumulator)::check();
293 mlc_equal(mln_trait_accumulator_has_untake(A),
294 trait::accumulator::has_untake::yes)::check();
295 mlc_converts_to(mln_value(J), mln_deduce(I, value, argument))::check();
297 internal::untake_tests(input, arg);
298 internal::untake_dispatch(input, arg);
300 trace::exiting("accu::image::untake");
303 # endif // ! MLN_INCLUDE_ONLY
312 #endif // ! MLN_ACCU_IMAGE_UNTAKE_HH