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 mln_trace(
"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());
142 template <typename I, typename J>
145 take_n_times(Image<I>& input_, const Image<J>& n_times_, const mln_deduce(I,
value, argument)& arg)
147 mln_trace(
"accu::impl::image::generic::take_n_times");
149 mlc_is_a(mln_value(I), Accumulator)::check();
150 mlc_converts_to(mln_value(J),
unsigned)::check();
152 I& input =
exact(input_);
153 const J& n_times =
exact(n_times_);
155 internal::take_n_times_tests(input, n_times);
157 mln_piter(J) p(n_times.domain());
168 template <typename I, typename J>
171 take_n_times_fastest(Image<I>& input_, const Image<J>& n_times_, const mln_deduce(I, value, argument)& arg)
173 mln_trace(
"accu::impl::image::take_n_times_fastest");
175 mlc_is_a(mln_value(I), Accumulator)::check();
176 mlc_converts_to(mln_value(J),
unsigned)::check();
178 I& input =
exact(input_);
179 const J& n_times =
exact(n_times_);
181 internal::take_n_times_tests(input, n_times);
183 mln_precondition(n_times.domain() == input.domain());
187 mln_pixter(I) p_in(input);
188 mln_pixter(const J) p_ntm(n_times);
189 for_all_2(p_in, p_ntm)
194 template <typename I, typename J, typename K>
197 take_n_times_fastest(Image<I>& input_, const Image<J>& n_times_, const Image<K>& arg_)
199 mln_trace(
"accu::impl::image::take_n_times_fastest");
201 mlc_is_a(mln_value(I), Accumulator)::check();
202 mlc_converts_to(mln_value(J),
unsigned)::check();
203 mlc_converts_to(mln_value(K), mln_deduce(I, value, argument))::check();
205 I& input =
exact(input_);
206 const J& n_times =
exact(n_times_);
207 const K& arg =
exact(arg_);
209 internal::take_n_times_tests(input, n_times, arg);
212 mln_precondition(arg.domain() == input.domain());
213 mln_precondition(arg.domain() == n_times.domain());
218 mln_pixter(I) p_in(input);
219 mln_pixter(const J) p_ntm(n_times);
220 mln_pixter(const K) p_arg(arg);
221 for_all_3(p_in, p_ntm, p_arg)
237 template <
typename I,
typename J>
240 take_n_times_dispatch(trait::image::speed::any,
241 trait::image::speed::any,
242 Image<I>& input,
const Image<J>& n_times,
const mln_deduce(I, value, argument)& arg)
247 template <
typename I,
typename J>
250 take_n_times_dispatch(trait::image::speed::fastest,
251 trait::image::speed::fastest,
252 Image<I>& input,
const Image<J>& n_times,
const mln_deduce(I, value, argument)& arg)
254 if (
exact(n_times).domain() ==
exact(input).domain())
255 impl::take_n_times_fastest(input, n_times, arg);
260 template <
typename I,
typename J>
263 take_n_times_dispatch(Image<I>& input,
const Image<J>& n_times,
const mln_deduce(I, value, argument)& arg)
265 take_n_times_dispatch(mln_trait_image_speed(I)(),
266 mln_trait_image_speed(J)(),
267 input, n_times, arg);
272 template <
typename I,
typename J,
typename K>
275 take_n_times_dispatch(trait::image::speed::any,
276 trait::image::speed::any,
277 trait::image::speed::any,
278 Image<I>& input,
const Image<J>& n_times,
const Image<K>& arg)
283 template <
typename I,
typename J,
typename K>
286 take_n_times_dispatch(trait::image::speed::fastest,
287 trait::image::speed::fastest,
288 trait::image::speed::fastest,
289 Image<I>& input,
const Image<J>& n_times,
const Image<K>& arg)
291 if (
exact(n_times).domain() ==
exact(input).domain() &&
292 exact(arg) .domain() ==
exact(input).domain())
293 impl::take_n_times_fastest(input, n_times, arg);
298 template <
typename I,
typename J,
typename K>
301 take_n_times_dispatch(Image<I>& input,
const Image<J>& n_times,
const Image<K>& arg)
303 take_n_times_dispatch(mln_trait_image_speed(I)(),
304 mln_trait_image_speed(J)(),
305 mln_trait_image_speed(K)(),
306 input, n_times, arg);
314 template <
typename I,
typename J>
316 take_n_times(Image<I>& input,
const Image<J>& n_times,
const mln_deduce(I, value, argument)& arg)
318 mln_trace(
"accu::image::take_n_times");
320 mlc_is_a(mln_value(I), Accumulator)::check();
321 mlc_converts_to(mln_value(J),
unsigned)::check();
323 internal::take_n_times_tests(input, n_times);
324 internal::take_n_times_dispatch(input, n_times, arg);
328 template <
typename I,
typename J,
typename K>
331 take_n_times(Image<I>& input,
const Image<J>& n_times,
const Image<K>& arg)
333 mln_trace(
"accu::image::take_n_times");
335 mlc_is_a(mln_value(I), Accumulator)::check();
336 mlc_converts_to(mln_value(J),
unsigned)::check();
337 mlc_converts_to(mln_value(K), mln_deduce(I, value, argument))::check();
339 internal::take_n_times_tests(input, n_times, arg);
340 internal::take_n_times_dispatch(input, n_times, arg);
344 # endif // ! MLN_INCLUDE_ONLY
353 #endif // ! MLN_ACCU_IMAGE_TAKE_N_TIMES_HH