26 #ifndef MLN_UTIL_TREE_FAST_HH
27 # define MLN_UTIL_TREE_FAST_HH
30 # include <mln/core/contract.hh>
61 unsigned size()
const;
68 bool has (T& elt)
const;
77 unsigned search (T& elt)
const;
84 bool is_root (
unsigned i)
const;
91 unsigned add_child (
unsigned i, T& elt);
98 unsigned add_parent (T& elt);
101 std::vector<T> data_;
104 std::vector<unsigned> parent_;
107 std::vector<std::vector<unsigned> > child_;
115 # ifndef MLN_INCLUDE_ONLY
117 template <
typename T>
119 tree_fast<T>::tree_fast()
123 template <
typename T>
125 tree_fast<T>::tree_fast(T& elt)
127 std::vector<unsigned> v;
128 data_.push_back(elt);
129 parent_.push_back(0);
134 template <
typename T>
137 tree_fast<T>::size()
const
139 return (data_.size ());
143 template <
typename T>
146 tree_fast<T>::has (T& elt)
const
148 for (
unsigned i = 0; i < data_.size (); ++i)
155 template <
typename T>
158 tree_fast<T>::search (T& elt)
const
160 for (
unsigned i = 0; i < data_.size (); ++i)
165 mln_assertion (
false);
166 return (
unsigned)(-1);
169 template <
typename T>
172 tree_fast<T>::is_root (
unsigned i)
const
177 template <
typename T>
180 tree_fast<T>::add_child (
unsigned i, T& elt)
182 mln_assertion (i < data_.size ());
183 std::vector<unsigned> v;
184 data_.push_back(elt);
185 parent_.push_back(i);
187 child_[i].push_back(data_.size () - 1);
188 return (data_.size () - 1);
191 template <
typename T>
194 tree_fast<T>::add_parent (T& elt)
196 data_.push_back(elt);
197 parent_.push_back(data_.size () - 1);
198 std::vector<unsigned> v;
201 parent_[root_] = data_.size () - 1;
202 root_ = data_.size () - 1;
203 return (data_.size () - 1);
209 # endif // ! MLN_INCLUDE_ONLY
216 #endif // ! MLN_UTIL_TREE_FAST_HH