26 #ifndef MLN_ACCU_TRANSFORM_HH
27 # define MLN_ACCU_TRANSFORM_HH
34 # include <mln/core/concept/meta_accumulator.hh>
35 # include <mln/core/concept/image.hh>
36 # include <mln/core/concept/window.hh>
37 # include <mln/extension/adjust.hh>
46 template <
typename I,
typename A,
typename W>
47 mln_ch_value(I, mln_result(A))
48 transform(const Image<I>& input,
49 const Accumulator<A>& a,
50 const Window<W>& win);
52 template <typename I, typename A, typename W>
54 transform(const Image<I>& input,
55 const Meta_Accumulator<A>& a,
56 const Window<W>& win);
60 # ifndef MLN_INCLUDE_ONLY
71 template <
typename I,
typename A,
typename W>
72 mln_ch_value(I, mln_result(A))
73 transform(const Image<I>& input_,
74 const Accumulator<A>& a_,
75 const Window<W>& win_)
77 trace::entering(
"accu::impl::generic::transform");
79 const I& input = exact(input_);
80 const W& win = exact(win_);
83 mln_precondition(input.is_valid());
84 mln_precondition(win.is_valid());
88 mln_ch_value(I, mln_result(A)) output;
91 mln_piter(I) p(input.domain());
92 mln_qiter(W) q(win, p);
96 for_all(q) if (input.has(q))
98 output(p) = a.to_result();
101 trace::exiting("accu::impl::generic::transform");
110 template <typename I, typename A, typename W>
111 mln_ch_value(I, mln_result(A))
112 transform_fastest(const Image<I>& input_, const Accumulator<A>& a_, const Window<W>& win_)
114 trace::entering(
"accu::impl::transform_fastest");
116 const I& input = exact(input_);
117 const W& win = exact(win_);
120 mln_precondition(input.is_valid());
121 mln_precondition(win.is_valid());
125 typedef mln_ch_value(I, mln_result(A)) O;
128 mln_pixter(O) o(output);
130 mln_pixter(const I) p(input);
131 mln_qixter(const I, W) q(p, win);
137 o.val() = a.to_result();
140 trace::exiting("accu::impl::transform_fastest");
153 template <
typename I,
typename A,
typename W>
154 mln_ch_value(I, mln_result(A))
155 transform_dispatch(metal::false_,
156 const Image<I>& input, const Accumulator<A>& a, const Window<W>& win)
158 return impl::generic::transform(input, a, win);
161 template <
typename I,
typename A,
typename W>
162 mln_ch_value(I, mln_result(A))
163 transform_dispatch(metal::true_,
164 const Image<I>& input, const Accumulator<A>& a, const Window<W>& win)
166 return impl::transform_fastest(input, a, win);
169 template <
typename I,
typename A,
typename W>
170 mln_ch_value(I, mln_result(A))
171 transform_dispatch(const Image<I>& input, const Accumulator<A>& a, const Window<W>& win)
173 return transform_dispatch(mln_is_fastest_IW(I, W)(),
182 template <
typename I,
typename A,
typename W>
184 mln_ch_value(I, mln_result(A))
185 transform(const Image<I>& input, const Accumulator<A>& a, const Window<W>& win)
187 trace::entering(
"accu::transform");
189 mln_precondition(exact(input).is_valid());
190 mln_precondition(exact(win).is_valid());
192 mln_ch_value(I, mln_result(A)) output;
193 output = internal::transform_dispatch(input, a, win);
195 trace::exiting("accu::transform");
199 template <typename I, typename A, typename W>
201 transform(const Image<I>& input, const Meta_Accumulator<A>& a, const Window<W>& win)
203 trace::entering(
"accu::transform");
205 mln_precondition(exact(input).is_valid());
206 mln_precondition(exact(win).is_valid());
208 typedef mln_accu_with(A, mln_value(I)) A_;
209 A_ a_ = accu::unmeta(exact(a), mln_value(I)());
211 mln_ch_value(I, mln_result(A_)) output;
212 output = internal::transform_dispatch(input, a_, win);
214 trace::exiting("accu::transform");
218 # endif // ! MLN_INCLUDE_ONLY
225 #endif // ! MLN_ACCU_TRANSFORM_HH