26 #ifndef MLN_DATA_TRANSFORM_INPLACE_HH
27 # define MLN_DATA_TRANSFORM_INPLACE_HH
35 # include <mln/core/concept/image.hh>
36 # include <mln/core/concept/function.hh>
37 # include <mln/value/set.hh>
38 # include <mln/value/lut_vec.hh>
39 # include <mln/opt/value.hh>
57 template <
typename I,
typename F>
72 template <
typename I1,
typename I2,
typename F>
75 const Function_vv2v<F>& f);
79 # ifndef MLN_INCLUDE_ONLY
87 template <
typename I,
typename F>
89 void transform_inplace_tests(
const Image<I>& ima,
90 const Function_v2v<F>& f)
93 mlc_or(mlc_is(mln_trait_image_pw_io(I),
94 trait::image::pw_io::read_write),
95 mlc_is(mln_trait_image_vw_io(I),
96 trait::image::vw_io::read_write))::check();
97 mlc_converts_to(mln_result(F), mln_value(I))::check();
100 mln_precondition(exact(ima).is_valid());
107 template <
typename I1,
typename I2,
typename F>
109 void transform_inplace_tests(Image<I1>& ima,
110 const Image<I2>& aux,
111 const Function_vv2v<F>& f)
114 mlc_or(mlc_is(mln_trait_image_pw_io(I1),
115 trait::image::pw_io::read_write),
116 mlc_is(mln_trait_image_vw_io(I1),
117 trait::image::vw_io::read_write))::check();
118 mlc_converts_to(mln_result(F), mln_value(I1))::check();
121 mln_precondition(exact(ima).is_valid());
122 mln_precondition(exact(aux).is_valid());
123 mln_precondition(exact(aux).domain() == exact(ima).domain());
147 template <
typename I,
typename F>
151 trace::entering(
"data::impl::generic::transform_inplace");
153 mlc_is(mln_trait_image_pw_io(I),
154 trait::image::pw_io::read_write)::check();
156 I& ima = exact(ima_);
157 const F& f = exact(f_);
159 internal::transform_inplace_tests(ima, f);
161 mln_piter(I) p(ima.domain());
165 trace::exiting(
"data::impl::generic::transform_inplace");
174 template <
typename I1,
typename I2,
typename F>
179 trace::entering(
"data::impl::generic::transform_inplace");
181 mlc_is(mln_trait_image_pw_io(I1),
182 trait::image::pw_io::read_write)::check();
184 I1& ima = exact(ima_);
185 const I2& aux = exact(aux_);
186 const F& f = exact(f_);
188 internal::transform_inplace_tests(ima, aux, f);
190 mln_piter(I1) p(ima.domain());
192 ima(p) = f(ima(p), aux(p));
194 trace::exiting(
"data::impl::generic::transform_inplace");
201 template <
typename I,
typename F>
206 trace::entering(
"data::impl::transform_inplace_lowq");
208 mlc_is(mln_trait_image_pw_io(I),
209 trait::image::pw_io::read_write)::check();
211 I& input = exact(input_);
212 const F& f = exact(f_);
214 internal::transform_inplace_tests(input, f);
217 lut(input.values_eligible(), f);
219 mln_piter(I) p(input.domain());
221 input(p) = lut(input(p));
223 trace::exiting(
"data::impl::transform_inplace_lowq");
226 template <
typename I,
typename F>
228 transform_inplace_taken(
Image<I>& input_,
231 trace::entering(
"data::impl::transform_inplace_taken");
233 mlc_is(mln_trait_image_pw_io(I),
234 trait::image::pw_io::read_write)::check();
236 I& input = exact(input_);
237 const F& f = exact(f_);
239 internal::transform_inplace_tests(input, f);
242 lut(input.taken_values(), f);
244 mln_piter(I) p(input.domain());
246 input(p) = lut(input(p));
248 trace::exiting("
data::impl::transform_inplace_taken");
252 template <typename I, typename F>
254 transform_inplace_singleton(
Image<I>& input_,
257 trace::entering(
"data::impl::transform_inplace_singleton");
259 I& input = exact(input_);
260 const F& f = exact(f_);
262 internal::transform_inplace_tests(input, f);
264 opt::value(input) = f(opt::value(input));
266 trace::exiting(
"data::impl::transform_inplace_singleton");
269 template <
typename I,
typename F>
273 trace::entering(
"data::impl::transform_inplace_fastest");
275 I& ima = exact(ima_);
276 const F& f = exact(f_);
278 internal::transform_inplace_tests(ima, f);
280 mln_pixter(I) p(ima);
282 p.val() = f(p.val());
284 trace::exiting("
data::impl::transform_inplace_fastest");
288 template <typename I, typename F>
290 transform_inplace_fastest_lowq(
Image<I>& input_,
293 trace::entering(
"data::impl::transform_inplace_fastest_lowq");
295 I& input = exact(input_);
296 const F& f = exact(f_);
298 internal::transform_inplace_tests(input, f);
301 lut(input.values_eligible(), f);
303 mln_pixter(I) pi(input);
305 pi.val() = lut(pi.val());
307 trace::exiting("
data::impl::transform_inplace_fastest_lowq");
311 template <typename I1, typename I2, typename F>
313 transform_inplace_fastest(
Image<I1>& ima_, const
Image<I2>& aux_,
316 trace::entering(
"data::impl::transform_inplace_fastest");
318 mlc_is(mln_trait_image_pw_io(I1),
319 trait::image::pw_io::read_write)::check();
321 I1& ima = exact(ima_);
322 const I2& aux = exact(aux_);
323 const F& f = exact(f_);
325 internal::transform_inplace_tests(ima, aux, f);
327 mln_pixter(I1) pi(ima);
328 mln_pixter(const I2) pa(aux);
330 pi.val() = f(pi.val(), pa.val());
332 trace::exiting("
data::impl::transform_inplace_fastest");
348 template <
typename I,
typename F>
350 transform_inplace_dispatch(trait::image::vw_set::any,
351 trait::image::quant::any,
357 template <
typename I,
typename F>
359 transform_inplace_dispatch(trait::image::vw_set::uni,
360 trait::image::quant::any,
361 Image<I>& ima,
const Function_v2v<F>& f)
363 data::impl::transform_inplace_taken(ima, f);
366 template <
typename I,
typename F>
368 transform_inplace_dispatch(trait::image::vw_set::any,
369 trait::image::quant::low,
370 Image<I>& ima,
const Function_v2v<F>& f)
378 template <
typename I,
typename F>
380 transform_inplace_dispatch_fast(trait::image::quant::any,
381 Image<I>& ima,
const Function_v2v<F>& f)
383 data::impl::transform_inplace_fastest(ima, f);
386 template <
typename I,
typename F>
388 transform_inplace_dispatch_fast(trait::image::quant::low,
389 Image<I>& ima,
const Function_v2v<F>& f)
391 data::impl::transform_inplace_fastest_lowq(ima, f);
398 template <
typename I,
typename F>
400 transform_inplace_dispatch(trait::image::value_storage::any,
401 trait::image::value_access::any,
402 Image<I>& ima,
const Function_v2v<F>& f)
404 transform_inplace_dispatch(mln_trait_image_vw_set(I)(),
405 mln_trait_image_quant(I)(),
409 template <
typename I,
typename F>
411 transform_inplace_dispatch(trait::image::value_storage::singleton,
412 trait::image::value_access::any,
413 Image<I>& ima,
const Function_v2v<F>& f)
415 data::impl::transform_inplace_singleton(ima, f);
419 template <
typename I,
typename F>
421 transform_inplace_dispatch(trait::image::value_storage::one_block,
422 trait::image::value_access::direct,
423 Image<I>& ima,
const Function_v2v<F>& f)
425 transform_inplace_dispatch_fast(mln_trait_image_quant(I)(),
433 template <
typename I,
typename F>
435 transform_inplace_dispatch(Image<I>& ima,
const Function_v2v<F>& f)
437 transform_inplace_dispatch(mln_trait_image_value_storage(I)(),
438 mln_trait_image_value_access(I)(),
446 template <
typename I1,
typename I2,
typename F>
448 transform_inplace_dispatch(trait::image::value_alignment::any,
449 trait::image::value_alignment::any,
450 trait::image::speed::any,
451 trait::image::speed::any,
452 Image<I1>& ima,
const Image<I2>& aux,
453 const Function_vv2v<F>& f)
458 template <
typename I1,
typename I2,
typename F>
460 transform_inplace_dispatch(trait::image::value_alignment::with_grid,
461 trait::image::value_alignment::with_grid,
462 trait::image::speed::fastest,
463 trait::image::speed::fastest,
464 Image<I1>& ima,
const Image<I2>& aux,
465 const Function_vv2v<F>& f)
467 data::impl::transform_inplace_fastest(ima, aux, f);
470 template <
typename I1,
typename I2,
typename F>
472 transform_inplace_dispatch(Image<I1>& ima,
const Image<I2>& aux,
473 const Function_vv2v<F>& f)
475 transform_inplace_dispatch(mln_trait_image_value_alignment(I1)(),
476 mln_trait_image_value_alignment(I2)(),
477 mln_trait_image_speed(I1)(),
478 mln_trait_image_speed(I2)(),
488 template <
typename I,
typename F>
492 trace::entering(
"data::transform_inplace");
494 internal::transform_inplace_tests(ima, f);
495 internal::transform_inplace_dispatch(ima, f);
497 trace::exiting(
"data::transform_inplace");
500 template <
typename I1,
typename I2,
typename F>
505 trace::entering(
"data::transform_inplace");
507 internal::transform_inplace_tests(ima, aux, f);
508 internal::transform_inplace_dispatch(ima, aux, f);
510 trace::exiting(
"data::transform_inplace");
514 # endif // ! MLN_INCLUDE_ONLY
521 #endif // ! MLN_DATA_TRANSFORM_INPLACE_HH