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))
49 const Accumulator<A>& a,
50 const Window<W>& win);
52 template <typename I, typename A, typename W>
53 mln_ch_value(I, mln_meta_accu_result(A, mln_value(I)))
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))
74 const Accumulator<A>& a_,
75 const Window<W>& win_)
77 mln_trace(
"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();
109 template <typename I, typename A, typename W>
110 mln_ch_value(I, mln_result(A))
111 transform_fastest(const Image<I>& input_, const Accumulator<A>& a_, const Window<W>& win_)
113 mln_trace(
"accu::impl::transform_fastest");
115 const I& input =
exact(input_);
116 const W& win =
exact(win_);
119 mln_precondition(input.is_valid());
120 mln_precondition(win.is_valid());
124 typedef mln_ch_value(I, mln_result(A)) O;
127 mln_pixter(O)
o(output);
129 mln_pixter(const I) p(input);
130 mln_qixter(const I, W) q(p, win);
136 o.val() = a.to_result();
151 template <
typename I,
typename A,
typename W>
152 mln_ch_value(I, mln_result(A))
153 transform_dispatch(metal::false_,
154 const Image<I>& input, const Accumulator<A>& a, const Window<W>& win)
159 template <
typename I,
typename A,
typename W>
160 mln_ch_value(I, mln_result(A))
161 transform_dispatch(metal::true_,
162 const Image<I>& input, const Accumulator<A>& a, const Window<W>& win)
164 return impl::transform_fastest(input, a, win);
167 template <
typename I,
typename A,
typename W>
168 mln_ch_value(I, mln_result(A))
169 transform_dispatch(const Image<I>& input, const Accumulator<A>& a, const Window<W>& win)
171 return transform_dispatch(mln_is_fastest_IW(I, W)(),
180 template <
typename I,
typename A,
typename W>
182 mln_ch_value(I, mln_result(A))
183 transform(const Image<I>& input, const Accumulator<A>& a, const Window<W>& win)
185 mln_trace(
"accu::transform");
187 mln_precondition(
exact(input).is_valid());
188 mln_precondition(
exact(win).is_valid());
190 mln_ch_value(I, mln_result(A)) output;
191 output = internal::transform_dispatch(input, a, win);
196 template <typename I, typename A, typename W>
197 mln_ch_value(I, mln_meta_accu_result(A, mln_value(I)))
198 transform(const Image<I>& input, const Meta_Accumulator<A>& a, const Window<W>& win)
200 mln_trace(
"accu::transform");
202 mln_precondition(
exact(input).is_valid());
203 mln_precondition(
exact(win).is_valid());
205 typedef mln_accu_with(A, mln_value(I)) A_;
208 mln_ch_value(I, mln_result(A_)) output;
209 output = internal::transform_dispatch(input, a_, win);
214 # endif // ! MLN_INCLUDE_ONLY
221 #endif // ! MLN_ACCU_TRANSFORM_HH