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 mln_trace(
"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());
114 template <typename I, typename J>
117 take(Image<I>& input_, const Image<J>& arg_)
119 mln_trace(
"accu::impl::image::generic::take");
121 mlc_is_a(mln_value(I), Accumulator)::check();
122 mlc_converts_to(mln_value(J), mln_deduce(I,
value, argument))::check();
124 I& input =
exact(input_);
125 const J& arg =
exact(arg_);
127 internal::take_tests(input, arg);
129 mln_piter(J)
p(arg.domain());
140 template <typename I>
143 take_fastest(Image<I>& input_, const mln_deduce(I,
value, argument)& arg)
145 mln_trace(
"accu::impl::image::take_fastest");
147 mlc_is_a(mln_value(I), Accumulator)::check();
149 I& input =
exact(input_);
150 mln_precondition(input.is_valid());
152 mln_pixter(I) px(input);
158 template <typename I, typename J>
161 take_fastest(Image<I>& input_, const Image<J>& arg_)
163 mln_trace(
"accu::impl::image::take_fastest");
165 mlc_is_a(mln_value(I), Accumulator)::check();
166 mlc_converts_to(mln_value(J), mln_deduce(I, value, argument))::check();
168 I& input =
exact(input_);
169 const J& arg =
exact(arg_);
171 internal::take_tests(input, arg);
173 mln_precondition(arg.domain() == input.domain());
177 mln_pixter(I) p_in(input);
178 mln_pixter(const J) p_arg(arg);
179 for_all_2(p_in, p_arg)
180 p_in.val().
take( p_arg.val() );
195 template <
typename I>
198 take_dispatch(trait::image::speed::any,
199 Image<I>& input,
const mln_deduce(I, value, argument)& arg)
204 template <
typename I>
207 take_dispatch(trait::image::speed::fastest,
208 Image<I>& input,
const mln_deduce(I, value, argument)& arg)
210 impl::take_fastest(input, arg);
213 template <
typename I>
216 take_dispatch(Image<I>& input,
const mln_deduce(I, value, argument)& arg)
218 take_dispatch(mln_trait_image_speed(I)(),
224 template <
typename I,
typename J>
227 take_dispatch(trait::image::speed::any,
228 trait::image::speed::any,
229 Image<I>& input,
const Image<J>& arg)
234 template <
typename I,
typename J>
237 take_dispatch(trait::image::speed::fastest,
238 trait::image::speed::fastest,
239 Image<I>& input,
const Image<J>& arg)
241 if (
exact(arg).domain() ==
exact(input).domain())
242 impl::take_fastest(input, arg);
247 template <
typename I,
typename J>
250 take_dispatch(Image<I>& input,
const Image<J>& arg)
252 take_dispatch(mln_trait_image_speed(I)(),
253 mln_trait_image_speed(J)(),
262 template <
typename I>
265 take(Image<I>& input,
const mln_deduce(I, value, argument)& arg)
267 mln_trace(
"accu::image::take");
269 mlc_is_a(mln_value(I), Accumulator)::check();
271 mln_precondition(
exact(input).is_valid());
272 internal::take_dispatch(input, arg);
276 template <
typename I,
typename J>
279 take(Image<I>& input,
const Image<J>& arg)
281 mln_trace(
"accu::image::take");
283 mlc_is_a(mln_value(I), Accumulator)::check();
284 mlc_converts_to(mln_value(J), mln_deduce(I, value, argument))::check();
286 internal::take_tests(input, arg);
287 internal::take_dispatch(input, arg);
291 # endif // ! MLN_INCLUDE_ONLY
300 #endif // ! MLN_ACCU_IMAGE_TAKE_HH