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>
50 struct way_of_propagation : Object< W > {
protected: way_of_propagation() {}; };
51 struct desc_propagation : way_of_propagation <desc_propagation> {};
52 struct asc_propagation : way_of_propagation <asc_propagation> {};
65 template <
typename T,
typename A,
typename P,
typename W>
70 const way_of_propagation<W>& prop_,
71 const Function_v2b<P>& pred_,
72 const mln_value(A)& v);
75 template <
typename T,
typename A,
typename P>
80 const desc_propagation& prop_,
81 const Function_v2b<P>& pred_);
94 template <
typename T,
typename A,
typename W>
97 propagate_if_value(
const T& tree,
99 const way_of_propagation<W>& prop_,
100 const mln_value(A)& v,
101 const mln_value(A)& v_prop);
104 template <
typename T,
typename A,
typename W>
107 propagate_if_value(
const T& tree,
109 const way_of_propagation<W>& prop,
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,
122 const asc_propagation& prop,
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,
137 const desc_propagation& prop,
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,
152 const desc_propagation& prop,
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>
168 const desc_propagation& prop,
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;
178 initialize(mark, tree.f());
179 mln::
data::fill(mark, false);
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;
207 initialize(mark, tree.f());
208 mln::
data::fill(mark, false);
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;
238 initialize(mark, tree.f());
239 mln::
data::fill(mark, false);
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>
262 propagate_if_value(
const T& tree,
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_);
271 internal::propagate_if(tree, a, prop, pw::value(a) == pw::cst(v), v_prop);
275 template <
typename T,
typename A,
typename W>
278 propagate_if_value(
const T& tree,
280 const way_of_propagation<W>& prop_,
281 const mln_value(A)& v)
284 const W& prop = exact(prop_);
286 internal::propagate_if(tree, a, prop, pw::value(a) == pw::cst(v), v);
290 template <
typename T,
typename A,
typename P,
typename W>
295 const way_of_propagation<W>& prop_,
297 const mln_value(A)& v)
300 const W& prop = exact(prop_);
301 const P& pred = exact(pred_);
303 internal::propagate_if(tree, a, prop, pred, v);
307 template <
typename T,
typename A,
typename P>
312 const desc_propagation& prop,
316 const P& pred = exact(pred_);
318 internal::propagate_if(tree, a, prop, pred);
321 #endif // ! MLN_INCLUDE_ONLY
330 #endif // ! MLN_MORPHO_TREE_PROPAGATE_IF_HH