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 trace::entering(
"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));
109 trace::exiting("arith::impl::generic::revert_");
123 template <
typename I,
typename O>
126 revert_dispatch(trait::image::speed::any,
const I& input, O& output)
128 impl::generic::revert(input, output);
131 template <
typename I,
typename O>
134 revert_dispatch(trait::image::speed::fastest,
const I& input, O& output)
136 impl::revert_fastest(input, output);
139 template <
typename I,
typename O>
142 revert_dispatch(
const Image<I>& input, Image<O>& output)
144 revert_dispatch(mln_trait_image_speed(I)(),
145 exact(input), exact(output));
156 template <
typename I>
158 mln_concrete(I) revert(const
Image<I>& input)
160 trace::entering(
"arith::revert");
162 mln_precondition(exact(input).is_valid());
164 mln_concrete(I) output;
166 internal::revert_dispatch(exact(input), exact(output));
168 trace::exiting(
"arith::revert");
172 template <
typename I>
176 trace::entering(
"arith::revert_inplace");
178 mln_precondition(exact(input).is_valid());
180 internal::revert_dispatch(exact(input), exact(input));
182 trace::exiting(
"arith::revert_inplace");
185 # endif // ! MLN_INCLUDE_ONLY
192 #endif // ! MLN_ARITH_REVERT_HH