27 #ifndef MLN_MORPHO_TREE_COMPUTE_ATTRIBUTE_IMAGE_HH
28 # define MLN_MORPHO_TREE_COMPUTE_ATTRIBUTE_IMAGE_HH
36 # include <mln/core/routine/duplicate.hh>
37 # include <mln/core/concept/image.hh>
38 # include <mln/morpho/tree/data.hh>
39 # include <mln/trait/accumulators.hh>
40 # include <mln/util/pix.hh>
41 # include <mln/data/fill.hh>
80 template <
typename A,
typename T>
81 mln_ch_value(
typename T::function, mln_result(A))
84 mln_ch_value(typename T::function, A)* accu_image = 0);
98 template <typename A, typename T, typename V>
99 mln_ch_value(typename T::function, mln_result(A))
102 const Image<V>& values,
103 mln_ch_value(typename T::function, A)* accu_image = 0);
107 # ifndef MLN_INCLUDE_ONLY
112 template <
typename A,
typename I,
typename P>
113 void take_as_init (trait::accumulator::when_pix::use_none, A& accu,
114 const I& input,
const P& p)
121 template <
typename A,
typename I,
typename P>
122 void take_as_init (trait::accumulator::when_pix::use_pix, A& accu,
123 const I& input,
const P& p)
128 template <
typename A,
typename I,
typename P>
129 void take_as_init (trait::accumulator::when_pix::use_v, A& accu,
130 const I& input,
const P& p)
132 accu.take_as_init(input(p));
135 template <
typename A,
typename I,
typename P>
136 void take_as_init (trait::accumulator::when_pix::use_p, A& accu,
137 const I& input,
const P& p)
140 accu.take_as_init(p);
144 template <
typename A,
typename I,
typename P>
145 void take_as_init (A& accu,
const I& input,
const P& p)
147 take_as_init (mln_trait_accumulator_when_pix(A)(), accu, input, p);
151 template <
typename A,
typename T,
typename V>
153 mln_ch_value(
typename T::function, mln_result(A))
157 mln_ch_value(typename T::function, A)* accu_image = 0)
160 typedef typename T::function I;
161 mln_ch_value(I, A) acc;
162 initialize(acc, t.f());
174 mln_site_piter(T) p(t);
176 take_as_init(acc(p), values, p);
180 mln_up_site_piter(T) p(t);
184 acc(t.parent(p)).take(acc(p));
191 if (! t.is_a_node(p))
193 mln_assertion(t.is_a_node(t.parent(p)));
194 acc(p) = acc(t.parent(p));
203 typedef typename T::function I;
204 mln_ch_value(I, mln_result(A)) output;
205 initialize(output, acc);
206 mln::
data::fill(output, acc);
214 template <typename A, typename T>
216 mln_ch_value(typename T::function, mln_result(A))
219 mln_ch_value(typename T::function, A)* accu_image)
221 trace::entering(
"morpho::tree::compute_attribute_image");
223 mln_ch_value(
typename T::function, mln_result(A)) output;
224 output = internal::compute_attribute_image(exact(a_), t, t.f(),
227 trace::exiting(
"morpho::tree::compute_attribute_image");
231 template <
typename A,
typename T,
typename V>
233 mln_ch_value(
typename T::function, mln_result(A))
236 const
Image<V>& values,
237 mln_ch_value(typename T::function, A)* accu_image)
239 trace::entering(
"morpho::tree::compute_attribute_image_from");
242 mln_ch_value(
typename T::function, mln_result(A)) output;
243 output = internal::compute_attribute_image(exact(a_), t, exact(values),
246 trace::exiting(
"morpho::tree::compute_attribute_image_from");
253 # endif // ! MLN_INCLUDE_ONLY
262 #endif // ! MLN_MORPHO_TREE_COMPUTE_ATTRIBUTE_IMAGE_HH