26 #ifndef MLN_ACCU_IMAGE_TAKE_HH
27 # define MLN_ACCU_IMAGE_TAKE_HH
34 # include <mln/core/concept/accumulator.hh>
35 # include <mln/core/concept/image.hh>
36 # include <mln/border/resize_equal.hh>
50 take(Image<I>& input,
const mln_deduce(I, value, argument)& arg);
52 template <
typename I,
typename J>
54 take(Image<I>& input,
const Image<J>& arg);
57 # ifndef MLN_INCLUDE_ONLY
65 template <
typename I,
typename J>
68 take_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 take(Image<I>& input_,
const mln_deduce(I, value, argument)& arg)
101 trace::entering(
"accu::impl::image::generic::take");
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());
112 trace::exiting("accu::impl::image::generic::take");
115 template <typename I, typename J>
118 take(Image<I>& input_, const Image<J>& arg_)
120 trace::entering(
"accu::impl::image::generic::take");
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::take_tests(input, arg);
130 mln_piter(J) p(arg.domain());
132 input(p).take(arg(p));
134 trace::exiting("accu::impl::image::generic::take");
142 template <typename I>
145 take_fastest(Image<I>& input_, const mln_deduce(I, value, argument)& arg)
147 trace::entering(
"accu::impl::image::take_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);
158 trace::exiting("accu::impl::image::take_fastest");
161 template <typename I, typename J>
164 take_fastest(Image<I>& input_, const Image<J>& arg_)
166 trace::entering(
"accu::impl::image::take_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::take_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().take( p_arg.val() );
185 trace::exiting("accu::impl::image::take_fastest");
199 template <
typename I>
202 take_dispatch(trait::image::speed::any,
203 Image<I>& input,
const mln_deduce(I, value, argument)& arg)
205 impl::generic::take(input, arg);
208 template <
typename I>
211 take_dispatch(trait::image::speed::fastest,
212 Image<I>& input,
const mln_deduce(I, value, argument)& arg)
214 impl::take_fastest(input, arg);
217 template <
typename I>
220 take_dispatch(Image<I>& input,
const mln_deduce(I, value, argument)& arg)
222 take_dispatch(mln_trait_image_speed(I)(),
228 template <
typename I,
typename J>
231 take_dispatch(trait::image::speed::any,
232 trait::image::speed::any,
233 Image<I>& input,
const Image<J>& arg)
235 impl::generic::take(input, arg);
238 template <
typename I,
typename J>
241 take_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::take_fastest(input, arg);
248 impl::generic::take(input, arg);
251 template <
typename I,
typename J>
254 take_dispatch(Image<I>& input,
const Image<J>& arg)
256 take_dispatch(mln_trait_image_speed(I)(),
257 mln_trait_image_speed(J)(),
266 template <
typename I>
269 take(Image<I>& input,
const mln_deduce(I, value, argument)& arg)
271 trace::entering(
"accu::image::take");
273 mlc_is_a(mln_value(I), Accumulator)::check();
275 mln_precondition(exact(input).is_valid());
276 internal::take_dispatch(input, arg);
278 trace::exiting(
"accu::image::take");
281 template <
typename I,
typename J>
284 take(Image<I>& input,
const Image<J>& arg)
286 trace::entering(
"accu::image::take");
288 mlc_is_a(mln_value(I), Accumulator)::check();
289 mlc_converts_to(mln_value(J), mln_deduce(I, value, argument))::check();
291 internal::take_tests(input, arg);
292 internal::take_dispatch(input, arg);
294 trace::exiting(
"accu::image::take");
297 # endif // ! MLN_INCLUDE_ONLY
306 #endif // ! MLN_ACCU_IMAGE_TAKE_HH