26 #ifndef MLN_ACCU_IMAGE_TAKE_N_TIMES_HH
27 # define MLN_ACCU_IMAGE_TAKE_N_TIMES_HH
36 # include <mln/core/concept/accumulator.hh>
37 # include <mln/core/concept/image.hh>
38 # include <mln/border/resize_equal.hh>
50 template <
typename I,
typename J>
52 take_n_times(Image<I>& input,
const Image<J>& n_times,
const mln_deduce(I, value, argument)& arg);
54 template <
typename I,
typename J,
typename K>
56 take_n_times(Image<I>& input,
const Image<J>& n_times,
const Image<K>& arg);
60 # ifndef MLN_INCLUDE_ONLY
68 template <
typename I,
typename J>
71 take_n_times_tests(Image<I>& input_,
const Image<J>& n_times_)
73 I& input = exact(input_);
74 const J& n_times = exact(n_times_);
76 mln_precondition(input.is_valid());
77 mln_precondition(n_times.is_valid());
79 mln_precondition(n_times.domain() <= input.domain());
85 template <
typename I,
typename J,
typename K>
88 take_n_times_tests(Image<I>& input_,
const Image<J>& n_times_,
const Image<K>& arg_)
90 I& input = exact(input_);
91 const J& n_times = exact(n_times_);
92 const K& arg = exact(arg_);
94 mln_precondition(input.is_valid());
95 mln_precondition(n_times.is_valid());
96 mln_precondition(arg.is_valid());
98 mln_precondition(arg.domain() <= input.domain());
99 mln_precondition(arg.domain() <= n_times.domain());
119 template <
typename I,
typename J,
typename K>
122 take_n_times(Image<I>& input_,
const Image<J>& n_times_,
const Image<K>& arg_)
124 trace::entering(
"accu::impl::image::generic::take_n_times");
126 mlc_is_a(mln_value(I), Accumulator)::check();
127 mlc_converts_to(mln_value(J),
unsigned)::check();
128 mlc_converts_to(mln_value(K), mln_deduce(I, value, argument))::check();
130 I& input = exact(input_);
131 const J& n_times = exact(n_times_);
132 const K& arg = exact(arg_);
134 internal::take_n_times_tests(input, n_times, arg);
136 mln_piter(J) p(arg.domain());
138 input(p).take_n_times(n_times(p), arg(p));
140 trace::exiting("accu::impl::image::generic::take_n_times");
143 template <typename I, typename J>
146 take_n_times(Image<I>& input_, const Image<J>& n_times_, const mln_deduce(I, value, argument)& arg)
148 trace::entering(
"accu::impl::image::generic::take_n_times");
150 mlc_is_a(mln_value(I), Accumulator)::check();
151 mlc_converts_to(mln_value(J),
unsigned)::check();
153 I& input = exact(input_);
154 const J& n_times = exact(n_times_);
156 internal::take_n_times_tests(input, n_times);
158 mln_piter(J) p(n_times.domain());
160 input(p).take_n_times(n_times(p), arg);
162 trace::exiting("accu::impl::image::generic::take_n_times");
170 template <typename I, typename J>
173 take_n_times_fastest(Image<I>& input_, const Image<J>& n_times_, const mln_deduce(I, value, argument)& arg)
175 trace::entering(
"accu::impl::image::take_n_times_fastest");
177 mlc_is_a(mln_value(I), Accumulator)::check();
178 mlc_converts_to(mln_value(J),
unsigned)::check();
180 I& input = exact(input_);
181 const J& n_times = exact(n_times_);
183 internal::take_n_times_tests(input, n_times);
185 mln_precondition(n_times.domain() == input.domain());
187 border::resize_equal(input, n_times);
189 mln_pixter(I) p_in(input);
190 mln_pixter(const J) p_ntm(n_times);
191 for_all_2(p_in, p_ntm)
192 p_in.val().take_n_times( p_ntm.val(), arg );
194 trace::exiting("accu::impl::image::take_n_times_fastest");
197 template <typename I, typename J, typename K>
200 take_n_times_fastest(Image<I>& input_, const Image<J>& n_times_, const Image<K>& arg_)
202 trace::entering(
"accu::impl::image::take_n_times_fastest");
204 mlc_is_a(mln_value(I), Accumulator)::check();
205 mlc_converts_to(mln_value(J),
unsigned)::check();
206 mlc_converts_to(mln_value(K), mln_deduce(I, value, argument))::check();
208 I& input = exact(input_);
209 const J& n_times = exact(n_times_);
210 const K& arg = exact(arg_);
212 internal::take_n_times_tests(input, n_times, arg);
215 mln_precondition(arg.domain() == input.domain());
216 mln_precondition(arg.domain() == n_times.domain());
221 mln_pixter(I) p_in(input);
222 mln_pixter(const J) p_ntm(n_times);
223 mln_pixter(const K) p_arg(arg);
224 for_all_3(p_in, p_ntm, p_arg)
225 p_in.val().take_n_times( p_ntm.val(), p_arg.val() );
227 trace::exiting("accu::impl::image::take_n_times_fastest");
241 template <
typename I,
typename J>
244 take_n_times_dispatch(trait::image::speed::any,
245 trait::image::speed::any,
246 Image<I>& input,
const Image<J>& n_times,
const mln_deduce(I, value, argument)& arg)
248 impl::generic::take_n_times(input, n_times, arg);
251 template <
typename I,
typename J>
254 take_n_times_dispatch(trait::image::speed::fastest,
255 trait::image::speed::fastest,
256 Image<I>& input,
const Image<J>& n_times,
const mln_deduce(I, value, argument)& arg)
258 if (exact(n_times).domain() == exact(input).domain())
259 impl::take_n_times_fastest(input, n_times, arg);
261 impl::generic::take_n_times(input, n_times, arg);
264 template <
typename I,
typename J>
267 take_n_times_dispatch(Image<I>& input,
const Image<J>& n_times,
const mln_deduce(I, value, argument)& arg)
269 take_n_times_dispatch(mln_trait_image_speed(I)(),
270 mln_trait_image_speed(J)(),
271 input, n_times, arg);
276 template <
typename I,
typename J,
typename K>
279 take_n_times_dispatch(trait::image::speed::any,
280 trait::image::speed::any,
281 trait::image::speed::any,
282 Image<I>& input,
const Image<J>& n_times,
const Image<K>& arg)
284 impl::generic::take_n_times(input, n_times, arg);
287 template <
typename I,
typename J,
typename K>
290 take_n_times_dispatch(trait::image::speed::fastest,
291 trait::image::speed::fastest,
292 trait::image::speed::fastest,
293 Image<I>& input,
const Image<J>& n_times,
const Image<K>& arg)
295 if (exact(n_times).domain() == exact(input).domain() &&
296 exact(arg) .domain() == exact(input).domain())
297 impl::take_n_times_fastest(input, n_times, arg);
299 impl::generic::take_n_times(input, n_times, arg);
302 template <
typename I,
typename J,
typename K>
305 take_n_times_dispatch(Image<I>& input,
const Image<J>& n_times,
const Image<K>& arg)
307 take_n_times_dispatch(mln_trait_image_speed(I)(),
308 mln_trait_image_speed(J)(),
309 mln_trait_image_speed(K)(),
310 input, n_times, arg);
318 template <
typename I,
typename J>
320 take_n_times(Image<I>& input,
const Image<J>& n_times,
const mln_deduce(I, value, argument)& arg)
322 trace::entering(
"accu::image::take_n_times");
324 mlc_is_a(mln_value(I), Accumulator)::check();
325 mlc_converts_to(mln_value(J),
unsigned)::check();
327 internal::take_n_times_tests(input, n_times);
328 internal::take_n_times_dispatch(input, n_times, arg);
330 trace::exiting(
"accu::image::take_n_times");
333 template <
typename I,
typename J,
typename K>
336 take_n_times(Image<I>& input,
const Image<J>& n_times,
const Image<K>& arg)
338 trace::entering(
"accu::image::take_n_times");
340 mlc_is_a(mln_value(I), Accumulator)::check();
341 mlc_converts_to(mln_value(J),
unsigned)::check();
342 mlc_converts_to(mln_value(K), mln_deduce(I, value, argument))::check();
344 internal::take_n_times_tests(input, n_times, arg);
345 internal::take_n_times_dispatch(input, n_times, arg);
347 trace::exiting(
"accu::image::take_n_times");
350 # endif // ! MLN_INCLUDE_ONLY
359 #endif // ! MLN_ACCU_IMAGE_TAKE_N_TIMES_HH