26 #ifndef MLN_ACCU_IMAGE_SET_VALUE_HH
27 # define MLN_ACCU_IMAGE_SET_VALUE_HH
33 # include <mln/core/concept/accumulator.hh>
34 # include <mln/core/concept/image.hh>
35 # include <mln/border/resize_equal.hh>
49 set_value(Image<I>& input,
const mln_deduce(I, value, result)& res);
51 template <
typename I,
typename J>
53 set_value(Image<I>& input,
const Image<J>& res);
56 # ifndef MLN_INCLUDE_ONLY
64 template <
typename I,
typename J>
67 set_value_tests(Image<I>& input_,
const Image<J>& res_)
69 I& input = exact(input_);
70 const J& res = exact(res_);
72 mln_precondition(input.is_valid());
73 mln_precondition(res.is_valid());
75 mln_precondition(res.domain() <= input.domain());
96 set_value(Image<I>& input_,
const mln_deduce(I, value, result)& res)
98 trace::entering(
"accu::impl::image::generic::set_value");
100 typedef mln_value(I) A;
101 mlc_is_a(A, Accumulator)::check();
102 mlc_equal(mln_trait_accumulator_has_set_value(A),
103 trait::accumulator::has_set_value::yes)::check();
105 I& input = exact(input_);
106 mln_precondition(input.is_valid());
108 mln_piter(I) p(input.domain());
110 input(p).set_value(res);
112 trace::exiting("accu::impl::image::generic::set_value");
115 template <typename I, typename J>
118 set_value(Image<I>& input_, const Image<J>& res_)
120 trace::entering(
"accu::impl::image::generic::set_value");
122 typedef mln_value(I) A;
123 mlc_is_a(A, Accumulator)::check();
124 mlc_equal(mln_trait_accumulator_has_set_value(A),
125 trait::accumulator::has_set_value::yes)::check();
126 mlc_converts_to(mln_value(J), mln_deduce(I, value, result))::check();
128 I& input = exact(input_);
129 const J& res = exact(res_);
131 internal::set_value_tests(input, res);
133 mln_piter(J) p(res.domain());
135 input(p).set_value(res(p));
137 trace::exiting("accu::impl::image::generic::set_value");
145 template <typename I>
148 set_value_fastest(Image<I>& input_, const mln_deduce(I, value, result)& res)
150 trace::entering(
"accu::impl::image::set_value_fastest");
152 typedef mln_value(I) A;
153 mlc_is_a(A, Accumulator)::check();
154 mlc_equal(mln_trait_accumulator_has_set_value(A),
155 trait::accumulator::has_set_value::yes)::check();
157 I& input = exact(input_);
158 mln_precondition(input.is_valid());
160 mln_pixter(I) px(input);
162 px.val().set_value(res);
164 trace::exiting("accu::impl::image::set_value_fastest");
167 template <typename I, typename J>
170 set_value_fastest(Image<I>& input_, const Image<J>& res_)
172 trace::entering(
"accu::impl::image::set_value_fastest");
174 typedef mln_value(I) A;
175 mlc_is_a(A, Accumulator)::check();
176 mlc_equal(mln_trait_accumulator_has_set_value(A),
177 trait::accumulator::has_set_value::yes)::check();
178 mlc_converts_to(mln_value(J), mln_deduce(I, value, result))::check();
180 I& input = exact(input_);
181 const J& res = exact(res_);
183 internal::set_value_tests(input, res);
184 mln_precondition(res.domain() == input.domain());
186 border::resize_equal(input, res);
188 mln_pixter(I) p_in(input);
189 mln_pixter(const J) p_res(res);
190 for_all_2(p_in, p_res)
191 p_in.val().set_value(p_res.val());
193 trace::exiting("accu::impl::image::set_value_fastest");
207 template <
typename I>
210 set_value_dispatch(trait::image::speed::any,
211 Image<I>& input,
const mln_deduce(I, value, result)& res)
213 impl::generic::set_value(input, res);
216 template <
typename I>
218 set_value_dispatch(trait::image::speed::fastest,
219 Image<I>& input,
const mln_deduce(I, value, result)& res)
221 impl::set_value_fastest(input, res);
224 template <
typename I>
227 set_value_dispatch(Image<I>& input,
const mln_deduce(I, value, result)& res)
229 set_value_dispatch(mln_trait_image_speed(I)(),
235 template <
typename I,
typename J>
238 set_value_dispatch(trait::image::speed::any,
239 trait::image::speed::any,
240 Image<I>& input,
const Image<J>& res)
242 impl::generic::set_value(input, res);
245 template <
typename I,
typename J>
248 set_value_dispatch(trait::image::speed::fastest,
249 trait::image::speed::fastest,
250 Image<I>& input,
const Image<J>& res)
252 if (exact(res).domain() == exact(input).domain())
253 impl::set_value_fastest(input, res);
255 impl::generic::set_value(input, res);
258 template <
typename I,
typename J>
261 set_value_dispatch(Image<I>& input,
const Image<J>& res)
263 set_value_dispatch(mln_trait_image_speed(I)(),
264 mln_trait_image_speed(J)(),
273 template <
typename I>
276 set_value(Image<I>& input,
const mln_deduce(I, value, result)& res)
278 trace::entering(
"accu::image::set_value");
280 typedef mln_value(I) A;
281 mlc_is_a(A, Accumulator)::check();
282 mlc_equal(mln_trait_accumulator_has_set_value(A),
283 trait::accumulator::has_set_value::yes)::check();
285 mln_precondition(exact(input).is_valid());
286 internal::set_value_dispatch(input, res);
288 trace::exiting("accu::image::set_value");
291 template <typename I, typename J>
294 set_value(Image<I>& input, const Image<J>& res)
296 trace::entering(
"accu::image::set_value");
298 typedef mln_value(I) A;
299 mlc_is_a(A, Accumulator)::check();
300 mlc_equal(mln_trait_accumulator_has_set_value(A),
301 trait::accumulator::has_set_value::yes)::check();
302 mlc_converts_to(mln_value(J), mln_deduce(I, value, result))::check();
304 internal::set_value_tests(input, res);
305 internal::set_value_dispatch(input, res);
307 trace::exiting("accu::image::set_value");
310 # endif // ! MLN_INCLUDE_ONLY
319 #endif // ! MLN_ACCU_IMAGE_SET_VALUE_HH