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());
147 template <
typename I,
typename F>
151 mln_trace(
"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());
173 template <typename I1, typename I2, typename F>
176 const Function_vv2v<F>& f_)
178 mln_trace(
"data::impl::generic::transform_inplace");
180 mlc_is(mln_trait_image_pw_io(I1),
181 trait::image::pw_io::read_write)::check();
183 I1& ima =
exact(ima_);
184 const I2& aux =
exact(aux_);
185 const F& f =
exact(f_);
187 internal::transform_inplace_tests(ima, aux, f);
189 mln_piter(I1) p(ima.domain());
191 ima(p) = f(ima(p), aux(p));
199 template <typename I, typename F>
201 transform_inplace_lowq(Image<I>& input_,
202 const Function_v2v<F>& f_)
204 mln_trace(
"data::impl::transform_inplace_lowq");
206 mlc_is(mln_trait_image_pw_io(I),
207 trait::image::pw_io::read_write)::check();
209 I& input =
exact(input_);
210 const F& f =
exact(f_);
212 internal::transform_inplace_tests(input, f);
214 value::lut_vec<mln_vset(I), mln_result(F)>
215 lut(input.values_eligible(), f);
217 mln_piter(I) p(input.domain());
219 input(p) = lut(input(p));
223 template <typename I, typename F>
225 transform_inplace_taken(Image<I>& input_,
226 const Function_v2v<F>& f_)
228 mln_trace(
"data::impl::transform_inplace_taken");
230 mlc_is(mln_trait_image_pw_io(I),
231 trait::image::pw_io::read_write)::check();
233 I& input =
exact(input_);
234 const F& f =
exact(f_);
236 internal::transform_inplace_tests(input, f);
238 value::lut_vec<mln_vset(I), mln_result(F)>
239 lut(input.taken_values(), f);
241 mln_piter(I) p(input.domain());
243 input(p) = lut(input(p));
248 template <typename I, typename F>
250 transform_inplace_singleton(Image<I>& input_,
251 const Function_v2v<F>& f_)
253 mln_trace(
"data::impl::transform_inplace_singleton");
255 I& input =
exact(input_);
256 const F& f =
exact(f_);
258 internal::transform_inplace_tests(input, f);
264 template <
typename I,
typename F>
266 transform_inplace_fastest(Image<I>& ima_,
const Function_v2v<F>& f_)
268 mln_trace(
"data::impl::transform_inplace_fastest");
270 I& ima =
exact(ima_);
271 const F& f =
exact(f_);
273 internal::transform_inplace_tests(ima, f);
275 mln_pixter(I) p(ima);
277 p.val() = f(p.val());
282 template <typename I, typename F>
284 transform_inplace_fastest_lowq(Image<I>& input_,
285 const Function_v2v<F>& f_)
287 mln_trace(
"data::impl::transform_inplace_fastest_lowq");
289 I& input =
exact(input_);
290 const F& f =
exact(f_);
292 internal::transform_inplace_tests(input, f);
294 value::lut_vec<mln_vset(I), mln_result(F)>
295 lut(input.values_eligible(), f);
297 mln_pixter(I)
pi(input);
299 pi.val() = lut(
pi.val());
304 template <typename I1, typename I2, typename F>
306 transform_inplace_fastest(Image<I1>& ima_, const Image<I2>& aux_,
307 const Function_vv2v<F>& f_)
309 mln_trace(
"data::impl::transform_inplace_fastest");
311 mlc_is(mln_trait_image_pw_io(I1),
312 trait::image::pw_io::read_write)::check();
314 I1& ima =
exact(ima_);
315 const I2& aux =
exact(aux_);
316 const F& f =
exact(f_);
318 internal::transform_inplace_tests(ima, aux, f);
320 mln_pixter(I1)
pi(ima);
321 mln_pixter(const I2) pa(aux);
323 pi.val() = f(pi.val(), pa.val());
340 template <
typename I,
typename F>
342 transform_inplace_dispatch(trait::image::vw_set::any,
343 trait::image::quant::any,
344 Image<I>& ima,
const Function_v2v<F>& f)
349 template <
typename I,
typename F>
351 transform_inplace_dispatch(trait::image::vw_set::uni,
352 trait::image::quant::any,
353 Image<I>& ima,
const Function_v2v<F>& f)
355 data::impl::transform_inplace_taken(ima, f);
358 template <
typename I,
typename F>
360 transform_inplace_dispatch(trait::image::vw_set::any,
361 trait::image::quant::low,
362 Image<I>& ima,
const Function_v2v<F>& f)
364 data::impl::transform_inplace_lowq(ima, f);
370 template <
typename I,
typename F>
372 transform_inplace_dispatch_fast(trait::image::quant::any,
373 Image<I>& ima,
const Function_v2v<F>& f)
375 data::impl::transform_inplace_fastest(ima, f);
378 template <
typename I,
typename F>
380 transform_inplace_dispatch_fast(trait::image::quant::low,
381 Image<I>& ima,
const Function_v2v<F>& f)
383 data::impl::transform_inplace_fastest_lowq(ima, f);
390 template <
typename I,
typename F>
392 transform_inplace_dispatch(trait::image::value_storage::any,
393 trait::image::value_access::any,
394 Image<I>& ima,
const Function_v2v<F>& f)
396 transform_inplace_dispatch(mln_trait_image_vw_set(I)(),
397 mln_trait_image_quant(I)(),
401 template <
typename I,
typename F>
403 transform_inplace_dispatch(trait::image::value_storage::singleton,
404 trait::image::value_access::any,
405 Image<I>& ima,
const Function_v2v<F>& f)
407 data::impl::transform_inplace_singleton(ima, f);
411 template <
typename I,
typename F>
413 transform_inplace_dispatch(trait::image::value_storage::one_block,
414 trait::image::value_access::direct,
415 Image<I>& ima,
const Function_v2v<F>& f)
417 transform_inplace_dispatch_fast(mln_trait_image_quant(I)(),
425 template <
typename I,
typename F>
427 transform_inplace_dispatch(Image<I>& ima,
const Function_v2v<F>& f)
429 transform_inplace_dispatch(mln_trait_image_value_storage(I)(),
430 mln_trait_image_value_access(I)(),
438 template <
typename I1,
typename I2,
typename F>
440 transform_inplace_dispatch(trait::image::value_alignment::any,
441 trait::image::value_alignment::any,
442 trait::image::speed::any,
443 trait::image::speed::any,
444 Image<I1>& ima,
const Image<I2>& aux,
445 const Function_vv2v<F>& f)
450 template <
typename I1,
typename I2,
typename F>
452 transform_inplace_dispatch(trait::image::value_alignment::with_grid,
453 trait::image::value_alignment::with_grid,
454 trait::image::speed::fastest,
455 trait::image::speed::fastest,
456 Image<I1>& ima,
const Image<I2>& aux,
457 const Function_vv2v<F>& f)
459 data::impl::transform_inplace_fastest(ima, aux, f);
462 template <
typename I1,
typename I2,
typename F>
464 transform_inplace_dispatch(Image<I1>& ima,
const Image<I2>& aux,
465 const Function_vv2v<F>& f)
467 transform_inplace_dispatch(mln_trait_image_value_alignment(I1)(),
468 mln_trait_image_value_alignment(I2)(),
469 mln_trait_image_speed(I1)(),
470 mln_trait_image_speed(I2)(),
480 template <
typename I,
typename F>
484 mln_trace(
"data::transform_inplace");
486 internal::transform_inplace_tests(ima, f);
487 internal::transform_inplace_dispatch(ima, f);
491 template <
typename I1,
typename I2,
typename F>
494 const Function_vv2v<F>& f)
496 mln_trace(
"data::transform_inplace");
498 internal::transform_inplace_tests(ima, aux, f);
499 internal::transform_inplace_dispatch(ima, aux, f);
504 # endif // ! MLN_INCLUDE_ONLY
511 #endif // ! MLN_DATA_TRANSFORM_INPLACE_HH