26 #ifndef MLN_ACCU_IMAGE_TAKE_AS_INIT_HH
27 # define MLN_ACCU_IMAGE_TAKE_AS_INIT_HH
33 # include <mln/core/concept/accumulator.hh>
34 # include <mln/core/concept/image.hh>
35 # include <mln/border/resize_equal.hh>
49 take_as_init(Image<I>& input,
const mln_deduce(I, value, argument)& v);
51 template <
typename I,
typename J>
53 take_as_init(Image<I>& input,
const Image<J>& values);
57 # ifndef MLN_INCLUDE_ONLY
64 template <
typename I,
typename J>
67 take_as_init_tests(Image<I>& input_,
const Image<J>& values_)
69 I& input = exact(input_);
70 const J& values = exact(values_);
72 mln_precondition(input.is_valid());
73 mln_precondition(values.is_valid());
75 mln_precondition(values.domain() <= input.domain());
94 take_as_init(Image<I>& input_,
const mln_deduce(I, value, argument)& v)
96 trace::entering(
"accu::impl::image::generic::take_as_init");
98 mlc_is_a(mln_value(I), Accumulator)::check();
100 I& input = exact(input_);
101 mln_precondition(input.is_valid());
103 mln_piter(I) p(input.domain());
105 input(p).take_as_init(v);
107 trace::exiting("accu::impl::image::generic::take_as_init");
110 template <typename I, typename J>
112 take_as_init(Image<I>& input_, const Image<J>& values_)
114 trace::entering(
"accu::impl::image::generic::take_as_init");
116 typedef mln_value(I) A;
117 mlc_is_a(A, Accumulator)::check();
118 mlc_converts_to(mln_value(J), mln_argument(A))::check();
120 I& input = exact(input_);
121 const J& values = exact(values_);
123 internal::take_as_init_tests(input, values);
125 mln_piter(J) p(values.domain());
127 input(p).take_as_init(values(p));
129 trace::exiting("accu::impl::image::generic::take_as_init");
137 template <typename I>
139 take_as_init_fastest(Image<I>& input_, const mln_deduce(I, value, argument)& v)
141 trace::entering(
"accu::impl::image::take_as_init_fastest");
143 mlc_is_a(mln_value(I), Accumulator)::check();
145 I& input = exact(input_);
146 mln_precondition(input.is_valid());
148 mln_pixter(I) px(input);
150 px.val().take_as_init(v);
152 trace::exiting("accu::impl::image::take_as_init_fastest");
155 template <typename I, typename J>
157 take_as_init_fastest(Image<I>& input_, const Image<J>& values_)
159 trace::entering(
"accu::impl::image::take_as_init_fastest");
161 typedef mln_value(I) A;
162 mlc_is_a(A, Accumulator)::check();
163 mlc_converts_to(mln_value(J), mln_argument(A))::check();
165 I& input = exact(input_);
166 const J& values = exact(values_);
168 internal::take_as_init_tests(input, values);
170 mln_precondition(values.domain() == input.domain());
172 border::resize_equal(input, values);
174 mln_pixter(I) p_in(input);
175 mln_pixter(const J) p_v(values);
177 p_in.val().take_as_init(p_v.val());
179 trace::exiting("accu::impl::image::take_as_init_fastest");
193 template <
typename I,
typename V>
196 take_as_init_dispatch(trait::image::speed::any,
197 Image<I>& input,
const V& v)
199 impl::generic::take_as_init(input, v);
202 template <
typename I,
typename V>
205 take_as_init_dispatch(trait::image::speed::fastest,
206 Image<I>& input,
const V& v)
208 impl::take_as_init_fastest(input, v);
211 template <
typename I,
typename V>
214 take_as_init_dispatch(Image<I>& input,
const V& v)
216 take_as_init_dispatch(mln_trait_image_speed(I)(),
222 template <
typename I,
typename J>
225 take_as_init_dispatch(trait::image::speed::any,
226 trait::image::speed::any,
227 Image<I>& input,
const Image<J>& values)
229 impl::generic::take_as_init(input, values);
232 template <
typename I,
typename J>
235 take_as_init_dispatch(trait::image::speed::fastest,
236 trait::image::speed::fastest,
237 Image<I>& input,
const Image<J>& values)
239 if (exact(values).domain() == exact(input).domain())
240 impl::take_as_init_fastest(input, values);
242 impl::generic::take_as_init(input, values);
245 template <
typename I,
typename J>
248 take_as_init_dispatch(Image<I>& input,
249 const Image<J>& values)
251 take_as_init_dispatch(mln_trait_image_speed(I)(),
252 mln_trait_image_speed(J)(),
261 template <
typename I>
264 take_as_init(Image<I>& input,
const mln_deduce(I, value, argument)& v)
266 trace::entering(
"accu::image::take_as_init");
268 mlc_is_a(mln_value(I), Accumulator)::check();
270 mln_precondition(exact(input).is_valid());
271 internal::take_as_init_dispatch(input, v);
273 trace::exiting(
"accu::image::take_as_init");
276 template <
typename I,
typename J>
279 take_as_init(Image<I>& input,
const Image<J>& values)
281 trace::entering(
"accu::image::take_as_init");
283 typedef mln_value(I) A;
284 mlc_is_a(A, Accumulator)::check();
285 mlc_converts_to(mln_value(J), mln_argument(A))::check();
287 internal::take_as_init_tests(input, values);
288 internal::take_as_init_dispatch(input, values);
290 trace::exiting("accu::image::take_as_init");
293 # endif // ! MLN_INCLUDE_ONLY
302 #endif // ! MLN_ACCU_IMAGE_TAKE_AS_INIT_HH