27 #ifndef MLN_ARITH_REVERT_HH
28 # define MLN_ARITH_REVERT_HH
36 # include <mln/core/concept/image.hh>
37 # include <mln/trait/value_.hh>
40 # include <mln/arith/revert.spe.hh>
66 mln_concrete(I)
revert(const Image<I>& input);
83 # ifndef MLN_INCLUDE_ONLY
91 template <
typename I,
typename O>
93 void revert(
const Image<I>& input_, Image<O>& output_)
95 mln_trace(
"arith::impl::generic::revert_");
97 const I& input =
exact(input_);
98 O& output =
exact(output_);
100 mln_precondition(input.is_valid());
101 mln_precondition(output.is_valid());
102 mln_precondition(input.domain() == output.domain());
104 typedef mln_value(I) V;
105 mln_piter(I)
p(input.domain());
107 output(
p) = mln_min(V) + (mln_max(V) - input(
p));
122 template <
typename I,
typename O>
125 revert_dispatch(trait::image::speed::any,
const I& input, O& output)
130 template <
typename I,
typename O>
133 revert_dispatch(trait::image::speed::fastest,
const I& input, O& output)
135 impl::revert_fastest(input, output);
138 template <
typename I,
typename O>
141 revert_dispatch(
const Image<I>& input, Image<O>& output)
143 revert_dispatch(mln_trait_image_speed(I)(),
155 template <
typename I>
157 mln_concrete(I)
revert(const Image<I>& input)
159 mln_trace(
"arith::revert");
161 mln_precondition(
exact(input).is_valid());
163 mln_concrete(I) output;
165 internal::revert_dispatch(
exact(input),
exact(output));
170 template <typename I>
174 mln_trace(
"arith::revert_inplace");
176 mln_precondition(
exact(input).is_valid());
178 internal::revert_dispatch(
exact(input),
exact(input));
182 # endif // ! MLN_INCLUDE_ONLY
189 #endif // ! MLN_ARITH_REVERT_HH