2 // STL-like templated tree class.
4 // Copyright (C) 2001-2009 Kasper Peeters <kasper.peeters@aei.mpg.de>
5 // Distributed under the GNU General Public License version 3,
6 // (eventually to be changed to the Boost Software License).
12 \see http://www.aei.mpg.de/~peekas/tree/
13 \see http://www.aei.mpg.de/~peekas/tree/ChangeLog
15 The tree.hh library for C++ provides an STL-like container class
16 for n-ary trees, templated over the data stored at the
17 nodes. Various types of iterators are provided (post-order,
18 pre-order, and others). Where possible the access methods are
19 compatible with the STL or alternative algorithms are
35 // HP-style construct/destroy have gone from the standard,
40 template <class T1
, class T2
>
41 void constructor(T1
* p
, T2
& val
)
43 new ((void *) p
) T1(val
);
47 void constructor(T1
* p
)
53 void destructor(T1
* p
)
60 /// A node in the tree, combining links to other nodes as well as the actual data.
62 class tree_node_
{ // size: 5*4=20 bytes (on 32 bit arch), can be reduced by 8.
64 tree_node_
<T
> *parent
;
65 tree_node_
<T
> *first_child
, *last_child
;
66 tree_node_
<T
> *prev_sibling
, *next_sibling
;
68 }; // __attribute__((packed));
70 template <class T
, class tree_node_allocator
= std::allocator
<tree_node_
<T
> > >
73 typedef tree_node_
<T
> tree_node
;
75 /// Value of the data stored at a node.
79 class pre_order_iterator
;
80 class post_order_iterator
;
81 class sibling_iterator
;
86 tree(const iterator_base
&);
87 tree(const tree
<T
, tree_node_allocator
>&);
89 void operator=(const tree
<T
, tree_node_allocator
>&);
91 /// Base class for iterators, only pointers stored, no traversal logic.
93 class iterator_base
: public stlport::bidirectional_iterator
<T
, ptrdiff_t> {
100 typedef T
& reference
;
101 typedef size_t size_type
;
102 typedef ptrdiff_t difference_type
;
103 typedef std::bidirectional_iterator_tag iterator_category
;
106 iterator_base(tree_node
*);
108 T
& operator*() const;
109 T
* operator->() const;
111 /// When called, the next increment/decrement skips children of this node.
112 void skip_children();
113 void skip_children(bool skip
);
114 /// Number of children of the node pointed to by the iterator.
115 unsigned int number_of_children() const;
117 sibling_iterator
begin() const;
118 sibling_iterator
end() const;
122 bool skip_current_children_
;
125 /// Depth-first iterator, first accessing the node, then its children.
126 class pre_order_iterator
: public iterator_base
{
128 pre_order_iterator();
129 pre_order_iterator(tree_node
*);
130 pre_order_iterator(const iterator_base
&);
131 pre_order_iterator(const sibling_iterator
&);
133 bool operator==(const pre_order_iterator
&) const;
134 bool operator!=(const pre_order_iterator
&) const;
135 pre_order_iterator
& operator++();
136 pre_order_iterator
& operator--();
137 pre_order_iterator
operator++(int);
138 pre_order_iterator
operator--(int);
139 pre_order_iterator
& operator+=(unsigned int);
140 pre_order_iterator
& operator-=(unsigned int);
143 /// Depth-first iterator, first accessing the children, then the node itself.
144 class post_order_iterator
: public iterator_base
{
146 post_order_iterator();
147 post_order_iterator(tree_node
*);
148 post_order_iterator(const iterator_base
&);
149 post_order_iterator(const sibling_iterator
&);
151 bool operator==(const post_order_iterator
&) const;
152 bool operator!=(const post_order_iterator
&) const;
153 post_order_iterator
& operator++();
154 post_order_iterator
& operator--();
155 post_order_iterator
operator++(int);
156 post_order_iterator
operator--(int);
157 post_order_iterator
& operator+=(unsigned int);
158 post_order_iterator
& operator-=(unsigned int);
160 /// Set iterator to the first child as deep as possible down the tree.
164 /// Breadth-first iterator, using a queue
165 class breadth_first_queued_iterator
: public iterator_base
{
167 breadth_first_queued_iterator();
168 breadth_first_queued_iterator(tree_node
*);
169 breadth_first_queued_iterator(const iterator_base
&);
171 bool operator==(const breadth_first_queued_iterator
&) const;
172 bool operator!=(const breadth_first_queued_iterator
&) const;
173 breadth_first_queued_iterator
& operator++();
174 breadth_first_queued_iterator
operator++(int);
175 breadth_first_queued_iterator
& operator+=(unsigned int);
178 std::queue
<tree_node
*> traversal_queue
;
181 /// The default iterator types throughout the tree class.
182 typedef pre_order_iterator iterator
;
183 typedef breadth_first_queued_iterator breadth_first_iterator
;
185 /// Iterator which traverses only the nodes at a given depth from the root.
186 class fixed_depth_iterator
: public iterator_base
{
188 fixed_depth_iterator();
189 fixed_depth_iterator(tree_node
*);
190 fixed_depth_iterator(const iterator_base
&);
191 fixed_depth_iterator(const sibling_iterator
&);
192 fixed_depth_iterator(const fixed_depth_iterator
&);
194 bool operator==(const fixed_depth_iterator
&) const;
195 bool operator!=(const fixed_depth_iterator
&) const;
196 fixed_depth_iterator
& operator++();
197 fixed_depth_iterator
& operator--();
198 fixed_depth_iterator
operator++(int);
199 fixed_depth_iterator
operator--(int);
200 fixed_depth_iterator
& operator+=(unsigned int);
201 fixed_depth_iterator
& operator-=(unsigned int);
206 /// Iterator which traverses only the nodes which are siblings of each other.
207 class sibling_iterator
: public iterator_base
{
210 sibling_iterator(tree_node
*);
211 sibling_iterator(const sibling_iterator
&);
212 sibling_iterator(const iterator_base
&);
214 bool operator==(const sibling_iterator
&) const;
215 bool operator!=(const sibling_iterator
&) const;
216 sibling_iterator
& operator++();
217 sibling_iterator
& operator--();
218 sibling_iterator
operator++(int);
219 sibling_iterator
operator--(int);
220 sibling_iterator
& operator+=(unsigned int);
221 sibling_iterator
& operator-=(unsigned int);
223 tree_node
*range_first() const;
224 tree_node
*range_last() const;
230 /// Iterator which traverses only the leaves.
231 class leaf_iterator
: public iterator_base
{
234 leaf_iterator(tree_node
*, tree_node
*top
=0);
235 leaf_iterator(const sibling_iterator
&);
236 leaf_iterator(const iterator_base
&);
238 bool operator==(const leaf_iterator
&) const;
239 bool operator!=(const leaf_iterator
&) const;
240 leaf_iterator
& operator++();
241 leaf_iterator
& operator--();
242 leaf_iterator
operator++(int);
243 leaf_iterator
operator--(int);
244 leaf_iterator
& operator+=(unsigned int);
245 leaf_iterator
& operator-=(unsigned int);
250 /// Return iterator to the beginning of the tree.
251 inline pre_order_iterator
begin() const;
252 /// Return iterator to the end of the tree.
253 inline pre_order_iterator
end() const;
254 /// Return post-order iterator to the beginning of the tree.
255 post_order_iterator
begin_post() const;
256 /// Return post-order end iterator of the tree.
257 post_order_iterator
end_post() const;
258 /// Return fixed-depth iterator to the first node at a given depth from the given iterator.
259 fixed_depth_iterator
begin_fixed(const iterator_base
&, unsigned int) const;
260 /// Return fixed-depth end iterator.
261 fixed_depth_iterator
end_fixed(const iterator_base
&, unsigned int) const;
262 /// Return breadth-first iterator to the first node at a given depth.
263 breadth_first_queued_iterator
begin_breadth_first() const;
264 /// Return breadth-first end iterator.
265 breadth_first_queued_iterator
end_breadth_first() const;
266 /// Return sibling iterator to the first child of given node.
267 sibling_iterator
begin(const iterator_base
&) const;
268 /// Return sibling end iterator for children of given node.
269 sibling_iterator
end(const iterator_base
&) const;
270 /// Return leaf iterator to the first leaf of the tree.
271 leaf_iterator
begin_leaf() const;
272 /// Return leaf end iterator for entire tree.
273 leaf_iterator
end_leaf() const;
274 /// Return leaf iterator to the first leaf of the subtree at the given node.
275 leaf_iterator
begin_leaf(const iterator_base
& top
) const;
276 /// Return leaf end iterator for the subtree at the given node.
277 leaf_iterator
end_leaf(const iterator_base
& top
) const;
279 /// Return iterator to the parent of a node.
280 template<typename iter
> static iter
parent(iter
);
281 /// Return iterator to the previous sibling of a node.
282 template<typename iter
> iter
previous_sibling(iter
) const;
283 /// Return iterator to the next sibling of a node.
284 template<typename iter
> iter
next_sibling(iter
) const;
285 /// Return iterator to the next node at a given depth.
286 template<typename iter
> iter
next_at_same_depth(iter
) const;
288 /// Erase all nodes of the tree.
290 /// Erase element at position pointed to by iterator, return incremented iterator.
291 template<typename iter
> iter
erase(iter
);
292 /// Erase all children of the node pointed to by iterator.
293 void erase_children(const iterator_base
&);
295 /// Insert empty node as last/first child of node pointed to by position.
296 template<typename iter
> iter
append_child(iter position
);
297 template<typename iter
> iter
prepend_child(iter position
);
298 /// Insert node as last/first child of node pointed to by position.
299 template<typename iter
> iter
append_child(iter position
, const T
& x
);
300 template<typename iter
> iter
prepend_child(iter position
, const T
& x
);
301 /// Append the node (plus its children) at other_position as last/first child of position.
302 template<typename iter
> iter
append_child(iter position
, iter other_position
);
303 template<typename iter
> iter
prepend_child(iter position
, iter other_position
);
304 /// Append the nodes in the from-to range (plus their children) as last/first children of position.
305 template<typename iter
> iter
append_children(iter position
, sibling_iterator from
, sibling_iterator to
);
306 template<typename iter
> iter
prepend_children(iter position
, sibling_iterator from
, sibling_iterator to
);
308 /// Short-hand to insert topmost node in otherwise empty tree.
309 pre_order_iterator
set_head(const T
& x
);
310 /// Insert node as previous sibling of node pointed to by position.
311 template<typename iter
> iter
insert(iter position
, const T
& x
);
312 /// Specialisation of previous member.
313 sibling_iterator
insert(sibling_iterator position
, const T
& x
);
314 /// Insert node (with children) pointed to by subtree as previous sibling of node pointed to by position.
315 template<typename iter
> iter
insert_subtree(iter position
, const iterator_base
& subtree
);
316 /// Insert node as next sibling of node pointed to by position.
317 template<typename iter
> iter
insert_after(iter position
, const T
& x
);
318 /// Insert node (with children) pointed to by subtree as next sibling of node pointed to by position.
319 template<typename iter
> iter
insert_subtree_after(iter position
, const iterator_base
& subtree
);
321 /// Replace node at 'position' with other node (keeping same children); 'position' becomes invalid.
322 template<typename iter
> iter
replace(iter position
, const T
& x
);
323 /// Replace node at 'position' with subtree starting at 'from' (do not erase subtree at 'from'); see above.
324 template<typename iter
> iter
replace(iter position
, const iterator_base
& from
);
325 /// Replace string of siblings (plus their children) with copy of a new string (with children); see above
326 sibling_iterator
replace(sibling_iterator orig_begin
, sibling_iterator orig_end
,
327 sibling_iterator new_begin
, sibling_iterator new_end
);
329 /// Move all children of node at 'position' to be siblings, returns position.
330 template<typename iter
> iter
flatten(iter position
);
331 /// Move nodes in range to be children of 'position'.
332 template<typename iter
> iter
reparent(iter position
, sibling_iterator begin
, sibling_iterator end
);
333 /// Move all child nodes of 'from' to be children of 'position'.
334 template<typename iter
> iter
reparent(iter position
, iter from
);
336 /// Replace node with a new node, making the old node a child of the new node.
337 template<typename iter
> iter
wrap(iter position
, const T
& x
);
339 /// Move 'source' node (plus its children) to become the next sibling of 'target'.
340 template<typename iter
> iter
move_after(iter target
, iter source
);
341 /// Move 'source' node (plus its children) to become the previous sibling of 'target'.
342 template<typename iter
> iter
move_before(iter target
, iter source
);
343 sibling_iterator
move_before(sibling_iterator target
, sibling_iterator source
);
344 /// Move 'source' node (plus its children) to become the node at 'target' (erasing the node at 'target').
345 template<typename iter
> iter
move_ontop(iter target
, iter source
);
347 /// Merge with other tree, creating new branches and leaves only if they are not already present.
348 void merge(sibling_iterator
, sibling_iterator
, sibling_iterator
, sibling_iterator
,
349 bool duplicate_leaves
=false);
350 /// Sort (std::sort only moves values of nodes, this one moves children as well).
351 void sort(sibling_iterator from
, sibling_iterator to
, bool deep
=false);
352 template<class StrictWeakOrdering
>
353 void sort(sibling_iterator from
, sibling_iterator to
, StrictWeakOrdering comp
, bool deep
=false);
354 /// Compare two ranges of nodes (compares nodes as well as tree structure).
355 template<typename iter
>
356 bool equal(const iter
& one
, const iter
& two
, const iter
& three
) const;
357 template<typename iter
, class BinaryPredicate
>
358 bool equal(const iter
& one
, const iter
& two
, const iter
& three
, BinaryPredicate
) const;
359 template<typename iter
>
360 bool equal_subtree(const iter
& one
, const iter
& two
) const;
361 template<typename iter
, class BinaryPredicate
>
362 bool equal_subtree(const iter
& one
, const iter
& two
, BinaryPredicate
) const;
363 /// Extract a new tree formed by the range of siblings plus all their children.
364 tree
subtree(sibling_iterator from
, sibling_iterator to
) const;
365 void subtree(tree
&, sibling_iterator from
, sibling_iterator to
) const;
366 /// Exchange the node (plus subtree) with its sibling node (do nothing if no sibling present).
367 void swap(sibling_iterator it
);
368 /// Exchange two nodes (plus subtrees)
369 void swap(iterator
, iterator
);
371 /// Count the total number of nodes.
373 /// Count the total number of nodes below the indicated node (plus one).
374 size_t size(const iterator_base
&) const;
375 /// Check if tree is empty.
377 /// Compute the depth to the root or to a fixed other iterator.
378 static int depth(const iterator_base
&);
379 static int depth(const iterator_base
&, const iterator_base
&);
380 /// Determine the maximal depth of the tree. An empty tree has max_depth=-1.
381 int max_depth() const;
382 /// Determine the maximal depth of the tree with top node at the given position.
383 int max_depth(const iterator_base
&) const;
384 /// Count the number of children of node at position.
385 static unsigned int number_of_children(const iterator_base
&);
386 /// Count the number of siblings (left and right) of node at iterator. Total nodes at this level is +1.
387 unsigned int number_of_siblings(const iterator_base
&) const;
388 /// Determine whether node at position is in the subtrees with root in the range.
389 bool is_in_subtree(const iterator_base
& position
, const iterator_base
& begin
,
390 const iterator_base
& end
) const;
391 /// Determine whether the iterator is an 'end' iterator and thus not actually pointing to a node.
392 bool is_valid(const iterator_base
&) const;
394 /// Determine the index of a node in the range of siblings to which it belongs.
395 unsigned int index(sibling_iterator it
) const;
396 /// Inverse of 'index': return the n-th child of the node at position.
397 static sibling_iterator
child(const iterator_base
& position
, unsigned int);
398 /// Return iterator to the sibling indicated by index
399 sibling_iterator
sibling(const iterator_base
& position
, unsigned int);
401 /// Comparator class for iterators (compares pointer values; why doesn't this work automatically?)
402 class iterator_base_less
{
404 bool operator()(const typename tree
<T
, tree_node_allocator
>::iterator_base
& one
,
405 const typename tree
<T
, tree_node_allocator
>::iterator_base
& two
) const
407 return one
.node
< two
.node
;
410 tree_node
*head
, *feet
; // head/feet are always dummy; if an iterator points to them it is invalid
412 tree_node_allocator alloc_
;
413 void head_initialise_();
414 void copy_(const tree
<T
, tree_node_allocator
>& other
);
416 /// Comparator class for two nodes of a tree (used for sorting and searching).
417 template<class StrictWeakOrdering
>
418 class compare_nodes
{
420 compare_nodes(StrictWeakOrdering comp
) : comp_(comp
) {};
422 bool operator()(const tree_node
*a
, const tree_node
*b
)
424 return comp_(a
->data
, b
->data
);
427 StrictWeakOrdering comp_
;
431 //template <class T, class tree_node_allocator>
432 //class iterator_base_less {
434 // bool operator()(const typename tree<T, tree_node_allocator>::iterator_base& one,
435 // const typename tree<T, tree_node_allocator>::iterator_base& two) const
437 // txtout << "operatorclass<" << one.node < two.node << std::endl;
438 // return one.node < two.node;
442 // template <class T, class tree_node_allocator>
443 // bool operator<(const typename tree<T, tree_node_allocator>::iterator& one,
444 // const typename tree<T, tree_node_allocator>::iterator& two)
446 // txtout << "operator< " << one.node < two.node << std::endl;
447 // if(one.node < two.node) return true;
451 // template <class T, class tree_node_allocator>
452 // bool operator==(const typename tree<T, tree_node_allocator>::iterator& one,
453 // const typename tree<T, tree_node_allocator>::iterator& two)
455 // txtout << "operator== " << one.node == two.node << std::endl;
456 // if(one.node == two.node) return true;
460 // template <class T, class tree_node_allocator>
461 // bool operator>(const typename tree<T, tree_node_allocator>::iterator_base& one,
462 // const typename tree<T, tree_node_allocator>::iterator_base& two)
464 // txtout << "operator> " << one.node < two.node << std::endl;
465 // if(one.node > two.node) return true;
473 template <class T
, class tree_node_allocator
>
474 tree
<T
, tree_node_allocator
>::tree()
479 template <class T
, class tree_node_allocator
>
480 tree
<T
, tree_node_allocator
>::tree(const T
& x
)
486 template <class T
, class tree_node_allocator
>
487 tree
<T
, tree_node_allocator
>::tree(const iterator_base
& other
)
491 replace(begin(), other
);
494 template <class T
, class tree_node_allocator
>
495 tree
<T
, tree_node_allocator
>::~tree()
498 alloc_
.deallocate(head
,1);
499 alloc_
.deallocate(feet
,1);
502 template <class T
, class tree_node_allocator
>
503 void tree
<T
, tree_node_allocator
>::head_initialise_()
505 head
= alloc_
.allocate(1,0); // MSVC does not have default second argument
506 feet
= alloc_
.allocate(1,0);
511 head
->prev_sibling
=0; //head;
512 head
->next_sibling
=feet
; //head;
517 feet
->prev_sibling
=head
;
518 feet
->next_sibling
=0;
521 template <class T
, class tree_node_allocator
>
522 void tree
<T
, tree_node_allocator
>::operator=(const tree
<T
, tree_node_allocator
>& other
)
527 template <class T
, class tree_node_allocator
>
528 tree
<T
, tree_node_allocator
>::tree(const tree
<T
, tree_node_allocator
>& other
)
534 template <class T
, class tree_node_allocator
>
535 void tree
<T
, tree_node_allocator
>::copy_(const tree
<T
, tree_node_allocator
>& other
)
538 pre_order_iterator it
=other
.begin(), to
=begin();
539 while(it
!=other
.end()) {
540 to
=insert(to
, (*it
));
546 while(it
!=other
.end()) {
555 template <class T
, class tree_node_allocator
>
556 void tree
<T
, tree_node_allocator
>::clear()
559 while(head
->next_sibling
!=feet
)
560 erase(pre_order_iterator(head
->next_sibling
));
563 template<class T
, class tree_node_allocator
>
564 void tree
<T
, tree_node_allocator
>::erase_children(const iterator_base
& it
)
566 // std::cout << "erase_children " << it.node << std::endl;
567 if(it
.node
==0) return;
569 tree_node
*cur
=it
.node
->first_child
;
574 cur
=cur
->next_sibling
;
575 erase_children(pre_order_iterator(prev
));
576 kp::destructor(&prev
->data
);
577 alloc_
.deallocate(prev
,1);
579 it
.node
->first_child
=0;
580 it
.node
->last_child
=0;
581 // std::cout << "exit" << std::endl;
584 template<class T
, class tree_node_allocator
>
586 iter tree
<T
, tree_node_allocator
>::erase(iter it
)
588 tree_node
*cur
=it
.node
;
594 if(cur
->prev_sibling
==0) {
595 cur
->parent
->first_child
=cur
->next_sibling
;
598 cur
->prev_sibling
->next_sibling
=cur
->next_sibling
;
600 if(cur
->next_sibling
==0) {
601 cur
->parent
->last_child
=cur
->prev_sibling
;
604 cur
->next_sibling
->prev_sibling
=cur
->prev_sibling
;
607 kp::destructor(&cur
->data
);
608 alloc_
.deallocate(cur
,1);
612 template <class T
, class tree_node_allocator
>
613 typename tree
<T
, tree_node_allocator
>::pre_order_iterator tree
<T
, tree_node_allocator
>::begin() const
615 return pre_order_iterator(head
->next_sibling
);
618 template <class T
, class tree_node_allocator
>
619 typename tree
<T
, tree_node_allocator
>::pre_order_iterator tree
<T
, tree_node_allocator
>::end() const
621 return pre_order_iterator(feet
);
624 template <class T
, class tree_node_allocator
>
625 typename tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator tree
<T
, tree_node_allocator
>::begin_breadth_first() const
627 return breadth_first_queued_iterator(head
->next_sibling
);
630 template <class T
, class tree_node_allocator
>
631 typename tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator tree
<T
, tree_node_allocator
>::end_breadth_first() const
633 return breadth_first_queued_iterator();
636 template <class T
, class tree_node_allocator
>
637 typename tree
<T
, tree_node_allocator
>::post_order_iterator tree
<T
, tree_node_allocator
>::begin_post() const
639 tree_node
*tmp
=head
->next_sibling
;
641 while(tmp
->first_child
)
642 tmp
=tmp
->first_child
;
644 return post_order_iterator(tmp
);
647 template <class T
, class tree_node_allocator
>
648 typename tree
<T
, tree_node_allocator
>::post_order_iterator tree
<T
, tree_node_allocator
>::end_post() const
650 return post_order_iterator(feet
);
653 template <class T
, class tree_node_allocator
>
654 typename tree
<T
, tree_node_allocator
>::fixed_depth_iterator tree
<T
, tree_node_allocator
>::begin_fixed(const iterator_base
& pos
, unsigned int dp
) const
656 typename tree
<T
, tree_node_allocator
>::fixed_depth_iterator ret
;
657 ret
.top_node
=pos
.node
;
659 tree_node
*tmp
=pos
.node
;
660 unsigned int curdepth
=0;
661 while(curdepth
<dp
) { // go down one level
662 while(tmp
->first_child
==0) {
663 if(tmp
->next_sibling
==0) {
664 // try to walk up and then right again
666 if(tmp
==ret
.top_node
)
667 throw std::range_error("tree: begin_fixed out of range");
670 throw std::range_error("tree: begin_fixed out of range");
672 } while(tmp
->next_sibling
==0);
674 tmp
=tmp
->next_sibling
;
676 tmp
=tmp
->first_child
;
684 template <class T
, class tree_node_allocator
>
685 typename tree
<T
, tree_node_allocator
>::fixed_depth_iterator tree
<T
, tree_node_allocator
>::end_fixed(const iterator_base
& pos
, unsigned int dp
) const
687 assert(1==0); // FIXME: not correct yet: use is_valid() as a temporary workaround
688 tree_node
*tmp
=pos
.node
;
689 unsigned int curdepth
=1;
690 while(curdepth
<dp
) { // go down one level
691 while(tmp
->first_child
==0) {
692 tmp
=tmp
->next_sibling
;
694 throw std::range_error("tree: end_fixed out of range");
696 tmp
=tmp
->first_child
;
702 template <class T
, class tree_node_allocator
>
703 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::begin(const iterator_base
& pos
) const
706 if(pos
.node
->first_child
==0) {
709 return pos
.node
->first_child
;
712 template <class T
, class tree_node_allocator
>
713 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::end(const iterator_base
& pos
) const
715 sibling_iterator
ret(0);
716 ret
.parent_
=pos
.node
;
720 template <class T
, class tree_node_allocator
>
721 typename tree
<T
, tree_node_allocator
>::leaf_iterator tree
<T
, tree_node_allocator
>::begin_leaf() const
723 tree_node
*tmp
=head
->next_sibling
;
725 while(tmp
->first_child
)
726 tmp
=tmp
->first_child
;
728 return leaf_iterator(tmp
);
731 template <class T
, class tree_node_allocator
>
732 typename tree
<T
, tree_node_allocator
>::leaf_iterator tree
<T
, tree_node_allocator
>::end_leaf() const
734 return leaf_iterator(feet
);
737 template <class T
, class tree_node_allocator
>
738 typename tree
<T
, tree_node_allocator
>::leaf_iterator tree
<T
, tree_node_allocator
>::begin_leaf(const iterator_base
& top
) const
740 tree_node
*tmp
=top
.node
;
741 while(tmp
->first_child
)
742 tmp
=tmp
->first_child
;
743 return leaf_iterator(tmp
, top
.node
);
746 template <class T
, class tree_node_allocator
>
747 typename tree
<T
, tree_node_allocator
>::leaf_iterator tree
<T
, tree_node_allocator
>::end_leaf(const iterator_base
& top
) const
749 return leaf_iterator(top
.node
, top
.node
);
752 template <class T
, class tree_node_allocator
>
753 template <typename iter
>
754 iter tree
<T
, tree_node_allocator
>::parent(iter position
)
756 assert(position
.node
!=0);
757 return iter(position
.node
->parent
);
760 template <class T
, class tree_node_allocator
>
761 template <typename iter
>
762 iter tree
<T
, tree_node_allocator
>::previous_sibling(iter position
) const
764 assert(position
.node
!=0);
766 ret
.node
=position
.node
->prev_sibling
;
770 template <class T
, class tree_node_allocator
>
771 template <typename iter
>
772 iter tree
<T
, tree_node_allocator
>::next_sibling(iter position
) const
774 assert(position
.node
!=0);
776 ret
.node
=position
.node
->next_sibling
;
780 template <class T
, class tree_node_allocator
>
781 template <typename iter
>
782 iter tree
<T
, tree_node_allocator
>::next_at_same_depth(iter position
) const
784 // We make use of a temporary fixed_depth iterator to implement this.
786 typename tree
<T
, tree_node_allocator
>::fixed_depth_iterator
tmp(position
.node
);
791 // assert(position.node!=0);
792 // iter ret(position);
794 // if(position.node->next_sibling) {
795 // ret.node=position.node->next_sibling;
798 // int relative_depth=0;
801 // ret.node=ret.node->parent;
802 // if(ret.node==0) return ret;
804 // } while(ret.node->next_sibling==0);
806 // ret.node=ret.node->next_sibling;
807 // while(ret.node->first_child==0) {
808 // if(ret.node->next_sibling==0)
810 // ret.node=ret.node->next_sibling;
811 // if(ret.node==0) return ret;
813 // while(relative_depth<0 && ret.node->first_child!=0) {
814 // ret.node=ret.node->first_child;
817 // if(relative_depth<0) {
818 // if(ret.node->next_sibling==0) goto upper;
825 template <class T
, class tree_node_allocator
>
826 template <typename iter
>
827 iter tree
<T
, tree_node_allocator
>::append_child(iter position
)
829 assert(position
.node
!=head
);
830 assert(position
.node
);
832 tree_node
*tmp
=alloc_
.allocate(1,0);
833 kp::constructor(&tmp
->data
);
837 tmp
->parent
=position
.node
;
838 if(position
.node
->last_child
!=0) {
839 position
.node
->last_child
->next_sibling
=tmp
;
842 position
.node
->first_child
=tmp
;
844 tmp
->prev_sibling
=position
.node
->last_child
;
845 position
.node
->last_child
=tmp
;
850 template <class T
, class tree_node_allocator
>
851 template <typename iter
>
852 iter tree
<T
, tree_node_allocator
>::prepend_child(iter position
)
854 assert(position
.node
!=head
);
855 assert(position
.node
);
857 tree_node
*tmp
=alloc_
.allocate(1,0);
858 kp::constructor(&tmp
->data
);
862 tmp
->parent
=position
.node
;
863 if(position
.node
->first_child
!=0) {
864 position
.node
->first_child
->prev_sibling
=tmp
;
867 position
.node
->last_child
=tmp
;
869 tmp
->next_sibling
=position
.node
->first_child
;
870 position
.node
->prev_child
=tmp
;
875 template <class T
, class tree_node_allocator
>
876 template <class iter
>
877 iter tree
<T
, tree_node_allocator
>::append_child(iter position
, const T
& x
)
879 // If your program fails here you probably used 'append_child' to add the top
880 // node to an empty tree. From version 1.45 the top element should be added
881 // using 'insert'. See the documentation for further information, and sorry about
883 assert(position
.node
!=head
);
884 assert(position
.node
);
886 tree_node
* tmp
= alloc_
.allocate(1,0);
887 kp::constructor(&tmp
->data
, x
);
891 tmp
->parent
=position
.node
;
892 if(position
.node
->last_child
!=0) {
893 position
.node
->last_child
->next_sibling
=tmp
;
896 position
.node
->first_child
=tmp
;
898 tmp
->prev_sibling
=position
.node
->last_child
;
899 position
.node
->last_child
=tmp
;
904 template <class T
, class tree_node_allocator
>
905 template <class iter
>
906 iter tree
<T
, tree_node_allocator
>::prepend_child(iter position
, const T
& x
)
908 assert(position
.node
!=head
);
909 assert(position
.node
);
911 tree_node
* tmp
= alloc_
.allocate(1,0);
912 kp::constructor(&tmp
->data
, x
);
916 tmp
->parent
=position
.node
;
917 if(position
.node
->first_child
!=0) {
918 position
.node
->first_child
->prev_sibling
=tmp
;
921 position
.node
->last_child
=tmp
;
923 tmp
->next_sibling
=position
.node
->first_child
;
924 position
.node
->first_child
=tmp
;
929 template <class T
, class tree_node_allocator
>
930 template <class iter
>
931 iter tree
<T
, tree_node_allocator
>::append_child(iter position
, iter other
)
933 assert(position
.node
!=head
);
934 assert(position
.node
);
936 sibling_iterator aargh
=append_child(position
, value_type());
937 return replace(aargh
, other
);
940 template <class T
, class tree_node_allocator
>
941 template <class iter
>
942 iter tree
<T
, tree_node_allocator
>::prepend_child(iter position
, iter other
)
944 assert(position
.node
!=head
);
945 assert(position
.node
);
947 sibling_iterator aargh
=prepend_child(position
, value_type());
948 return replace(aargh
, other
);
951 template <class T
, class tree_node_allocator
>
952 template <class iter
>
953 iter tree
<T
, tree_node_allocator
>::append_children(iter position
, sibling_iterator from
, sibling_iterator to
)
955 assert(position
.node
!=head
);
956 assert(position
.node
);
961 insert_subtree(position
.end(), from
);
967 template <class T
, class tree_node_allocator
>
968 template <class iter
>
969 iter tree
<T
, tree_node_allocator
>::prepend_children(iter position
, sibling_iterator from
, sibling_iterator to
)
971 assert(position
.node
!=head
);
972 assert(position
.node
);
977 insert_subtree(position
.begin(), from
);
983 template <class T
, class tree_node_allocator
>
984 typename tree
<T
, tree_node_allocator
>::pre_order_iterator tree
<T
, tree_node_allocator
>::set_head(const T
& x
)
986 assert(head
->next_sibling
==feet
);
987 return insert(iterator(feet
), x
);
990 template <class T
, class tree_node_allocator
>
991 template <class iter
>
992 iter tree
<T
, tree_node_allocator
>::insert(iter position
, const T
& x
)
994 if(position
.node
==0) {
995 position
.node
=feet
; // Backward compatibility: when calling insert on a null node,
996 // insert before the feet.
998 tree_node
* tmp
= alloc_
.allocate(1,0);
999 kp::constructor(&tmp
->data
, x
);
1003 tmp
->parent
=position
.node
->parent
;
1004 tmp
->next_sibling
=position
.node
;
1005 tmp
->prev_sibling
=position
.node
->prev_sibling
;
1006 position
.node
->prev_sibling
=tmp
;
1008 if(tmp
->prev_sibling
==0) {
1009 if(tmp
->parent
) // when inserting nodes at the head, there is no parent
1010 tmp
->parent
->first_child
=tmp
;
1013 tmp
->prev_sibling
->next_sibling
=tmp
;
1017 template <class T
, class tree_node_allocator
>
1018 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::insert(sibling_iterator position
, const T
& x
)
1020 tree_node
* tmp
= alloc_
.allocate(1,0);
1021 kp::constructor(&tmp
->data
, x
);
1025 tmp
->next_sibling
=position
.node
;
1026 if(position
.node
==0) { // iterator points to end of a subtree
1027 tmp
->parent
=position
.parent_
;
1028 tmp
->prev_sibling
=position
.range_last();
1029 tmp
->parent
->last_child
=tmp
;
1032 tmp
->parent
=position
.node
->parent
;
1033 tmp
->prev_sibling
=position
.node
->prev_sibling
;
1034 position
.node
->prev_sibling
=tmp
;
1037 if(tmp
->prev_sibling
==0) {
1038 if(tmp
->parent
) // when inserting nodes at the head, there is no parent
1039 tmp
->parent
->first_child
=tmp
;
1042 tmp
->prev_sibling
->next_sibling
=tmp
;
1046 template <class T
, class tree_node_allocator
>
1047 template <class iter
>
1048 iter tree
<T
, tree_node_allocator
>::insert_after(iter position
, const T
& x
)
1050 tree_node
* tmp
= alloc_
.allocate(1,0);
1051 kp::constructor(&tmp
->data
, x
);
1055 tmp
->parent
=position
.node
->parent
;
1056 tmp
->prev_sibling
=position
.node
;
1057 tmp
->next_sibling
=position
.node
->next_sibling
;
1058 position
.node
->next_sibling
=tmp
;
1060 if(tmp
->next_sibling
==0) {
1061 if(tmp
->parent
) // when inserting nodes at the head, there is no parent
1062 tmp
->parent
->last_child
=tmp
;
1065 tmp
->next_sibling
->prev_sibling
=tmp
;
1070 template <class T
, class tree_node_allocator
>
1071 template <class iter
>
1072 iter tree
<T
, tree_node_allocator
>::insert_subtree(iter position
, const iterator_base
& subtree
)
1075 iter it
=insert(position
, value_type());
1076 // replace dummy with subtree
1077 return replace(it
, subtree
);
1080 template <class T
, class tree_node_allocator
>
1081 template <class iter
>
1082 iter tree
<T
, tree_node_allocator
>::insert_subtree_after(iter position
, const iterator_base
& subtree
)
1085 iter it
=insert_after(position
, value_type());
1086 // replace dummy with subtree
1087 return replace(it
, subtree
);
1090 // template <class T, class tree_node_allocator>
1091 // template <class iter>
1092 // iter tree<T, tree_node_allocator>::insert_subtree(sibling_iterator position, iter subtree)
1095 // iter it(insert(position, value_type()));
1096 // // replace dummy with subtree
1097 // return replace(it, subtree);
1100 template <class T
, class tree_node_allocator
>
1101 template <class iter
>
1102 iter tree
<T
, tree_node_allocator
>::replace(iter position
, const T
& x
)
1104 kp::destructor(&position
.node
->data
);
1105 kp::constructor(&position
.node
->data
, x
);
1109 template <class T
, class tree_node_allocator
>
1110 template <class iter
>
1111 iter tree
<T
, tree_node_allocator
>::replace(iter position
, const iterator_base
& from
)
1113 assert(position
.node
!=head
);
1114 tree_node
*current_from
=from
.node
;
1115 tree_node
*start_from
=from
.node
;
1116 tree_node
*current_to
=position
.node
;
1118 // replace the node at position with head of the replacement tree at from
1119 // std::cout << "warning!" << position.node << std::endl;
1120 erase_children(position
);
1121 // std::cout << "no warning!" << std::endl;
1122 tree_node
* tmp
= alloc_
.allocate(1,0);
1123 kp::constructor(&tmp
->data
, (*from
));
1126 if(current_to
->prev_sibling
==0) {
1127 if(current_to
->parent
!=0)
1128 current_to
->parent
->first_child
=tmp
;
1131 current_to
->prev_sibling
->next_sibling
=tmp
;
1133 tmp
->prev_sibling
=current_to
->prev_sibling
;
1134 if(current_to
->next_sibling
==0) {
1135 if(current_to
->parent
!=0)
1136 current_to
->parent
->last_child
=tmp
;
1139 current_to
->next_sibling
->prev_sibling
=tmp
;
1141 tmp
->next_sibling
=current_to
->next_sibling
;
1142 tmp
->parent
=current_to
->parent
;
1143 kp::destructor(¤t_to
->data
);
1144 alloc_
.deallocate(current_to
,1);
1147 // only at this stage can we fix 'last'
1148 tree_node
*last
=from
.node
->next_sibling
;
1150 pre_order_iterator toit
=tmp
;
1151 // copy all children
1153 assert(current_from
!=0);
1154 if(current_from
->first_child
!= 0) {
1155 current_from
=current_from
->first_child
;
1156 toit
=append_child(toit
, current_from
->data
);
1159 while(current_from
->next_sibling
==0 && current_from
!=start_from
) {
1160 current_from
=current_from
->parent
;
1162 assert(current_from
!=0);
1164 current_from
=current_from
->next_sibling
;
1165 if(current_from
!=last
) {
1166 toit
=append_child(parent(toit
), current_from
->data
);
1169 } while(current_from
!=last
);
1174 template <class T
, class tree_node_allocator
>
1175 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::replace(
1176 sibling_iterator orig_begin
,
1177 sibling_iterator orig_end
,
1178 sibling_iterator new_begin
,
1179 sibling_iterator new_end
)
1181 tree_node
*orig_first
=orig_begin
.node
;
1182 tree_node
*new_first
=new_begin
.node
;
1183 tree_node
*orig_last
=orig_first
;
1184 while((++orig_begin
)!=orig_end
)
1185 orig_last
=orig_last
->next_sibling
;
1186 tree_node
*new_last
=new_first
;
1187 while((++new_begin
)!=new_end
)
1188 new_last
=new_last
->next_sibling
;
1190 // insert all siblings in new_first..new_last before orig_first
1192 pre_order_iterator ret
;
1194 pre_order_iterator tt
=insert_subtree(pre_order_iterator(orig_first
), pre_order_iterator(new_first
));
1199 if(new_first
==new_last
)
1201 new_first
=new_first
->next_sibling
;
1204 // erase old range of siblings
1206 tree_node
*next
=orig_first
;
1210 next
=next
->next_sibling
;
1211 erase((pre_order_iterator
)orig_first
);
1219 template <class T
, class tree_node_allocator
>
1220 template <typename iter
>
1221 iter tree
<T
, tree_node_allocator
>::flatten(iter position
)
1223 if(position
.node
->first_child
==0)
1226 tree_node
*tmp
=position
.node
->first_child
;
1228 tmp
->parent
=position
.node
->parent
;
1229 tmp
=tmp
->next_sibling
;
1231 if(position
.node
->next_sibling
) {
1232 position
.node
->last_child
->next_sibling
=position
.node
->next_sibling
;
1233 position
.node
->next_sibling
->prev_sibling
=position
.node
->last_child
;
1236 position
.node
->parent
->last_child
=position
.node
->last_child
;
1238 position
.node
->next_sibling
=position
.node
->first_child
;
1239 position
.node
->next_sibling
->prev_sibling
=position
.node
;
1240 position
.node
->first_child
=0;
1241 position
.node
->last_child
=0;
1247 template <class T
, class tree_node_allocator
>
1248 template <typename iter
>
1249 iter tree
<T
, tree_node_allocator
>::reparent(iter position
, sibling_iterator begin
, sibling_iterator end
)
1251 tree_node
*first
=begin
.node
;
1252 tree_node
*last
=first
;
1254 assert(first
!=position
.node
);
1256 if(begin
==end
) return begin
;
1257 // determine last node
1258 while((++begin
)!=end
) {
1259 last
=last
->next_sibling
;
1262 if(first
->prev_sibling
==0) {
1263 first
->parent
->first_child
=last
->next_sibling
;
1266 first
->prev_sibling
->next_sibling
=last
->next_sibling
;
1268 if(last
->next_sibling
==0) {
1269 last
->parent
->last_child
=first
->prev_sibling
;
1272 last
->next_sibling
->prev_sibling
=first
->prev_sibling
;
1274 if(position
.node
->first_child
==0) {
1275 position
.node
->first_child
=first
;
1276 position
.node
->last_child
=last
;
1277 first
->prev_sibling
=0;
1280 position
.node
->last_child
->next_sibling
=first
;
1281 first
->prev_sibling
=position
.node
->last_child
;
1282 position
.node
->last_child
=last
;
1284 last
->next_sibling
=0;
1286 tree_node
*pos
=first
;
1288 pos
->parent
=position
.node
;
1289 if(pos
==last
) break;
1290 pos
=pos
->next_sibling
;
1296 template <class T
, class tree_node_allocator
>
1297 template <typename iter
> iter tree
<T
, tree_node_allocator
>::reparent(iter position
, iter from
)
1299 if(from
.node
->first_child
==0) return position
;
1300 return reparent(position
, from
.node
->first_child
, end(from
));
1303 template <class T
, class tree_node_allocator
>
1304 template <typename iter
> iter tree
<T
, tree_node_allocator
>::wrap(iter position
, const T
& x
)
1306 assert(position
.node
!=0);
1307 sibling_iterator fr
=position
, to
=position
;
1309 iter ret
= insert(position
, x
);
1310 reparent(ret
, fr
, to
);
1314 template <class T
, class tree_node_allocator
>
1315 template <typename iter
> iter tree
<T
, tree_node_allocator
>::move_after(iter target
, iter source
)
1317 tree_node
*dst
=target
.node
;
1318 tree_node
*src
=source
.node
;
1322 if(dst
==src
) return source
;
1323 if(dst
->next_sibling
)
1324 if(dst
->next_sibling
==src
) // already in the right spot
1327 // take src out of the tree
1328 if(src
->prev_sibling
!=0) src
->prev_sibling
->next_sibling
=src
->next_sibling
;
1329 else src
->parent
->first_child
=src
->next_sibling
;
1330 if(src
->next_sibling
!=0) src
->next_sibling
->prev_sibling
=src
->prev_sibling
;
1331 else src
->parent
->last_child
=src
->prev_sibling
;
1333 // connect it to the new point
1334 if(dst
->next_sibling
!=0) dst
->next_sibling
->prev_sibling
=src
;
1335 else dst
->parent
->last_child
=src
;
1336 src
->next_sibling
=dst
->next_sibling
;
1337 dst
->next_sibling
=src
;
1338 src
->prev_sibling
=dst
;
1339 src
->parent
=dst
->parent
;
1343 template <class T
, class tree_node_allocator
>
1344 template <typename iter
> iter tree
<T
, tree_node_allocator
>::move_before(iter target
, iter source
)
1346 tree_node
*dst
=target
.node
;
1347 tree_node
*src
=source
.node
;
1351 if(dst
==src
) return source
;
1352 if(dst
->prev_sibling
)
1353 if(dst
->prev_sibling
==src
) // already in the right spot
1356 // take src out of the tree
1357 if(src
->prev_sibling
!=0) src
->prev_sibling
->next_sibling
=src
->next_sibling
;
1358 else src
->parent
->first_child
=src
->next_sibling
;
1359 if(src
->next_sibling
!=0) src
->next_sibling
->prev_sibling
=src
->prev_sibling
;
1360 else src
->parent
->last_child
=src
->prev_sibling
;
1362 // connect it to the new point
1363 if(dst
->prev_sibling
!=0) dst
->prev_sibling
->next_sibling
=src
;
1364 else dst
->parent
->first_child
=src
;
1365 src
->prev_sibling
=dst
->prev_sibling
;
1366 dst
->prev_sibling
=src
;
1367 src
->next_sibling
=dst
;
1368 src
->parent
=dst
->parent
;
1372 // specialisation for sibling_iterators
1373 template <class T
, class tree_node_allocator
>
1374 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::move_before(sibling_iterator target
,
1375 sibling_iterator source
)
1377 tree_node
*dst
=target
.node
;
1378 tree_node
*src
=source
.node
;
1379 tree_node
*dst_prev_sibling
;
1380 if(dst
==0) { // must then be an end iterator
1381 dst_prev_sibling
=target
.parent_
->last_child
;
1382 assert(dst_prev_sibling
);
1384 else dst_prev_sibling
=dst
->prev_sibling
;
1387 if(dst
==src
) return source
;
1388 if(dst_prev_sibling
)
1389 if(dst_prev_sibling
==src
) // already in the right spot
1392 // take src out of the tree
1393 if(src
->prev_sibling
!=0) src
->prev_sibling
->next_sibling
=src
->next_sibling
;
1394 else src
->parent
->first_child
=src
->next_sibling
;
1395 if(src
->next_sibling
!=0) src
->next_sibling
->prev_sibling
=src
->prev_sibling
;
1396 else src
->parent
->last_child
=src
->prev_sibling
;
1398 // connect it to the new point
1399 if(dst_prev_sibling
!=0) dst_prev_sibling
->next_sibling
=src
;
1400 else target
.parent_
->first_child
=src
;
1401 src
->prev_sibling
=dst_prev_sibling
;
1403 dst
->prev_sibling
=src
;
1404 src
->parent
=dst
->parent
;
1406 src
->next_sibling
=dst
;
1410 template <class T
, class tree_node_allocator
>
1411 template <typename iter
> iter tree
<T
, tree_node_allocator
>::move_ontop(iter target
, iter source
)
1413 tree_node
*dst
=target
.node
;
1414 tree_node
*src
=source
.node
;
1418 if(dst
==src
) return source
;
1420 // remember connection points
1421 tree_node
*b_prev_sibling
=dst
->prev_sibling
;
1422 tree_node
*b_next_sibling
=dst
->next_sibling
;
1423 tree_node
*b_parent
=dst
->parent
;
1428 // take src out of the tree
1429 if(src
->prev_sibling
!=0) src
->prev_sibling
->next_sibling
=src
->next_sibling
;
1430 else src
->parent
->first_child
=src
->next_sibling
;
1431 if(src
->next_sibling
!=0) src
->next_sibling
->prev_sibling
=src
->prev_sibling
;
1432 else src
->parent
->last_child
=src
->prev_sibling
;
1434 // connect it to the new point
1435 if(b_prev_sibling
!=0) b_prev_sibling
->next_sibling
=src
;
1436 else b_parent
->first_child
=src
;
1437 if(b_next_sibling
!=0) b_next_sibling
->prev_sibling
=src
;
1438 else b_parent
->last_child
=src
;
1439 src
->prev_sibling
=b_prev_sibling
;
1440 src
->next_sibling
=b_next_sibling
;
1441 src
->parent
=b_parent
;
1445 template <class T
, class tree_node_allocator
>
1446 void tree
<T
, tree_node_allocator
>::merge(sibling_iterator to1
, sibling_iterator to2
,
1447 sibling_iterator from1
, sibling_iterator from2
,
1448 bool duplicate_leaves
)
1450 sibling_iterator fnd
;
1451 while(from1
!=from2
) {
1452 if((fnd
=std::find(to1
, to2
, (*from1
))) != to2
) { // element found
1453 if(from1
.begin()==from1
.end()) { // full depth reached
1454 if(duplicate_leaves
)
1455 append_child(parent(to1
), (*from1
));
1457 else { // descend further
1458 merge(fnd
.begin(), fnd
.end(), from1
.begin(), from1
.end(), duplicate_leaves
);
1461 else { // element missing
1462 insert_subtree(to2
, from1
);
1469 template <class T
, class tree_node_allocator
>
1470 void tree
<T
, tree_node_allocator
>::sort(sibling_iterator from
, sibling_iterator to
, bool deep
)
1473 sort(from
, to
, comp
, deep
);
1476 template <class T
, class tree_node_allocator
>
1477 template <class StrictWeakOrdering
>
1478 void tree
<T
, tree_node_allocator
>::sort(sibling_iterator from
, sibling_iterator to
,
1479 StrictWeakOrdering comp
, bool deep
)
1481 if(from
==to
) return;
1482 // make list of sorted nodes
1483 // CHECK: if multiset stores equivalent nodes in the order in which they
1484 // are inserted, then this routine should be called 'stable_sort'.
1485 std::multiset
<tree_node
*, compare_nodes
<StrictWeakOrdering
> > nodes(comp
);
1486 sibling_iterator it
=from
, it2
=to
;
1488 nodes
.insert(it
.node
);
1494 // prev and next are the nodes before and after the sorted range
1495 tree_node
*prev
=from
.node
->prev_sibling
;
1496 tree_node
*next
=it2
.node
->next_sibling
;
1497 typename
std::multiset
<tree_node
*, compare_nodes
<StrictWeakOrdering
> >::iterator nit
=nodes
.begin(), eit
=nodes
.end();
1499 if((*nit
)->parent
!=0) // to catch "sorting the head" situations, when there is no parent
1500 (*nit
)->parent
->first_child
=(*nit
);
1502 else prev
->next_sibling
=(*nit
);
1506 (*nit
)->prev_sibling
=prev
;
1508 prev
->next_sibling
=(*nit
);
1512 // prev now points to the last-but-one node in the sorted range
1514 prev
->next_sibling
=(*eit
);
1516 // eit points to the last node in the sorted range.
1517 (*eit
)->next_sibling
=next
;
1518 (*eit
)->prev_sibling
=prev
; // missed in the loop above
1520 if((*eit
)->parent
!=0) // to catch "sorting the head" situations, when there is no parent
1521 (*eit
)->parent
->last_child
=(*eit
);
1523 else next
->prev_sibling
=(*eit
);
1525 if(deep
) { // sort the children of each node too
1526 sibling_iterator
bcs(*nodes
.begin());
1527 sibling_iterator
ecs(*eit
);
1530 sort(begin(bcs
), end(bcs
), comp
, deep
);
1536 template <class T
, class tree_node_allocator
>
1537 template <typename iter
>
1538 bool tree
<T
, tree_node_allocator
>::equal(const iter
& one_
, const iter
& two
, const iter
& three_
) const
1540 std::equal_to
<T
> comp
;
1541 return equal(one_
, two
, three_
, comp
);
1544 template <class T
, class tree_node_allocator
>
1545 template <typename iter
>
1546 bool tree
<T
, tree_node_allocator
>::equal_subtree(const iter
& one_
, const iter
& two_
) const
1548 std::equal_to
<T
> comp
;
1549 return equal_subtree(one_
, two_
, comp
);
1552 template <class T
, class tree_node_allocator
>
1553 template <typename iter
, class BinaryPredicate
>
1554 bool tree
<T
, tree_node_allocator
>::equal(const iter
& one_
, const iter
& two
, const iter
& three_
, BinaryPredicate fun
) const
1556 pre_order_iterator
one(one_
), three(three_
);
1558 // if(one==two && is_valid(three) && three.number_of_children()!=0)
1560 while(one
!=two
&& is_valid(three
)) {
1561 if(!fun(*one
,*three
))
1563 if(one
.number_of_children()!=three
.number_of_children())
1571 template <class T
, class tree_node_allocator
>
1572 template <typename iter
, class BinaryPredicate
>
1573 bool tree
<T
, tree_node_allocator
>::equal_subtree(const iter
& one_
, const iter
& two_
, BinaryPredicate fun
) const
1575 pre_order_iterator
one(one_
), two(two_
);
1577 if(!fun(*one
,*two
)) return false;
1578 if(number_of_children(one
)!=number_of_children(two
)) return false;
1579 return equal(begin(one
),end(one
),begin(two
),fun
);
1582 template <class T
, class tree_node_allocator
>
1583 tree
<T
, tree_node_allocator
> tree
<T
, tree_node_allocator
>::subtree(sibling_iterator from
, sibling_iterator to
) const
1586 tmp
.set_head(value_type());
1587 tmp
.replace(tmp
.begin(), tmp
.end(), from
, to
);
1591 template <class T
, class tree_node_allocator
>
1592 void tree
<T
, tree_node_allocator
>::subtree(tree
& tmp
, sibling_iterator from
, sibling_iterator to
) const
1594 tmp
.set_head(value_type());
1595 tmp
.replace(tmp
.begin(), tmp
.end(), from
, to
);
1598 template <class T
, class tree_node_allocator
>
1599 size_t tree
<T
, tree_node_allocator
>::size() const
1602 pre_order_iterator it
=begin(), eit
=end();
1610 template <class T
, class tree_node_allocator
>
1611 size_t tree
<T
, tree_node_allocator
>::size(const iterator_base
& top
) const
1614 pre_order_iterator it
=top
, eit
=top
;
1615 eit
.skip_children();
1624 template <class T
, class tree_node_allocator
>
1625 bool tree
<T
, tree_node_allocator
>::empty() const
1627 pre_order_iterator it
=begin(), eit
=end();
1631 template <class T
, class tree_node_allocator
>
1632 int tree
<T
, tree_node_allocator
>::depth(const iterator_base
& it
)
1634 tree_node
* pos
=it
.node
;
1637 while(pos
->parent
!=0) {
1644 template <class T
, class tree_node_allocator
>
1645 int tree
<T
, tree_node_allocator
>::depth(const iterator_base
& it
, const iterator_base
& root
)
1647 tree_node
* pos
=it
.node
;
1650 while(pos
->parent
!=0 && pos
!=root
.node
) {
1657 template <class T
, class tree_node_allocator
>
1658 int tree
<T
, tree_node_allocator
>::max_depth() const
1661 for(tree_node
*it
= head
->next_sibling
; it
!=feet
; it
=it
->next_sibling
)
1662 maxd
=std::max(maxd
, max_depth(it
));
1668 template <class T
, class tree_node_allocator
>
1669 int tree
<T
, tree_node_allocator
>::max_depth(const iterator_base
& pos
) const
1671 tree_node
*tmp
=pos
.node
;
1673 if(tmp
==0 || tmp
==head
|| tmp
==feet
) return -1;
1675 int curdepth
=0, maxdepth
=0;
1676 while(true) { // try to walk the bottom of the tree
1677 while(tmp
->first_child
==0) {
1678 if(tmp
==pos
.node
) return maxdepth
;
1679 if(tmp
->next_sibling
==0) {
1680 // try to walk up and then right again
1683 if(tmp
==0) return maxdepth
;
1685 } while(tmp
->next_sibling
==0);
1687 if(tmp
==pos
.node
) return maxdepth
;
1688 tmp
=tmp
->next_sibling
;
1690 tmp
=tmp
->first_child
;
1692 maxdepth
=std::max(curdepth
, maxdepth
);
1696 template <class T
, class tree_node_allocator
>
1697 unsigned int tree
<T
, tree_node_allocator
>::number_of_children(const iterator_base
& it
)
1699 tree_node
*pos
=it
.node
->first_child
;
1700 if(pos
==0) return 0;
1703 // while(pos!=it.node->last_child) {
1705 // pos=pos->next_sibling;
1707 while((pos
=pos
->next_sibling
))
1712 template <class T
, class tree_node_allocator
>
1713 unsigned int tree
<T
, tree_node_allocator
>::number_of_siblings(const iterator_base
& it
) const
1715 tree_node
*pos
=it
.node
;
1718 while(pos
->next_sibling
&&
1719 pos
->next_sibling
!=head
&&
1720 pos
->next_sibling
!=feet
) {
1722 pos
=pos
->next_sibling
;
1726 while(pos
->prev_sibling
&&
1727 pos
->prev_sibling
!=head
&&
1728 pos
->prev_sibling
!=feet
) {
1730 pos
=pos
->prev_sibling
;
1736 template <class T
, class tree_node_allocator
>
1737 void tree
<T
, tree_node_allocator
>::swap(sibling_iterator it
)
1739 tree_node
*nxt
=it
.node
->next_sibling
;
1741 if(it
.node
->prev_sibling
)
1742 it
.node
->prev_sibling
->next_sibling
=nxt
;
1744 it
.node
->parent
->first_child
=nxt
;
1745 nxt
->prev_sibling
=it
.node
->prev_sibling
;
1746 tree_node
*nxtnxt
=nxt
->next_sibling
;
1748 nxtnxt
->prev_sibling
=it
.node
;
1750 it
.node
->parent
->last_child
=it
.node
;
1751 nxt
->next_sibling
=it
.node
;
1752 it
.node
->prev_sibling
=nxt
;
1753 it
.node
->next_sibling
=nxtnxt
;
1757 template <class T
, class tree_node_allocator
>
1758 void tree
<T
, tree_node_allocator
>::swap(iterator one
, iterator two
)
1760 // if one and two are adjacent siblings, use the sibling swap
1761 if(one
.node
->next_sibling
==two
.node
) swap(one
);
1762 else if(two
.node
->next_sibling
==one
.node
) swap(two
);
1764 tree_node
*nxt1
=one
.node
->next_sibling
;
1765 tree_node
*nxt2
=two
.node
->next_sibling
;
1766 tree_node
*pre1
=one
.node
->prev_sibling
;
1767 tree_node
*pre2
=two
.node
->prev_sibling
;
1768 tree_node
*par1
=one
.node
->parent
;
1769 tree_node
*par2
=two
.node
->parent
;
1772 one
.node
->parent
=par2
;
1773 one
.node
->next_sibling
=nxt2
;
1774 if(nxt2
) nxt2
->prev_sibling
=one
.node
;
1775 else par2
->last_child
=one
.node
;
1776 one
.node
->prev_sibling
=pre2
;
1777 if(pre2
) pre2
->next_sibling
=one
.node
;
1778 else par2
->first_child
=one
.node
;
1780 two
.node
->parent
=par1
;
1781 two
.node
->next_sibling
=nxt1
;
1782 if(nxt1
) nxt1
->prev_sibling
=two
.node
;
1783 else par1
->last_child
=two
.node
;
1784 two
.node
->prev_sibling
=pre1
;
1785 if(pre1
) pre1
->next_sibling
=two
.node
;
1786 else par1
->first_child
=two
.node
;
1790 // template <class BinaryPredicate>
1791 // tree<T, tree_node_allocator>::iterator tree<T, tree_node_allocator>::find_subtree(
1792 // sibling_iterator subfrom, sibling_iterator subto, iterator from, iterator to,
1793 // BinaryPredicate fun) const
1795 // assert(1==0); // this routine is not finished yet.
1796 // while(from!=to) {
1797 // if(fun(*subfrom, *from)) {
1804 template <class T
, class tree_node_allocator
>
1805 bool tree
<T
, tree_node_allocator
>::is_in_subtree(const iterator_base
& it
, const iterator_base
& begin
,
1806 const iterator_base
& end
) const
1808 // FIXME: this should be optimised.
1809 pre_order_iterator tmp
=begin
;
1811 if(tmp
==it
) return true;
1817 template <class T
, class tree_node_allocator
>
1818 bool tree
<T
, tree_node_allocator
>::is_valid(const iterator_base
& it
) const
1820 if(it
.node
==0 || it
.node
==feet
|| it
.node
==head
) return false;
1824 template <class T
, class tree_node_allocator
>
1825 unsigned int tree
<T
, tree_node_allocator
>::index(sibling_iterator it
) const
1828 if(it
.node
->parent
==0) {
1829 while(it
.node
->prev_sibling
!=head
) {
1830 it
.node
=it
.node
->prev_sibling
;
1835 while(it
.node
->prev_sibling
!=0) {
1836 it
.node
=it
.node
->prev_sibling
;
1843 template <class T
, class tree_node_allocator
>
1844 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::sibling(const iterator_base
& it
, unsigned int num
)
1847 if(it
.node
->parent
==0) {
1848 tmp
=head
->next_sibling
;
1850 tmp
= tmp
->next_sibling
;
1855 tmp
=it
.node
->parent
->first_child
;
1858 tmp
= tmp
->next_sibling
;
1866 template <class T
, class tree_node_allocator
>
1867 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::child(const iterator_base
& it
, unsigned int num
)
1869 tree_node
*tmp
=it
.node
->first_child
;
1872 tmp
=tmp
->next_sibling
;
1882 template <class T
, class tree_node_allocator
>
1883 tree
<T
, tree_node_allocator
>::iterator_base::iterator_base()
1884 : node(0), skip_current_children_(false)
1888 template <class T
, class tree_node_allocator
>
1889 tree
<T
, tree_node_allocator
>::iterator_base::iterator_base(tree_node
*tn
)
1890 : node(tn
), skip_current_children_(false)
1894 template <class T
, class tree_node_allocator
>
1895 T
& tree
<T
, tree_node_allocator
>::iterator_base::operator*() const
1900 template <class T
, class tree_node_allocator
>
1901 T
* tree
<T
, tree_node_allocator
>::iterator_base::operator->() const
1903 return &(node
->data
);
1906 template <class T
, class tree_node_allocator
>
1907 bool tree
<T
, tree_node_allocator
>::post_order_iterator::operator!=(const post_order_iterator
& other
) const
1909 if(other
.node
!=this->node
) return true;
1913 template <class T
, class tree_node_allocator
>
1914 bool tree
<T
, tree_node_allocator
>::post_order_iterator::operator==(const post_order_iterator
& other
) const
1916 if(other
.node
==this->node
) return true;
1920 template <class T
, class tree_node_allocator
>
1921 bool tree
<T
, tree_node_allocator
>::pre_order_iterator::operator!=(const pre_order_iterator
& other
) const
1923 if(other
.node
!=this->node
) return true;
1927 template <class T
, class tree_node_allocator
>
1928 bool tree
<T
, tree_node_allocator
>::pre_order_iterator::operator==(const pre_order_iterator
& other
) const
1930 if(other
.node
==this->node
) return true;
1934 template <class T
, class tree_node_allocator
>
1935 bool tree
<T
, tree_node_allocator
>::sibling_iterator::operator!=(const sibling_iterator
& other
) const
1937 if(other
.node
!=this->node
) return true;
1941 template <class T
, class tree_node_allocator
>
1942 bool tree
<T
, tree_node_allocator
>::sibling_iterator::operator==(const sibling_iterator
& other
) const
1944 if(other
.node
==this->node
) return true;
1948 template <class T
, class tree_node_allocator
>
1949 bool tree
<T
, tree_node_allocator
>::leaf_iterator::operator!=(const leaf_iterator
& other
) const
1951 if(other
.node
!=this->node
) return true;
1955 template <class T
, class tree_node_allocator
>
1956 bool tree
<T
, tree_node_allocator
>::leaf_iterator::operator==(const leaf_iterator
& other
) const
1958 if(other
.node
==this->node
&& other
.top_node
==this->top_node
) return true;
1962 template <class T
, class tree_node_allocator
>
1963 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::iterator_base::begin() const
1965 if(node
->first_child
==0)
1968 sibling_iterator
ret(node
->first_child
);
1969 ret
.parent_
=this->node
;
1973 template <class T
, class tree_node_allocator
>
1974 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::iterator_base::end() const
1976 sibling_iterator
ret(0);
1981 template <class T
, class tree_node_allocator
>
1982 void tree
<T
, tree_node_allocator
>::iterator_base::skip_children()
1984 skip_current_children_
=true;
1987 template <class T
, class tree_node_allocator
>
1988 void tree
<T
, tree_node_allocator
>::iterator_base::skip_children(bool skip
)
1990 skip_current_children_
=skip
;
1993 template <class T
, class tree_node_allocator
>
1994 unsigned int tree
<T
, tree_node_allocator
>::iterator_base::number_of_children() const
1996 tree_node
*pos
=node
->first_child
;
1997 if(pos
==0) return 0;
2000 while(pos
!=node
->last_child
) {
2002 pos
=pos
->next_sibling
;
2009 // Pre-order iterator
2011 template <class T
, class tree_node_allocator
>
2012 tree
<T
, tree_node_allocator
>::pre_order_iterator::pre_order_iterator()
2017 template <class T
, class tree_node_allocator
>
2018 tree
<T
, tree_node_allocator
>::pre_order_iterator::pre_order_iterator(tree_node
*tn
)
2023 template <class T
, class tree_node_allocator
>
2024 tree
<T
, tree_node_allocator
>::pre_order_iterator::pre_order_iterator(const iterator_base
&other
)
2025 : iterator_base(other
.node
)
2029 template <class T
, class tree_node_allocator
>
2030 tree
<T
, tree_node_allocator
>::pre_order_iterator::pre_order_iterator(const sibling_iterator
& other
)
2031 : iterator_base(other
.node
)
2034 if(other
.range_last()!=0)
2035 this->node
=other
.range_last();
2037 this->node
=other
.parent_
;
2038 this->skip_children();
2043 template <class T
, class tree_node_allocator
>
2044 typename tree
<T
, tree_node_allocator
>::pre_order_iterator
& tree
<T
, tree_node_allocator
>::pre_order_iterator::operator++()
2046 assert(this->node
!=0);
2047 if(!this->skip_current_children_
&& this->node
->first_child
!= 0) {
2048 this->node
=this->node
->first_child
;
2051 this->skip_current_children_
=false;
2052 while(this->node
->next_sibling
==0) {
2053 this->node
=this->node
->parent
;
2057 this->node
=this->node
->next_sibling
;
2062 template <class T
, class tree_node_allocator
>
2063 typename tree
<T
, tree_node_allocator
>::pre_order_iterator
& tree
<T
, tree_node_allocator
>::pre_order_iterator::operator--()
2065 assert(this->node
!=0);
2066 if(this->node
->prev_sibling
) {
2067 this->node
=this->node
->prev_sibling
;
2068 while(this->node
->last_child
)
2069 this->node
=this->node
->last_child
;
2072 this->node
=this->node
->parent
;
2079 template <class T
, class tree_node_allocator
>
2080 typename tree
<T
, tree_node_allocator
>::pre_order_iterator tree
<T
, tree_node_allocator
>::pre_order_iterator::operator++(int)
2082 pre_order_iterator copy
= *this;
2087 template <class T
, class tree_node_allocator
>
2088 typename tree
<T
, tree_node_allocator
>::pre_order_iterator tree
<T
, tree_node_allocator
>::pre_order_iterator::operator--(int)
2090 pre_order_iterator copy
= *this;
2095 template <class T
, class tree_node_allocator
>
2096 typename tree
<T
, tree_node_allocator
>::pre_order_iterator
& tree
<T
, tree_node_allocator
>::pre_order_iterator::operator+=(unsigned int num
)
2105 template <class T
, class tree_node_allocator
>
2106 typename tree
<T
, tree_node_allocator
>::pre_order_iterator
& tree
<T
, tree_node_allocator
>::pre_order_iterator::operator-=(unsigned int num
)
2117 // Post-order iterator
2119 template <class T
, class tree_node_allocator
>
2120 tree
<T
, tree_node_allocator
>::post_order_iterator::post_order_iterator()
2125 template <class T
, class tree_node_allocator
>
2126 tree
<T
, tree_node_allocator
>::post_order_iterator::post_order_iterator(tree_node
*tn
)
2131 template <class T
, class tree_node_allocator
>
2132 tree
<T
, tree_node_allocator
>::post_order_iterator::post_order_iterator(const iterator_base
&other
)
2133 : iterator_base(other
.node
)
2137 template <class T
, class tree_node_allocator
>
2138 tree
<T
, tree_node_allocator
>::post_order_iterator::post_order_iterator(const sibling_iterator
& other
)
2139 : iterator_base(other
.node
)
2142 if(other
.range_last()!=0)
2143 this->node
=other
.range_last();
2145 this->node
=other
.parent_
;
2146 this->skip_children();
2151 template <class T
, class tree_node_allocator
>
2152 typename tree
<T
, tree_node_allocator
>::post_order_iterator
& tree
<T
, tree_node_allocator
>::post_order_iterator::operator++()
2154 assert(this->node
!=0);
2155 if(this->node
->next_sibling
==0) {
2156 this->node
=this->node
->parent
;
2157 this->skip_current_children_
=false;
2160 this->node
=this->node
->next_sibling
;
2161 if(this->skip_current_children_
) {
2162 this->skip_current_children_
=false;
2165 while(this->node
->first_child
)
2166 this->node
=this->node
->first_child
;
2172 template <class T
, class tree_node_allocator
>
2173 typename tree
<T
, tree_node_allocator
>::post_order_iterator
& tree
<T
, tree_node_allocator
>::post_order_iterator::operator--()
2175 assert(this->node
!=0);
2176 if(this->skip_current_children_
|| this->node
->last_child
==0) {
2177 this->skip_current_children_
=false;
2178 while(this->node
->prev_sibling
==0)
2179 this->node
=this->node
->parent
;
2180 this->node
=this->node
->prev_sibling
;
2183 this->node
=this->node
->last_child
;
2188 template <class T
, class tree_node_allocator
>
2189 typename tree
<T
, tree_node_allocator
>::post_order_iterator tree
<T
, tree_node_allocator
>::post_order_iterator::operator++(int)
2191 post_order_iterator copy
= *this;
2196 template <class T
, class tree_node_allocator
>
2197 typename tree
<T
, tree_node_allocator
>::post_order_iterator tree
<T
, tree_node_allocator
>::post_order_iterator::operator--(int)
2199 post_order_iterator copy
= *this;
2205 template <class T
, class tree_node_allocator
>
2206 typename tree
<T
, tree_node_allocator
>::post_order_iterator
& tree
<T
, tree_node_allocator
>::post_order_iterator::operator+=(unsigned int num
)
2215 template <class T
, class tree_node_allocator
>
2216 typename tree
<T
, tree_node_allocator
>::post_order_iterator
& tree
<T
, tree_node_allocator
>::post_order_iterator::operator-=(unsigned int num
)
2225 template <class T
, class tree_node_allocator
>
2226 void tree
<T
, tree_node_allocator
>::post_order_iterator::descend_all()
2228 assert(this->node
!=0);
2229 while(this->node
->first_child
)
2230 this->node
=this->node
->first_child
;
2234 // Breadth-first iterator
2236 template <class T
, class tree_node_allocator
>
2237 tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator::breadth_first_queued_iterator()
2242 template <class T
, class tree_node_allocator
>
2243 tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator::breadth_first_queued_iterator(tree_node
*tn
)
2246 traversal_queue
.push(tn
);
2249 template <class T
, class tree_node_allocator
>
2250 tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator::breadth_first_queued_iterator(const iterator_base
& other
)
2251 : iterator_base(other
.node
)
2253 traversal_queue
.push(other
.node
);
2256 template <class T
, class tree_node_allocator
>
2257 bool tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator::operator!=(const breadth_first_queued_iterator
& other
) const
2259 if(other
.node
!=this->node
) return true;
2263 template <class T
, class tree_node_allocator
>
2264 bool tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator::operator==(const breadth_first_queued_iterator
& other
) const
2266 if(other
.node
==this->node
) return true;
2270 template <class T
, class tree_node_allocator
>
2271 typename tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator
& tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator::operator++()
2273 assert(this->node
!=0);
2275 // Add child nodes and pop current node
2276 sibling_iterator sib
=this->begin();
2277 while(sib
!=this->end()) {
2278 traversal_queue
.push(sib
.node
);
2281 traversal_queue
.pop();
2282 if(traversal_queue
.size()>0)
2283 this->node
=traversal_queue
.front();
2289 template <class T
, class tree_node_allocator
>
2290 typename tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator::operator++(int)
2292 breadth_first_queued_iterator copy
= *this;
2297 template <class T
, class tree_node_allocator
>
2298 typename tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator
& tree
<T
, tree_node_allocator
>::breadth_first_queued_iterator::operator+=(unsigned int num
)
2309 // Fixed depth iterator
2311 template <class T
, class tree_node_allocator
>
2312 tree
<T
, tree_node_allocator
>::fixed_depth_iterator::fixed_depth_iterator()
2317 template <class T
, class tree_node_allocator
>
2318 tree
<T
, tree_node_allocator
>::fixed_depth_iterator::fixed_depth_iterator(tree_node
*tn
)
2319 : iterator_base(tn
), top_node(0)
2323 template <class T
, class tree_node_allocator
>
2324 tree
<T
, tree_node_allocator
>::fixed_depth_iterator::fixed_depth_iterator(const iterator_base
& other
)
2325 : iterator_base(other
.node
), top_node(0)
2329 template <class T
, class tree_node_allocator
>
2330 tree
<T
, tree_node_allocator
>::fixed_depth_iterator::fixed_depth_iterator(const sibling_iterator
& other
)
2331 : iterator_base(other
.node
), top_node(0)
2335 template <class T
, class tree_node_allocator
>
2336 tree
<T
, tree_node_allocator
>::fixed_depth_iterator::fixed_depth_iterator(const fixed_depth_iterator
& other
)
2337 : iterator_base(other
.node
), top_node(other
.top_node
)
2341 template <class T
, class tree_node_allocator
>
2342 bool tree
<T
, tree_node_allocator
>::fixed_depth_iterator::operator==(const fixed_depth_iterator
& other
) const
2344 if(other
.node
==this->node
&& other
.top_node
==top_node
) return true;
2348 template <class T
, class tree_node_allocator
>
2349 bool tree
<T
, tree_node_allocator
>::fixed_depth_iterator::operator!=(const fixed_depth_iterator
& other
) const
2351 if(other
.node
!=this->node
|| other
.top_node
!=top_node
) return true;
2355 template <class T
, class tree_node_allocator
>
2356 typename tree
<T
, tree_node_allocator
>::fixed_depth_iterator
& tree
<T
, tree_node_allocator
>::fixed_depth_iterator::operator++()
2358 assert(this->node
!=0);
2360 if(this->node
->next_sibling
) {
2361 this->node
=this->node
->next_sibling
;
2364 int relative_depth
=0;
2367 if(this->node
==this->top_node
) {
2368 this->node
=0; // FIXME: return a proper fixed_depth end iterator once implemented
2371 this->node
=this->node
->parent
;
2372 if(this->node
==0) return *this;
2374 } while(this->node
->next_sibling
==0);
2376 this->node
=this->node
->next_sibling
;
2377 while(this->node
->first_child
==0) {
2378 if(this->node
->next_sibling
==0)
2380 this->node
=this->node
->next_sibling
;
2381 if(this->node
==0) return *this;
2383 while(relative_depth
<0 && this->node
->first_child
!=0) {
2384 this->node
=this->node
->first_child
;
2387 if(relative_depth
<0) {
2388 if(this->node
->next_sibling
==0) goto upper
;
2395 template <class T
, class tree_node_allocator
>
2396 typename tree
<T
, tree_node_allocator
>::fixed_depth_iterator
& tree
<T
, tree_node_allocator
>::fixed_depth_iterator::operator--()
2398 assert(this->node
!=0);
2400 if(this->node
->prev_sibling
) {
2401 this->node
=this->node
->prev_sibling
;
2404 int relative_depth
=0;
2407 if(this->node
==this->top_node
) {
2411 this->node
=this->node
->parent
;
2412 if(this->node
==0) return *this;
2414 } while(this->node
->prev_sibling
==0);
2416 this->node
=this->node
->prev_sibling
;
2417 while(this->node
->last_child
==0) {
2418 if(this->node
->prev_sibling
==0)
2420 this->node
=this->node
->prev_sibling
;
2421 if(this->node
==0) return *this;
2423 while(relative_depth
<0 && this->node
->last_child
!=0) {
2424 this->node
=this->node
->last_child
;
2427 if(relative_depth
<0) {
2428 if(this->node
->prev_sibling
==0) goto upper
;
2436 // assert(this->node!=0);
2437 // if(this->node->prev_sibling!=0) {
2438 // this->node=this->node->prev_sibling;
2439 // assert(this->node!=0);
2440 // if(this->node->parent==0 && this->node->prev_sibling==0) // head element
2444 // tree_node *par=this->node->parent;
2446 // par=par->prev_sibling;
2447 // if(par==0) { // FIXME: need to keep track of this!
2451 // } while(par->last_child==0);
2452 // this->node=par->last_child;
2457 template <class T
, class tree_node_allocator
>
2458 typename tree
<T
, tree_node_allocator
>::fixed_depth_iterator tree
<T
, tree_node_allocator
>::fixed_depth_iterator::operator++(int)
2460 fixed_depth_iterator copy
= *this;
2465 template <class T
, class tree_node_allocator
>
2466 typename tree
<T
, tree_node_allocator
>::fixed_depth_iterator tree
<T
, tree_node_allocator
>::fixed_depth_iterator::operator--(int)
2468 fixed_depth_iterator copy
= *this;
2473 template <class T
, class tree_node_allocator
>
2474 typename tree
<T
, tree_node_allocator
>::fixed_depth_iterator
& tree
<T
, tree_node_allocator
>::fixed_depth_iterator::operator-=(unsigned int num
)
2483 template <class T
, class tree_node_allocator
>
2484 typename tree
<T
, tree_node_allocator
>::fixed_depth_iterator
& tree
<T
, tree_node_allocator
>::fixed_depth_iterator::operator+=(unsigned int num
)
2496 template <class T
, class tree_node_allocator
>
2497 tree
<T
, tree_node_allocator
>::sibling_iterator::sibling_iterator()
2503 template <class T
, class tree_node_allocator
>
2504 tree
<T
, tree_node_allocator
>::sibling_iterator::sibling_iterator(tree_node
*tn
)
2510 template <class T
, class tree_node_allocator
>
2511 tree
<T
, tree_node_allocator
>::sibling_iterator::sibling_iterator(const iterator_base
& other
)
2512 : iterator_base(other
.node
)
2517 template <class T
, class tree_node_allocator
>
2518 tree
<T
, tree_node_allocator
>::sibling_iterator::sibling_iterator(const sibling_iterator
& other
)
2519 : iterator_base(other
), parent_(other
.parent_
)
2523 template <class T
, class tree_node_allocator
>
2524 void tree
<T
, tree_node_allocator
>::sibling_iterator::set_parent_()
2527 if(this->node
==0) return;
2528 if(this->node
->parent
!=0)
2529 parent_
=this->node
->parent
;
2532 template <class T
, class tree_node_allocator
>
2533 typename tree
<T
, tree_node_allocator
>::sibling_iterator
& tree
<T
, tree_node_allocator
>::sibling_iterator::operator++()
2536 this->node
=this->node
->next_sibling
;
2540 template <class T
, class tree_node_allocator
>
2541 typename tree
<T
, tree_node_allocator
>::sibling_iterator
& tree
<T
, tree_node_allocator
>::sibling_iterator::operator--()
2543 if(this->node
) this->node
=this->node
->prev_sibling
;
2546 this->node
=parent_
->last_child
;
2551 template <class T
, class tree_node_allocator
>
2552 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::sibling_iterator::operator++(int)
2554 sibling_iterator copy
= *this;
2559 template <class T
, class tree_node_allocator
>
2560 typename tree
<T
, tree_node_allocator
>::sibling_iterator tree
<T
, tree_node_allocator
>::sibling_iterator::operator--(int)
2562 sibling_iterator copy
= *this;
2567 template <class T
, class tree_node_allocator
>
2568 typename tree
<T
, tree_node_allocator
>::sibling_iterator
& tree
<T
, tree_node_allocator
>::sibling_iterator::operator+=(unsigned int num
)
2577 template <class T
, class tree_node_allocator
>
2578 typename tree
<T
, tree_node_allocator
>::sibling_iterator
& tree
<T
, tree_node_allocator
>::sibling_iterator::operator-=(unsigned int num
)
2587 template <class T
, class tree_node_allocator
>
2588 typename tree
<T
, tree_node_allocator
>::tree_node
*tree
<T
, tree_node_allocator
>::sibling_iterator::range_first() const
2590 tree_node
*tmp
=parent_
->first_child
;
2594 template <class T
, class tree_node_allocator
>
2595 typename tree
<T
, tree_node_allocator
>::tree_node
*tree
<T
, tree_node_allocator
>::sibling_iterator::range_last() const
2597 return parent_
->last_child
;
2602 template <class T
, class tree_node_allocator
>
2603 tree
<T
, tree_node_allocator
>::leaf_iterator::leaf_iterator()
2604 : iterator_base(0), top_node(0)
2608 template <class T
, class tree_node_allocator
>
2609 tree
<T
, tree_node_allocator
>::leaf_iterator::leaf_iterator(tree_node
*tn
, tree_node
*top
)
2610 : iterator_base(tn
), top_node(top
)
2614 template <class T
, class tree_node_allocator
>
2615 tree
<T
, tree_node_allocator
>::leaf_iterator::leaf_iterator(const iterator_base
&other
)
2616 : iterator_base(other
.node
), top_node(0)
2620 template <class T
, class tree_node_allocator
>
2621 tree
<T
, tree_node_allocator
>::leaf_iterator::leaf_iterator(const sibling_iterator
& other
)
2622 : iterator_base(other
.node
), top_node(0)
2625 if(other
.range_last()!=0)
2626 this->node
=other
.range_last();
2628 this->node
=other
.parent_
;
2633 template <class T
, class tree_node_allocator
>
2634 typename tree
<T
, tree_node_allocator
>::leaf_iterator
& tree
<T
, tree_node_allocator
>::leaf_iterator::operator++()
2636 assert(this->node
!=0);
2637 if(this->node
->first_child
!=0) { // current node is no longer leaf (children got added)
2638 while(this->node
->first_child
)
2639 this->node
=this->node
->first_child
;
2642 while(this->node
->next_sibling
==0) {
2643 if (this->node
->parent
==0) return *this;
2644 this->node
=this->node
->parent
;
2645 if (top_node
!= 0 && this->node
==top_node
) return *this;
2647 this->node
=this->node
->next_sibling
;
2648 while(this->node
->first_child
)
2649 this->node
=this->node
->first_child
;
2654 template <class T
, class tree_node_allocator
>
2655 typename tree
<T
, tree_node_allocator
>::leaf_iterator
& tree
<T
, tree_node_allocator
>::leaf_iterator::operator--()
2657 assert(this->node
!=0);
2658 while (this->node
->prev_sibling
==0) {
2659 if (this->node
->parent
==0) return *this;
2660 this->node
=this->node
->parent
;
2661 if (top_node
!=0 && this->node
==top_node
) return *this;
2663 this->node
=this->node
->prev_sibling
;
2664 while(this->node
->last_child
)
2665 this->node
=this->node
->last_child
;
2669 template <class T
, class tree_node_allocator
>
2670 typename tree
<T
, tree_node_allocator
>::leaf_iterator tree
<T
, tree_node_allocator
>::leaf_iterator::operator++(int)
2672 leaf_iterator copy
= *this;
2677 template <class T
, class tree_node_allocator
>
2678 typename tree
<T
, tree_node_allocator
>::leaf_iterator tree
<T
, tree_node_allocator
>::leaf_iterator::operator--(int)
2680 leaf_iterator copy
= *this;
2686 template <class T
, class tree_node_allocator
>
2687 typename tree
<T
, tree_node_allocator
>::leaf_iterator
& tree
<T
, tree_node_allocator
>::leaf_iterator::operator+=(unsigned int num
)
2696 template <class T
, class tree_node_allocator
>
2697 typename tree
<T
, tree_node_allocator
>::leaf_iterator
& tree
<T
, tree_node_allocator
>::leaf_iterator::operator-=(unsigned int num
)
2709 // default-tab-width: 3