26 #ifndef MLN_UTIL_TREE_HH
27 # define MLN_UTIL_TREE_HH
33 # include <mln/core/contract.hh>
50 template <
typename T>
class tree;
51 template <
typename T>
class branch;
62 typedef std::vector< tree_node<T>* > children_t;
148 void print(std::ostream& ostr,
int level = 0);
178 std::vector< tree_node<T>* > child_;
186 template <
typename T>
248 template <
typename T>
281 # ifndef MLN_INCLUDE_ONLY
283 template <
typename T>
290 template <
typename T>
295 mln_assertion (root != 0);
298 template <
typename T>
306 template <
typename T>
314 template <
typename T>
325 template <
typename T>
331 root_->child_.push_back (n);
335 template <
typename T>
340 return root()->check_consistency ();
343 template <
typename T>
350 template <
typename T>
358 template <
typename T>
366 template <
typename T>
375 template <
typename T>
377 std::vector< tree_node<T>* >&
383 template <
typename T>
385 const std::vector< tree_node<T>* >&
391 template <
typename T>
399 this->child_.push_back(s);
404 template <
typename T>
409 if (tree_node->parent_)
412 it != tree_node->
parent()->children().end(); ++it)
413 if ((*it) == tree_node)
415 tree_node->
parent()->children().erase(it);
419 tree_node->parent_ =
this;
420 this->children().push_back(tree_node);
424 template <
typename T>
429 mln_assertion(parent_ != 0);
432 typename std::vector<tree_node<T>* >::iterator it = parent_->children().begin();
433 for (; it < parent_->children().end(); ++it)
436 parent_->children().erase(it);
440 for (
typename std::vector<
tree_node<T>* >::iterator it = this->child_.begin();
441 it != this->child_.end(); ++it)
442 parent_->add_child(*it);
446 template <
typename T>
451 ostr << level << std::endl;
453 ostr <<
" elt " << this->elt() << std::endl;
456 for (
typename std::vector<
tree_node<T>* >::iterator it = this->child_.begin();
457 it != this->child_.end(); ++it)
459 (*it)->print(level + 1);
464 template <
typename T>
469 mln_assertion(parent != 0);
471 parent->child_.push_back(
this);
474 template <
typename T>
482 template <
typename T>
487 if (elt == this->elt_)
494 for (
typename std::vector<
tree_node<T>* >::iterator it = this->child_.begin();
495 it != this->child_.end(); ++it)
497 if ((**it).search_rec(res, elt))
504 template <
typename T>
511 if (search_rec(&res, elt))
516 template <
typename T>
521 for (
typename std::vector<
tree_node<T>* >::iterator it = this->child_.begin();
522 it != this->child_.end(); ++it)
524 if ((**it).parent() !=
this)
527 if (!((**it).check_consistency()))
535 template <
typename T>
545 template <
typename T>
553 template <
typename T>
561 # endif // ! MLN_INCLUDE_ONLY
569 #endif // ! MLN_UTIL_TREE_HH