10 #include <boost/array.hpp> 11 #include <boost/type_traits.hpp> 12 #include <boost/utility/enable_if.hpp> 39 template <
typename T, std::
size_t N >
53 template <
typename X >
class iterator_base;
67 std::size_t
size()
const {
return m_size; }
84 , std::size_t childNumber
93 , std::size_t childNumber
115 template <
typename T, std::
size_t N >
133 explicit Node(
const T & value) :
145 const T &
get()
const {
return m_value; }
146 T &
get() {
return m_value; }
181 template <
typename T, std::
size_t N >
183 template <
typename X >
187 typedef iterator_base<X> Self;
193 explicit iterator_base(X * pNode) : m_pNode(pNode) {}
198 const value_type &
operator*()
const {
return m_pNode->get(); }
199 const value_type * operator->()
const {
return &(m_pNode->get()); }
202 operator X*() {
return m_pNode; }
203 X * node()
const {
return m_pNode; }
207 static std::size_t nchildren() {
return N; }
211 X * child(std::size_t i)
const {
return this->node()->child(i); }
227 template <
typename T, std::
size_t N >
234 typedef iterator_base<const Node>
Base;
246 Self
child(std::size_t i)
const {
return Self(this->Base::child(i)); }
263 template <
typename T, std::
size_t N >
268 typedef iterator_base<Node>
Base;
276 iterator(
Node * p,
Node * parent, std::size_t branch) : Base(p), m_parent(parent), m_branch(branch) {}
287 return iterator(this->node()->child(i), this->node(), 0);
290 std::size_t
branch()
const {
return m_branch; }
294 value_type &
operator*() {
return this->m_pNode->get(); }
295 value_type *
operator->() {
return &(this->m_pNode->get()); }
305 std::size_t m_branch;
308 template <
typename T, std::
size_t N >
320 template <
typename T, std::
size_t N >
326 template <
typename T, std::
size_t N >
329 {
return const_iterator(m_root); }
331 template <
typename T, std::
size_t N >
334 {
return iterator(m_root, 0, 0); }
336 template <
typename T, std::
size_t N >
341 , std::size_t childNumber
344 {
return this->
addChild(parent.node(), childNumber, value); }
355 namespace treeFunctors
358 template <
typename TTreeIterator >
366 static bool left() {
return true; }
367 static bool right() {
return true; }
384 template <
typename TTreeIterator,
typename TTreeFunctor >
388 for (std::size_t i=0; i < iTree.nchildren(); ++i)
399 template <
typename TTreeIterator,
typename TTreeFunctor >
402 for (std::size_t i=0; i < iTree.nchildren(); ++i)
414 template <
typename TTreeIterator,
typename TTreeFunctor >
422 iTree = iTree.child(1);
430 template <
typename TTreeIterator,
typename TBFFunctor >
433 std::queue<TTreeIterator> newQ;
437 for (std::size_t i = 0; i < q.front().nchildren(); ++i)
439 if (q.front().child(i)) newQ.push(q.front().child(i));
458 template <
typename TTreeIterator,
typename TBFFunctor >
462 if (!&*iTree)
return;
465 std::queue<TTreeIterator> q;
480 template <
typename TIterator >
485 std::cout << *i <<
" , ";
489 std::cout <<
" [X] , ";
498 template <
typename T, std::
size_t N >
511 #endif //_BINARYTREE_H_
Base::value_type value_type
Node(const T &value)
Constructor with a single value: collect value and set branches to zero.
Base::value_type value_type
iterator(Node *p, Node *parent, std::size_t branch)
NaryTree()
Default constructor builds an emtpy tree.
std::size_t branch() const
Const iterator on n-ary trees.
const_iterator(const Node *p)
void print(const Affine< T > &a)
iterator_base< const Node > Base
void post_order_scan(TTreeIterator iTree, const TTreeFunctor &f)
Post-order scan.
void breadth_first(std::queue< TTreeIterator > q, const TBFFunctor &f)
Belongs to package Box Do not include directly, include til/Box.h instead.
void breadth_first(TTreeIterator iTree, const TBFFunctor &f)
Apply a functor in a breadth-first traversal order, starting from the iterator given in input...
value_type * operator->()
numeric_array< T, D > size(const Box< T, D > &box)
Return the size of a box.
void operator()(const TIterator &i) const
Self child(std::size_t i) const
Get an iterator on the i-th child.
Internal class used inside binary tree.
void operator()(iterator i) const
INLINE numeric_array< typename combine< T1, T2 >::type, 3 > operator*(const Affine< T1 > &a, const numeric_array< T2, 3 > &v)
Multiplication between a 3D affine transform and a 3D vector.
iterator_base< Node > Base
Node()
Default constructor, set everything to zero.
void pre_order_scan(TTreeIterator iTree, TTreeFunctor &f)
Pre-order scan.
void operator=(const T &value)
void operator()(const TTreeIterator &)
Node *& child(std::size_t i)
Returns a pointer on the n-th child.
iterator addChild(Node *parent, std::size_t childNumber, T value=T())
Add a child to a node.
Non-const iterator on n-ary trees.
Breadth-first tree functor to print out tree.
void in_order_scan(TTreeIterator iTree, const TTreeFunctor &f)
In-order scan.
static void nextLevel()
Function called at.
A class to represent an N-ary tree.
iterator child(std::size_t i) const
Convertion into a Node pointer.
const_iterator root() const
Return a const iterator on the root element of the tree.
Node * child(std::size_t i) const
Returns a pointer on the n-th child.
const T & operator()() const