26 #ifndef MLN_MORPHO_TREE_PROPAGATE_IF_HH
27 # define MLN_MORPHO_TREE_PROPAGATE_IF_HH
34 # include <mln/morpho/tree/data.hh>
35 # include <mln/morpho/tree/propagate_node.hh>
37 # include <mln/data/fill.hh>
38 # include <mln/pw/all.hh>
65 template <
typename T,
typename A,
typename P,
typename W>
72 const mln_value(A)& v);
75 template <
typename T,
typename A,
typename P>
94 template <
typename T,
typename A,
typename W>
100 const mln_value(A)& v,
101 const mln_value(A)& v_prop);
104 template <
typename T,
typename A,
typename W>
110 const mln_value(A)& v);
115 # ifndef MLN_INCLUDE_ONLY
119 template <
typename T,
typename A,
typename P>
120 bool check_propagate_if(
const T& t,
124 const mln_value(A)& v)
127 mln_node_piter(
T) n(t);
129 if (pred(n) && a(t.parent(n)) != v)
134 template <typename
T, typename A, typename P>
135 bool check_propagate_if(const T& t,
139 const mln_value(A)& v)
142 mln_node_piter(T) n(t);
144 if (a(n) != v && pred(t.parent(n)))
149 template <typename T, typename A, typename P>
150 bool check_propagate_if(const T& t,
156 mln_node_piter(T) n(t);
158 if (a(n) != a(t.parent(n)) && pred(t.parent(n)))
163 template <typename T, typename A, typename P>
170 const mln_value(A)& v)
174 mln_precondition(a.is_valid());
175 mln_precondition(tree.f().domain() == a.domain());
177 mln_ch_value(
typename T::function,
bool) mark;
181 mln_dn_node_piter(T) n(tree);
183 if (mark(tree.parent(n)))
190 mln_postcondition(check_propagate_if(tree, a, prop, pred, v));
193 template <
typename T,
typename A,
typename P>
198 const desc_propagation& prop,
203 mln_precondition(a.is_valid());
204 mln_precondition(tree.f().domain() == a.domain());
206 mln_ch_value(
typename T::function,
bool) mark;
210 mln_dn_node_piter(T) n(tree);
212 if (mark(tree.parent(n)))
214 a(n) = a(tree.parent(n));
219 mln_postcondition(check_propagate_if(tree, a, prop, pred));
223 template <
typename T,
typename A,
typename P>
228 const asc_propagation& prop,
230 const mln_value(A)& v)
234 mln_precondition(a.is_valid());
235 mln_precondition(tree.f().domain() == a.domain());
237 mln_ch_value(
typename T::function,
bool) mark;
241 mln_up_node_piter(T) n(tree);
246 mark(tree.parent(n)) =
true;
249 mark(tree.parent(n)) =
true;
251 mln_postcondition(check_propagate_if(tree, a, prop, pred, v));
259 template <
typename T,
typename A,
typename W>
264 const way_of_propagation<W>& prop_,
265 const mln_value(A)& v,
266 const mln_value(A)& v_prop)
269 const W& prop =
exact(prop_);
275 template <
typename T,
typename A,
typename W>
280 const way_of_propagation<W>& prop_,
281 const mln_value(A)& v)
284 const W& prop =
exact(prop_);
290 template <
typename T,
typename A,
typename P,
typename W>
295 const way_of_propagation<W>& prop_,
296 const Function_v2b<P>& pred_,
297 const mln_value(A)& v)
300 const W& prop =
exact(prop_);
301 const P& pred =
exact(pred_);
307 template <
typename T,
typename A,
typename P>
312 const desc_propagation& prop,
313 const Function_v2b<P>& pred_)
316 const P& pred =
exact(pred_);
321 #endif // ! MLN_INCLUDE_ONLY
330 #endif // ! MLN_MORPHO_TREE_PROPAGATE_IF_HH