27 #ifndef MLN_MORPHO_TREE_DATA_HH
28 # define MLN_MORPHO_TREE_DATA_HH
35 # include <mln/morpho/tree/compute_parent.hh>
36 # include <mln/core/site_set/p_array.hh>
37 # include <mln/core/internal/site_set_iterator_base.hh>
38 # include <mln/core/internal/piter_identity.hh>
43 # define mln_up_site_piter(T) typename T::up_site_piter
44 # define mln_dn_site_piter(T) typename T::dn_site_piter
45 # define mln_up_node_piter(T) typename T::up_node_piter
46 # define mln_dn_node_piter(T) typename T::dn_node_piter
47 # define mln_up_leaf_piter(T) typename T::up_leaf_piter
48 # define mln_dn_leaf_piter(T) typename T::dn_leaf_piter
49 # define mln_site_piter(T) typename T::site_piter
50 # define mln_node_piter(T) typename T::node_piter
51 # define mln_leaf_piter(T) typename T::leaf_piter
52 # define mln_depth1st_piter(T) typename T::depth1st_piter
54 # define mln_up_site_piter_(T) T::up_site_piter
55 # define mln_dn_site_piter_(T) T::dn_site_piter
56 # define mln_up_node_piter_(T) T::up_node_piter
57 # define mln_dn_node_piter_(T) T::dn_node_piter
58 # define mln_up_leaf_piter_(T) T::up_leaf_piter
59 # define mln_dn_leaf_piter_(T) T::dn_leaf_piter
60 # define mln_site_piter_(T) T::site_piter
61 # define mln_node_piter_(T) T::node_piter
62 # define mln_leaf_piter_(T) T::leaf_piter
63 # define mln_depth1st_piter_(T) T::depth1st_piter
78 template <
typename T>
struct up_site_piter;
81 template <
typename T>
struct dn_site_piter;
85 template <
typename T>
struct up_node_piter;
89 template <
typename T>
struct dn_node_piter;
92 template <
typename T>
struct up_leaf_piter;
95 template <
typename T>
struct dn_leaf_piter;
98 template <
typename T>
class depth1st_piter;
101 template <
typename I,
typename S>
144 template <typename N>
158 mln_rvalue(I) f(const mln_psite(I)&
p) const;
165 mln_rvalue(parent_t) parent(const mln_psite(I)&
p) const;
172 mln_rvalue(children_t)
children(const mln_psite(I)&
p) const;
200 bool is_root(const mln_psite(I)&
p) const;
228 template <typename
T>
230 : public mln::internal::piter_identity_< typename
T::sites_t::
bkd_piter,
234 typedef typename T::sites_t::bkd_piter Pi_;
240 this->change_target(t.domain());
249 template <
typename T>
255 typedef typename T::sites_t::fwd_piter Pi_;
270 template <
typename T>
276 typedef typename T::nodes_t::fwd_piter Pi_;
291 template <
typename T>
297 typedef typename T::nodes_t::bkd_piter Pi_;
312 template <
typename T>
318 typedef typename T::leaves_t::fwd_piter Pi_;
333 template <
typename T>
339 typedef typename T::leaves_t::bkd_piter Pi_;
354 template <
typename T>
371 const mln_psite(T::function)&
p);
392 std::deque<mln_psite(T::function)>
stack_;
393 const mln_psite(T::function)*
root_;
400 template <
typename I,
typename S>
403 operator<< (std::ostream& os, const morpho::tree::data<I, S>& t);
406 # ifndef MLN_INCLUDE_ONLY
414 template <
typename I,
typename S>
417 const mln_ch_value(I, mln_psite(I))& parent,
428 template <
typename I,
typename S>
429 template <
typename N>
432 const Site_Set<S>& s,
433 const Neighborhood<N>& nbh)
438 const N& nbh_ =
exact(nbh);
444 template <
typename I,
typename S>
453 mln_bkd_piter(S)
p(s_);
456 if (f_(parent_(p)) != f_(p))
459 children_(parent_(p)).insert(p);
463 else if (parent_(p) == p)
471 mln_assertion(leaves_.nsites() > 0);
475 template <
typename I,
typename S>
477 mln_rvalue_(mln_ch_value(I, mln_psite(I)))
478 data<I,S>::parent(const mln_psite(I)& p)
const
480 mln_precondition(parent_.domain().has(p));
484 template <
typename I,
typename S>
486 const mln_ch_value(I, mln_psite(I))&
489 mln_precondition(is_valid());
493 template <
typename I,
typename S>
498 return parent_.is_valid();
501 template <
typename I,
typename S>
506 mln_precondition(is_valid());
507 mln_precondition(parent_.domain().has(p));
508 return parent_(p) ==
p;
512 template <
typename I,
typename S>
517 mln_precondition(is_valid());
518 mln_precondition(parent_.domain().has(p));
519 return parent_(p) == p || f_(parent_(p)) != f_(p);
522 template <
typename I,
typename S>
527 mln_precondition(is_valid());
528 mln_precondition(parent_.domain().has(p));
529 return f_(parent_(p)) != f_(p);
533 template <
typename I,
typename S>
538 mln_precondition(is_valid());
539 mln_precondition(children_.domain().has(p));
540 return children_(p).nsites() == 0;
543 template <
typename I,
typename S>
545 const p_array<mln_psite(I)>&
548 mln_precondition(is_valid());
552 template <
typename I,
typename S>
554 const p_array<mln_psite(I)>&
557 mln_precondition(is_valid());
561 template <
typename I,
typename S>
569 template <
typename I,
typename S>
577 template <
typename I,
typename S>
585 template <
typename I,
typename S>
588 data<I,S>::f(const mln_psite(I)& p)
const
593 template <
typename I,
typename S>
595 mln_rvalue_(mln_ch_value(I, p_array<mln_psite(I)>))
596 data<I,S>::children(const mln_psite(I)& p)
const
602 template <
typename I,
typename S>
604 const mln_ch_value(I, p_array<mln_psite(I)>)&
615 template <
typename T>
622 template <
typename T>
630 template <
typename T>
633 const mln_psite(T::function)& p)
636 mln_assertion(t.is_a_node(p));
640 template <
typename T>
645 return !stack_.empty();
648 template <
typename T>
656 template <
typename T>
662 stack_.push_back(mln_psite(T::function)());
665 stack_.push_back(*root_);
668 mln_dn_node_piter(
T) n(*s_);
670 for (n.start(); n.is_valid() && roots < s_->nroots(); n.next())
681 template <
typename T>
688 if (! this->is_valid())
693 mln_fwd_piter(T::nodes_t) child(s_->children(p_));
697 stack_.push_back(child);
701 template <
typename T>
706 while (stack_.size() != 1 && s_->parent(stack_.back()) == p_)
714 template <
typename I,
typename S>
717 operator<< (std::ostream& os, const morpho::tree::data<I, S>& t)
719 typedef morpho::tree::data<I, S> self_t;
722 typedef p_array<mln_psite(self_t)> A;
724 mln_ch_value(
typename self_t::function, A) content;
727 os << "Nodes:\tValue:\tPoints" << std::endl;
729 mln_up_site_piter(self_t) p(t);
733 os << p <<
"\t" << t.f(p) <<
"\t" << content(p) << std::endl;
737 content(t.parent(p)).insert(p);
741 typename self_t::depth1st_piter n(t);
742 mln_psite(self_t) old;
744 os << std::endl << "Hierarchy: " << std::endl;
750 for (old = n, n.next(); n.is_valid(); old = n, n.next())
752 if (old == t.parent(n))
755 os << old << std::endl
756 <<
"\t" << t.parent(n) <<
" <- ";
759 os << old << std::endl;
765 # endif // ! MLN_INCLUDE_ONLY
770 #endif // ! MLN_MORPHO_TREE_DATA_HH