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).
8
/** The tree.hh library for C++ provides an STL-like container class
9
for n-ary trees, templated over the data stored at the
10
nodes. Various types of iterators are provided (post-order,
11
pre-order, and others). Where possible the access methods are
12
compatible with the STL or alternative algorithms are
29
// HP-style construct/destroy have gone from the standard,
34
template <class T1, class T2>
35
void constructor(T1* p, T2& val)
37
new ((void *) p) T1(val);
41
void constructor(T1* p)
47
void destructor(T1* p)
54
/// A node in the tree, combining links to other nodes as well as the actual data.
56
class tree_node_ { // size: 5*4=20 bytes (on 32 bit arch), can be reduced by 8.
58
tree_node_<T> *parent;
59
tree_node_<T> *first_child, *last_child;
60
tree_node_<T> *prev_sibling, *next_sibling;
62
}; // __attribute__((packed));
64
template <class T, class tree_node_allocator = std::allocator<tree_node_<T> > >
67
typedef tree_node_<T> tree_node;
69
/// Value of the data stored at a node.
73
class pre_order_iterator;
74
class post_order_iterator;
75
class sibling_iterator;
80
tree(const iterator_base&);
81
tree(const tree<T, tree_node_allocator>&);
83
void operator=(const tree<T, tree_node_allocator>&);
85
/// Base class for iterators, only pointers stored, no traversal logic.
87
class iterator_base : public stlport::bidirectional_iterator<T, ptrdiff_t> {
95
typedef size_t size_type;
96
typedef ptrdiff_t difference_type;
97
typedef std::bidirectional_iterator_tag iterator_category;
100
iterator_base(tree_node *);
102
T& operator*() const;
103
T* operator->() const;
105
/// When called, the next increment/decrement skips children of this node.
106
void skip_children();
107
void skip_children(bool skip);
108
/// Number of children of the node pointed to by the iterator.
109
unsigned int number_of_children() const;
111
sibling_iterator begin() const;
112
sibling_iterator end() const;
116
bool skip_current_children_;
119
/// Depth-first iterator, first accessing the node, then its children.
120
class pre_order_iterator : public iterator_base {
122
pre_order_iterator();
123
pre_order_iterator(tree_node *);
124
pre_order_iterator(const iterator_base&);
125
pre_order_iterator(const sibling_iterator&);
127
bool operator==(const pre_order_iterator&) const;
128
bool operator!=(const pre_order_iterator&) const;
129
pre_order_iterator& operator++();
130
pre_order_iterator& operator--();
131
pre_order_iterator operator++(int);
132
pre_order_iterator operator--(int);
133
pre_order_iterator& operator+=(unsigned int);
134
pre_order_iterator& operator-=(unsigned int);
137
/// Depth-first iterator, first accessing the children, then the node itself.
138
class post_order_iterator : public iterator_base {
140
post_order_iterator();
141
post_order_iterator(tree_node *);
142
post_order_iterator(const iterator_base&);
143
post_order_iterator(const sibling_iterator&);
145
bool operator==(const post_order_iterator&) const;
146
bool operator!=(const post_order_iterator&) const;
147
post_order_iterator& operator++();
148
post_order_iterator& operator--();
149
post_order_iterator operator++(int);
150
post_order_iterator operator--(int);
151
post_order_iterator& operator+=(unsigned int);
152
post_order_iterator& operator-=(unsigned int);
154
/// Set iterator to the first child as deep as possible down the tree.
158
/// Breadth-first iterator, using a queue
159
class breadth_first_queued_iterator : public iterator_base {
161
breadth_first_queued_iterator();
162
breadth_first_queued_iterator(tree_node *);
163
breadth_first_queued_iterator(const iterator_base&);
165
bool operator==(const breadth_first_queued_iterator&) const;
166
bool operator!=(const breadth_first_queued_iterator&) const;
167
breadth_first_queued_iterator& operator++();
168
breadth_first_queued_iterator operator++(int);
169
breadth_first_queued_iterator& operator+=(unsigned int);
172
std::queue<tree_node *> traversal_queue;
175
/// The default iterator types throughout the tree class.
176
typedef pre_order_iterator iterator;
177
typedef breadth_first_queued_iterator breadth_first_iterator;
179
/// Iterator which traverses only the nodes at a given depth from the root.
180
class fixed_depth_iterator : public iterator_base {
182
fixed_depth_iterator();
183
fixed_depth_iterator(tree_node *);
184
fixed_depth_iterator(const iterator_base&);
185
fixed_depth_iterator(const sibling_iterator&);
186
fixed_depth_iterator(const fixed_depth_iterator&);
188
bool operator==(const fixed_depth_iterator&) const;
189
bool operator!=(const fixed_depth_iterator&) const;
190
fixed_depth_iterator& operator++();
191
fixed_depth_iterator& operator--();
192
fixed_depth_iterator operator++(int);
193
fixed_depth_iterator operator--(int);
194
fixed_depth_iterator& operator+=(unsigned int);
195
fixed_depth_iterator& operator-=(unsigned int);
200
/// Iterator which traverses only the nodes which are siblings of each other.
201
class sibling_iterator : public iterator_base {
204
sibling_iterator(tree_node *);
205
sibling_iterator(const sibling_iterator&);
206
sibling_iterator(const iterator_base&);
208
bool operator==(const sibling_iterator&) const;
209
bool operator!=(const sibling_iterator&) const;
210
sibling_iterator& operator++();
211
sibling_iterator& operator--();
212
sibling_iterator operator++(int);
213
sibling_iterator operator--(int);
214
sibling_iterator& operator+=(unsigned int);
215
sibling_iterator& operator-=(unsigned int);
217
tree_node *range_first() const;
218
tree_node *range_last() const;
224
/// Iterator which traverses only the leaves.
225
class leaf_iterator : public iterator_base {
228
leaf_iterator(tree_node *, tree_node *top=0);
229
leaf_iterator(const sibling_iterator&);
230
leaf_iterator(const iterator_base&);
232
bool operator==(const leaf_iterator&) const;
233
bool operator!=(const leaf_iterator&) const;
234
leaf_iterator& operator++();
235
leaf_iterator& operator--();
236
leaf_iterator operator++(int);
237
leaf_iterator operator--(int);
238
leaf_iterator& operator+=(unsigned int);
239
leaf_iterator& operator-=(unsigned int);
244
/// Return iterator to the beginning of the tree.
245
inline pre_order_iterator begin() const;
246
/// Return iterator to the end of the tree.
247
inline pre_order_iterator end() const;
248
/// Return post-order iterator to the beginning of the tree.
249
post_order_iterator begin_post() const;
250
/// Return post-order end iterator of the tree.
251
post_order_iterator end_post() const;
252
/// Return fixed-depth iterator to the first node at a given depth from the given iterator.
253
fixed_depth_iterator begin_fixed(const iterator_base&, unsigned int) const;
254
/// Return fixed-depth end iterator.
255
fixed_depth_iterator end_fixed(const iterator_base&, unsigned int) const;
256
/// Return breadth-first iterator to the first node at a given depth.
257
breadth_first_queued_iterator begin_breadth_first() const;
258
/// Return breadth-first end iterator.
259
breadth_first_queued_iterator end_breadth_first() const;
260
/// Return sibling iterator to the first child of given node.
261
sibling_iterator begin(const iterator_base&) const;
262
/// Return sibling end iterator for children of given node.
263
sibling_iterator end(const iterator_base&) const;
264
/// Return leaf iterator to the first leaf of the tree.
265
leaf_iterator begin_leaf() const;
266
/// Return leaf end iterator for entire tree.
267
leaf_iterator end_leaf() const;
268
/// Return leaf iterator to the first leaf of the subtree at the given node.
269
leaf_iterator begin_leaf(const iterator_base& top) const;
270
/// Return leaf end iterator for the subtree at the given node.
271
leaf_iterator end_leaf(const iterator_base& top) const;
273
/// Return iterator to the parent of a node.
274
template<typename iter> static iter parent(iter);
275
/// Return iterator to the previous sibling of a node.
276
template<typename iter> iter previous_sibling(iter) const;
277
/// Return iterator to the next sibling of a node.
278
template<typename iter> iter next_sibling(iter) const;
279
/// Return iterator to the next node at a given depth.
280
template<typename iter> iter next_at_same_depth(iter) const;
282
/// Erase all nodes of the tree.
284
/// Erase element at position pointed to by iterator, return incremented iterator.
285
template<typename iter> iter erase(iter);
286
/// Erase all children of the node pointed to by iterator.
287
void erase_children(const iterator_base&);
289
/// Insert empty node as last/first child of node pointed to by position.
290
template<typename iter> iter append_child(iter position);
291
template<typename iter> iter prepend_child(iter position);
292
/// Insert node as last/first child of node pointed to by position.
293
template<typename iter> iter append_child(iter position, const T& x);
294
template<typename iter> iter prepend_child(iter position, const T& x);
295
/// Append the node (plus its children) at other_position as last/first child of position.
296
template<typename iter> iter append_child(iter position, iter other_position);
297
template<typename iter> iter prepend_child(iter position, iter other_position);
298
/// Append the nodes in the from-to range (plus their children) as last/first children of position.
299
template<typename iter> iter append_children(iter position, sibling_iterator from, sibling_iterator to);
300
template<typename iter> iter prepend_children(iter position, sibling_iterator from, sibling_iterator to);
302
/// Short-hand to insert topmost node in otherwise empty tree.
303
pre_order_iterator set_head(const T& x);
304
/// Insert node as previous sibling of node pointed to by position.
305
template<typename iter> iter insert(iter position, const T& x);
306
/// Specialisation of previous member.
307
sibling_iterator insert(sibling_iterator position, const T& x);
308
/// Insert node (with children) pointed to by subtree as previous sibling of node pointed to by position.
309
template<typename iter> iter insert_subtree(iter position, const iterator_base& subtree);
310
/// Insert node as next sibling of node pointed to by position.
311
template<typename iter> iter insert_after(iter position, const T& x);
312
/// Insert node (with children) pointed to by subtree as next sibling of node pointed to by position.
313
template<typename iter> iter insert_subtree_after(iter position, const iterator_base& subtree);
315
/// Replace node at 'position' with other node (keeping same children); 'position' becomes invalid.
316
template<typename iter> iter replace(iter position, const T& x);
317
/// Replace node at 'position' with subtree starting at 'from' (do not erase subtree at 'from'); see above.
318
template<typename iter> iter replace(iter position, const iterator_base& from);
319
/// Replace string of siblings (plus their children) with copy of a new string (with children); see above
320
sibling_iterator replace(sibling_iterator orig_begin, sibling_iterator orig_end,
321
sibling_iterator new_begin, sibling_iterator new_end);
323
/// Move all children of node at 'position' to be siblings, returns position.
324
template<typename iter> iter flatten(iter position);
325
/// Move nodes in range to be children of 'position'.
326
template<typename iter> iter reparent(iter position, sibling_iterator begin, sibling_iterator end);
327
/// Move all child nodes of 'from' to be children of 'position'.
328
template<typename iter> iter reparent(iter position, iter from);
330
/// Replace node with a new node, making the old node a child of the new node.
331
template<typename iter> iter wrap(iter position, const T& x);
333
/// Move 'source' node (plus its children) to become the next sibling of 'target'.
334
template<typename iter> iter move_after(iter target, iter source);
335
/// Move 'source' node (plus its children) to become the previous sibling of 'target'.
336
template<typename iter> iter move_before(iter target, iter source);
337
sibling_iterator move_before(sibling_iterator target, sibling_iterator source);
338
/// Move 'source' node (plus its children) to become the node at 'target' (erasing the node at 'target').
339
template<typename iter> iter move_ontop(iter target, iter source);
341
/// Merge with other tree, creating new branches and leaves only if they are not already present.
342
void merge(sibling_iterator, sibling_iterator, sibling_iterator, sibling_iterator,
343
bool duplicate_leaves=false);
344
/// Sort (std::sort only moves values of nodes, this one moves children as well).
345
void sort(sibling_iterator from, sibling_iterator to, bool deep=false);
346
template<class StrictWeakOrdering>
347
void sort(sibling_iterator from, sibling_iterator to, StrictWeakOrdering comp, bool deep=false);
348
/// Compare two ranges of nodes (compares nodes as well as tree structure).
349
template<typename iter>
350
bool equal(const iter& one, const iter& two, const iter& three) const;
351
template<typename iter, class BinaryPredicate>
352
bool equal(const iter& one, const iter& two, const iter& three, BinaryPredicate) const;
353
template<typename iter>
354
bool equal_subtree(const iter& one, const iter& two) const;
355
template<typename iter, class BinaryPredicate>
356
bool equal_subtree(const iter& one, const iter& two, BinaryPredicate) const;
357
/// Extract a new tree formed by the range of siblings plus all their children.
358
tree subtree(sibling_iterator from, sibling_iterator to) const;
359
void subtree(tree&, sibling_iterator from, sibling_iterator to) const;
360
/// Exchange the node (plus subtree) with its sibling node (do nothing if no sibling present).
361
void swap(sibling_iterator it);
362
/// Exchange two nodes (plus subtrees)
363
void swap(iterator, iterator);
365
/// Count the total number of nodes.
367
/// Count the total number of nodes below the indicated node (plus one).
368
size_t size(const iterator_base&) const;
369
/// Check if tree is empty.
371
/// Compute the depth to the root or to a fixed other iterator.
372
static int depth(const iterator_base&);
373
static int depth(const iterator_base&, const iterator_base&);
374
/// Determine the maximal depth of the tree. An empty tree has max_depth=-1.
375
int max_depth() const;
376
/// Determine the maximal depth of the tree with top node at the given position.
377
int max_depth(const iterator_base&) const;
378
/// Count the number of children of node at position.
379
static unsigned int number_of_children(const iterator_base&);
380
/// Count the number of siblings (left and right) of node at iterator. Total nodes at this level is +1.
381
unsigned int number_of_siblings(const iterator_base&) const;
382
/// Determine whether node at position is in the subtrees with root in the range.
383
bool is_in_subtree(const iterator_base& position, const iterator_base& begin,
384
const iterator_base& end) const;
385
/// Determine whether the iterator is an 'end' iterator and thus not actually pointing to a node.
386
bool is_valid(const iterator_base&) const;
388
/// Determine the index of a node in the range of siblings to which it belongs.
389
unsigned int index(sibling_iterator it) const;
390
/// Inverse of 'index': return the n-th child of the node at position.
391
static sibling_iterator child(const iterator_base& position, unsigned int);
392
/// Return iterator to the sibling indicated by index
393
sibling_iterator sibling(const iterator_base& position, unsigned int);
395
/// Comparator class for iterators (compares pointer values; why doesn't this work automatically?)
396
class iterator_base_less {
398
bool operator()(const typename tree<T, tree_node_allocator>::iterator_base& one,
399
const typename tree<T, tree_node_allocator>::iterator_base& two) const
401
return one.node < two.node;
404
tree_node *head, *feet; // head/feet are always dummy; if an iterator points to them it is invalid
406
tree_node_allocator alloc_;
407
void head_initialise_();
408
void copy_(const tree<T, tree_node_allocator>& other);
410
/// Comparator class for two nodes of a tree (used for sorting and searching).
411
template<class StrictWeakOrdering>
412
class compare_nodes {
414
compare_nodes(StrictWeakOrdering comp) : comp_(comp) {};
416
bool operator()(const tree_node *a, const tree_node *b)
418
return comp_(a->data, b->data);
421
StrictWeakOrdering comp_;
425
//template <class T, class tree_node_allocator>
426
//class iterator_base_less {
428
// bool operator()(const typename tree<T, tree_node_allocator>::iterator_base& one,
429
// const typename tree<T, tree_node_allocator>::iterator_base& two) const
431
// txtout << "operatorclass<" << one.node < two.node << std::endl;
432
// return one.node < two.node;
436
// template <class T, class tree_node_allocator>
437
// bool operator<(const typename tree<T, tree_node_allocator>::iterator& one,
438
// const typename tree<T, tree_node_allocator>::iterator& two)
440
// txtout << "operator< " << one.node < two.node << std::endl;
441
// if(one.node < two.node) return true;
445
// template <class T, class tree_node_allocator>
446
// bool operator==(const typename tree<T, tree_node_allocator>::iterator& one,
447
// const typename tree<T, tree_node_allocator>::iterator& two)
449
// txtout << "operator== " << one.node == two.node << std::endl;
450
// if(one.node == two.node) return true;
454
// template <class T, class tree_node_allocator>
455
// bool operator>(const typename tree<T, tree_node_allocator>::iterator_base& one,
456
// const typename tree<T, tree_node_allocator>::iterator_base& two)
458
// txtout << "operator> " << one.node < two.node << std::endl;
459
// if(one.node > two.node) return true;
467
template <class T, class tree_node_allocator>
468
tree<T, tree_node_allocator>::tree()
473
template <class T, class tree_node_allocator>
474
tree<T, tree_node_allocator>::tree(const T& x)
480
template <class T, class tree_node_allocator>
481
tree<T, tree_node_allocator>::tree(const iterator_base& other)
485
replace(begin(), other);
488
template <class T, class tree_node_allocator>
489
tree<T, tree_node_allocator>::~tree()
492
alloc_.deallocate(head,1);
493
alloc_.deallocate(feet,1);
496
template <class T, class tree_node_allocator>
497
void tree<T, tree_node_allocator>::head_initialise_()
499
head = alloc_.allocate(1,0); // MSVC does not have default second argument
500
feet = alloc_.allocate(1,0);
505
head->prev_sibling=0; //head;
506
head->next_sibling=feet; //head;
511
feet->prev_sibling=head;
512
feet->next_sibling=0;
515
template <class T, class tree_node_allocator>
516
void tree<T, tree_node_allocator>::operator=(const tree<T, tree_node_allocator>& other)
521
template <class T, class tree_node_allocator>
522
tree<T, tree_node_allocator>::tree(const tree<T, tree_node_allocator>& other)
528
template <class T, class tree_node_allocator>
529
void tree<T, tree_node_allocator>::copy_(const tree<T, tree_node_allocator>& other)
532
pre_order_iterator it=other.begin(), to=begin();
533
while(it!=other.end()) {
534
to=insert(to, (*it));
540
while(it!=other.end()) {
549
template <class T, class tree_node_allocator>
550
void tree<T, tree_node_allocator>::clear()
553
while(head->next_sibling!=feet)
554
erase(pre_order_iterator(head->next_sibling));
557
template<class T, class tree_node_allocator>
558
void tree<T, tree_node_allocator>::erase_children(const iterator_base& it)
560
// std::cout << "erase_children " << it.node << std::endl;
561
if(it.node==0) return;
563
tree_node *cur=it.node->first_child;
568
cur=cur->next_sibling;
569
erase_children(pre_order_iterator(prev));
570
kp::destructor(&prev->data);
571
alloc_.deallocate(prev,1);
573
it.node->first_child=0;
574
it.node->last_child=0;
575
// std::cout << "exit" << std::endl;
578
template<class T, class tree_node_allocator>
580
iter tree<T, tree_node_allocator>::erase(iter it)
582
tree_node *cur=it.node;
588
if(cur->prev_sibling==0) {
589
cur->parent->first_child=cur->next_sibling;
592
cur->prev_sibling->next_sibling=cur->next_sibling;
594
if(cur->next_sibling==0) {
595
cur->parent->last_child=cur->prev_sibling;
598
cur->next_sibling->prev_sibling=cur->prev_sibling;
601
kp::destructor(&cur->data);
602
alloc_.deallocate(cur,1);
606
template <class T, class tree_node_allocator>
607
typename tree<T, tree_node_allocator>::pre_order_iterator tree<T, tree_node_allocator>::begin() const
609
return pre_order_iterator(head->next_sibling);
612
template <class T, class tree_node_allocator>
613
typename tree<T, tree_node_allocator>::pre_order_iterator tree<T, tree_node_allocator>::end() const
615
return pre_order_iterator(feet);
618
template <class T, class tree_node_allocator>
619
typename tree<T, tree_node_allocator>::breadth_first_queued_iterator tree<T, tree_node_allocator>::begin_breadth_first() const
621
return breadth_first_queued_iterator(head->next_sibling);
624
template <class T, class tree_node_allocator>
625
typename tree<T, tree_node_allocator>::breadth_first_queued_iterator tree<T, tree_node_allocator>::end_breadth_first() const
627
return breadth_first_queued_iterator();
630
template <class T, class tree_node_allocator>
631
typename tree<T, tree_node_allocator>::post_order_iterator tree<T, tree_node_allocator>::begin_post() const
633
tree_node *tmp=head->next_sibling;
635
while(tmp->first_child)
636
tmp=tmp->first_child;
638
return post_order_iterator(tmp);
641
template <class T, class tree_node_allocator>
642
typename tree<T, tree_node_allocator>::post_order_iterator tree<T, tree_node_allocator>::end_post() const
644
return post_order_iterator(feet);
647
template <class T, class tree_node_allocator>
648
typename tree<T, tree_node_allocator>::fixed_depth_iterator tree<T, tree_node_allocator>::begin_fixed(const iterator_base& pos, unsigned int dp) const
650
typename tree<T, tree_node_allocator>::fixed_depth_iterator ret;
651
ret.top_node=pos.node;
653
tree_node *tmp=pos.node;
654
unsigned int curdepth=0;
655
while(curdepth<dp) { // go down one level
656
while(tmp->first_child==0) {
657
if(tmp->next_sibling==0) {
658
// try to walk up and then right again
660
if(tmp==ret.top_node)
661
throw std::range_error("tree: begin_fixed out of range");
664
throw std::range_error("tree: begin_fixed out of range");
666
} while(tmp->next_sibling==0);
668
tmp=tmp->next_sibling;
670
tmp=tmp->first_child;
678
template <class T, class tree_node_allocator>
679
typename tree<T, tree_node_allocator>::fixed_depth_iterator tree<T, tree_node_allocator>::end_fixed(const iterator_base& pos, unsigned int dp) const
681
assert(1==0); // FIXME: not correct yet: use is_valid() as a temporary workaround
682
tree_node *tmp=pos.node;
683
unsigned int curdepth=1;
684
while(curdepth<dp) { // go down one level
685
while(tmp->first_child==0) {
686
tmp=tmp->next_sibling;
688
throw std::range_error("tree: end_fixed out of range");
690
tmp=tmp->first_child;
696
template <class T, class tree_node_allocator>
697
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::begin(const iterator_base& pos) const
700
if(pos.node->first_child==0) {
703
return pos.node->first_child;
706
template <class T, class tree_node_allocator>
707
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::end(const iterator_base& pos) const
709
sibling_iterator ret(0);
710
ret.parent_=pos.node;
714
template <class T, class tree_node_allocator>
715
typename tree<T, tree_node_allocator>::leaf_iterator tree<T, tree_node_allocator>::begin_leaf() const
717
tree_node *tmp=head->next_sibling;
719
while(tmp->first_child)
720
tmp=tmp->first_child;
722
return leaf_iterator(tmp);
725
template <class T, class tree_node_allocator>
726
typename tree<T, tree_node_allocator>::leaf_iterator tree<T, tree_node_allocator>::end_leaf() const
728
return leaf_iterator(feet);
731
template <class T, class tree_node_allocator>
732
typename tree<T, tree_node_allocator>::leaf_iterator tree<T, tree_node_allocator>::begin_leaf(const iterator_base& top) const
734
tree_node *tmp=top.node;
735
while(tmp->first_child)
736
tmp=tmp->first_child;
737
return leaf_iterator(tmp, top.node);
740
template <class T, class tree_node_allocator>
741
typename tree<T, tree_node_allocator>::leaf_iterator tree<T, tree_node_allocator>::end_leaf(const iterator_base& top) const
743
return leaf_iterator(top.node, top.node);
746
template <class T, class tree_node_allocator>
747
template <typename iter>
748
iter tree<T, tree_node_allocator>::parent(iter position)
750
assert(position.node!=0);
751
return iter(position.node->parent);
754
template <class T, class tree_node_allocator>
755
template <typename iter>
756
iter tree<T, tree_node_allocator>::previous_sibling(iter position) const
758
assert(position.node!=0);
760
ret.node=position.node->prev_sibling;
764
template <class T, class tree_node_allocator>
765
template <typename iter>
766
iter tree<T, tree_node_allocator>::next_sibling(iter position) const
768
assert(position.node!=0);
770
ret.node=position.node->next_sibling;
774
template <class T, class tree_node_allocator>
775
template <typename iter>
776
iter tree<T, tree_node_allocator>::next_at_same_depth(iter position) const
778
// We make use of a temporary fixed_depth iterator to implement this.
780
typename tree<T, tree_node_allocator>::fixed_depth_iterator tmp(position.node);
785
// assert(position.node!=0);
786
// iter ret(position);
788
// if(position.node->next_sibling) {
789
// ret.node=position.node->next_sibling;
792
// int relative_depth=0;
795
// ret.node=ret.node->parent;
796
// if(ret.node==0) return ret;
798
// } while(ret.node->next_sibling==0);
800
// ret.node=ret.node->next_sibling;
801
// while(ret.node->first_child==0) {
802
// if(ret.node->next_sibling==0)
804
// ret.node=ret.node->next_sibling;
805
// if(ret.node==0) return ret;
807
// while(relative_depth<0 && ret.node->first_child!=0) {
808
// ret.node=ret.node->first_child;
811
// if(relative_depth<0) {
812
// if(ret.node->next_sibling==0) goto upper;
819
template <class T, class tree_node_allocator>
820
template <typename iter>
821
iter tree<T, tree_node_allocator>::append_child(iter position)
823
assert(position.node!=head);
824
assert(position.node);
826
tree_node *tmp=alloc_.allocate(1,0);
827
kp::constructor(&tmp->data);
831
tmp->parent=position.node;
832
if(position.node->last_child!=0) {
833
position.node->last_child->next_sibling=tmp;
836
position.node->first_child=tmp;
838
tmp->prev_sibling=position.node->last_child;
839
position.node->last_child=tmp;
844
template <class T, class tree_node_allocator>
845
template <typename iter>
846
iter tree<T, tree_node_allocator>::prepend_child(iter position)
848
assert(position.node!=head);
849
assert(position.node);
851
tree_node *tmp=alloc_.allocate(1,0);
852
kp::constructor(&tmp->data);
856
tmp->parent=position.node;
857
if(position.node->first_child!=0) {
858
position.node->first_child->prev_sibling=tmp;
861
position.node->last_child=tmp;
863
tmp->next_sibling=position.node->first_child;
864
position.node->prev_child=tmp;
869
template <class T, class tree_node_allocator>
870
template <class iter>
871
iter tree<T, tree_node_allocator>::append_child(iter position, const T& x)
873
// If your program fails here you probably used 'append_child' to add the top
874
// node to an empty tree. From version 1.45 the top element should be added
875
// using 'insert'. See the documentation for further information, and sorry about
877
assert(position.node!=head);
878
assert(position.node);
880
tree_node* tmp = alloc_.allocate(1,0);
881
kp::constructor(&tmp->data, x);
885
tmp->parent=position.node;
886
if(position.node->last_child!=0) {
887
position.node->last_child->next_sibling=tmp;
890
position.node->first_child=tmp;
892
tmp->prev_sibling=position.node->last_child;
893
position.node->last_child=tmp;
898
template <class T, class tree_node_allocator>
899
template <class iter>
900
iter tree<T, tree_node_allocator>::prepend_child(iter position, const T& x)
902
assert(position.node!=head);
903
assert(position.node);
905
tree_node* tmp = alloc_.allocate(1,0);
906
kp::constructor(&tmp->data, x);
910
tmp->parent=position.node;
911
if(position.node->first_child!=0) {
912
position.node->first_child->prev_sibling=tmp;
915
position.node->last_child=tmp;
917
tmp->next_sibling=position.node->first_child;
918
position.node->first_child=tmp;
923
template <class T, class tree_node_allocator>
924
template <class iter>
925
iter tree<T, tree_node_allocator>::append_child(iter position, iter other)
927
assert(position.node!=head);
928
assert(position.node);
930
sibling_iterator aargh=append_child(position, value_type());
931
return replace(aargh, other);
934
template <class T, class tree_node_allocator>
935
template <class iter>
936
iter tree<T, tree_node_allocator>::prepend_child(iter position, iter other)
938
assert(position.node!=head);
939
assert(position.node);
941
sibling_iterator aargh=prepend_child(position, value_type());
942
return replace(aargh, other);
945
template <class T, class tree_node_allocator>
946
template <class iter>
947
iter tree<T, tree_node_allocator>::append_children(iter position, sibling_iterator from, sibling_iterator to)
949
assert(position.node!=head);
950
assert(position.node);
955
insert_subtree(position.end(), from);
961
template <class T, class tree_node_allocator>
962
template <class iter>
963
iter tree<T, tree_node_allocator>::prepend_children(iter position, sibling_iterator from, sibling_iterator to)
965
assert(position.node!=head);
966
assert(position.node);
971
insert_subtree(position.begin(), from);
977
template <class T, class tree_node_allocator>
978
typename tree<T, tree_node_allocator>::pre_order_iterator tree<T, tree_node_allocator>::set_head(const T& x)
980
assert(head->next_sibling==feet);
981
return insert(iterator(feet), x);
984
template <class T, class tree_node_allocator>
985
template <class iter>
986
iter tree<T, tree_node_allocator>::insert(iter position, const T& x)
988
if(position.node==0) {
989
position.node=feet; // Backward compatibility: when calling insert on a null node,
990
// insert before the feet.
992
tree_node* tmp = alloc_.allocate(1,0);
993
kp::constructor(&tmp->data, x);
997
tmp->parent=position.node->parent;
998
tmp->next_sibling=position.node;
999
tmp->prev_sibling=position.node->prev_sibling;
1000
position.node->prev_sibling=tmp;
1002
if(tmp->prev_sibling==0) {
1003
if(tmp->parent) // when inserting nodes at the head, there is no parent
1004
tmp->parent->first_child=tmp;
1007
tmp->prev_sibling->next_sibling=tmp;
1011
template <class T, class tree_node_allocator>
1012
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::insert(sibling_iterator position, const T& x)
1014
tree_node* tmp = alloc_.allocate(1,0);
1015
kp::constructor(&tmp->data, x);
1019
tmp->next_sibling=position.node;
1020
if(position.node==0) { // iterator points to end of a subtree
1021
tmp->parent=position.parent_;
1022
tmp->prev_sibling=position.range_last();
1023
tmp->parent->last_child=tmp;
1026
tmp->parent=position.node->parent;
1027
tmp->prev_sibling=position.node->prev_sibling;
1028
position.node->prev_sibling=tmp;
1031
if(tmp->prev_sibling==0) {
1032
if(tmp->parent) // when inserting nodes at the head, there is no parent
1033
tmp->parent->first_child=tmp;
1036
tmp->prev_sibling->next_sibling=tmp;
1040
template <class T, class tree_node_allocator>
1041
template <class iter>
1042
iter tree<T, tree_node_allocator>::insert_after(iter position, const T& x)
1044
tree_node* tmp = alloc_.allocate(1,0);
1045
kp::constructor(&tmp->data, x);
1049
tmp->parent=position.node->parent;
1050
tmp->prev_sibling=position.node;
1051
tmp->next_sibling=position.node->next_sibling;
1052
position.node->next_sibling=tmp;
1054
if(tmp->next_sibling==0) {
1055
if(tmp->parent) // when inserting nodes at the head, there is no parent
1056
tmp->parent->last_child=tmp;
1059
tmp->next_sibling->prev_sibling=tmp;
1064
template <class T, class tree_node_allocator>
1065
template <class iter>
1066
iter tree<T, tree_node_allocator>::insert_subtree(iter position, const iterator_base& subtree)
1069
iter it=insert(position, value_type());
1070
// replace dummy with subtree
1071
return replace(it, subtree);
1074
template <class T, class tree_node_allocator>
1075
template <class iter>
1076
iter tree<T, tree_node_allocator>::insert_subtree_after(iter position, const iterator_base& subtree)
1079
iter it=insert_after(position, value_type());
1080
// replace dummy with subtree
1081
return replace(it, subtree);
1084
// template <class T, class tree_node_allocator>
1085
// template <class iter>
1086
// iter tree<T, tree_node_allocator>::insert_subtree(sibling_iterator position, iter subtree)
1089
// iter it(insert(position, value_type()));
1090
// // replace dummy with subtree
1091
// return replace(it, subtree);
1094
template <class T, class tree_node_allocator>
1095
template <class iter>
1096
iter tree<T, tree_node_allocator>::replace(iter position, const T& x)
1098
kp::destructor(&position.node->data);
1099
kp::constructor(&position.node->data, x);
1103
template <class T, class tree_node_allocator>
1104
template <class iter>
1105
iter tree<T, tree_node_allocator>::replace(iter position, const iterator_base& from)
1107
assert(position.node!=head);
1108
tree_node *current_from=from.node;
1109
tree_node *start_from=from.node;
1110
tree_node *current_to =position.node;
1112
// replace the node at position with head of the replacement tree at from
1113
// std::cout << "warning!" << position.node << std::endl;
1114
erase_children(position);
1115
// std::cout << "no warning!" << std::endl;
1116
tree_node* tmp = alloc_.allocate(1,0);
1117
kp::constructor(&tmp->data, (*from));
1120
if(current_to->prev_sibling==0) {
1121
if(current_to->parent!=0)
1122
current_to->parent->first_child=tmp;
1125
current_to->prev_sibling->next_sibling=tmp;
1127
tmp->prev_sibling=current_to->prev_sibling;
1128
if(current_to->next_sibling==0) {
1129
if(current_to->parent!=0)
1130
current_to->parent->last_child=tmp;
1133
current_to->next_sibling->prev_sibling=tmp;
1135
tmp->next_sibling=current_to->next_sibling;
1136
tmp->parent=current_to->parent;
1137
kp::destructor(¤t_to->data);
1138
alloc_.deallocate(current_to,1);
1141
// only at this stage can we fix 'last'
1142
tree_node *last=from.node->next_sibling;
1144
pre_order_iterator toit=tmp;
1145
// copy all children
1147
assert(current_from!=0);
1148
if(current_from->first_child != 0) {
1149
current_from=current_from->first_child;
1150
toit=append_child(toit, current_from->data);
1153
while(current_from->next_sibling==0 && current_from!=start_from) {
1154
current_from=current_from->parent;
1156
assert(current_from!=0);
1158
current_from=current_from->next_sibling;
1159
if(current_from!=last) {
1160
toit=append_child(parent(toit), current_from->data);
1163
} while(current_from!=last);
1168
template <class T, class tree_node_allocator>
1169
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::replace(
1170
sibling_iterator orig_begin,
1171
sibling_iterator orig_end,
1172
sibling_iterator new_begin,
1173
sibling_iterator new_end)
1175
tree_node *orig_first=orig_begin.node;
1176
tree_node *new_first=new_begin.node;
1177
tree_node *orig_last=orig_first;
1178
while((++orig_begin)!=orig_end)
1179
orig_last=orig_last->next_sibling;
1180
tree_node *new_last=new_first;
1181
while((++new_begin)!=new_end)
1182
new_last=new_last->next_sibling;
1184
// insert all siblings in new_first..new_last before orig_first
1186
pre_order_iterator ret;
1188
pre_order_iterator tt=insert_subtree(pre_order_iterator(orig_first), pre_order_iterator(new_first));
1193
if(new_first==new_last)
1195
new_first=new_first->next_sibling;
1198
// erase old range of siblings
1200
tree_node *next=orig_first;
1204
next=next->next_sibling;
1205
erase((pre_order_iterator)orig_first);
1213
template <class T, class tree_node_allocator>
1214
template <typename iter>
1215
iter tree<T, tree_node_allocator>::flatten(iter position)
1217
if(position.node->first_child==0)
1220
tree_node *tmp=position.node->first_child;
1222
tmp->parent=position.node->parent;
1223
tmp=tmp->next_sibling;
1225
if(position.node->next_sibling) {
1226
position.node->last_child->next_sibling=position.node->next_sibling;
1227
position.node->next_sibling->prev_sibling=position.node->last_child;
1230
position.node->parent->last_child=position.node->last_child;
1232
position.node->next_sibling=position.node->first_child;
1233
position.node->next_sibling->prev_sibling=position.node;
1234
position.node->first_child=0;
1235
position.node->last_child=0;
1241
template <class T, class tree_node_allocator>
1242
template <typename iter>
1243
iter tree<T, tree_node_allocator>::reparent(iter position, sibling_iterator begin, sibling_iterator end)
1245
tree_node *first=begin.node;
1246
tree_node *last=first;
1248
assert(first!=position.node);
1250
if(begin==end) return begin;
1251
// determine last node
1252
while((++begin)!=end) {
1253
last=last->next_sibling;
1256
if(first->prev_sibling==0) {
1257
first->parent->first_child=last->next_sibling;
1260
first->prev_sibling->next_sibling=last->next_sibling;
1262
if(last->next_sibling==0) {
1263
last->parent->last_child=first->prev_sibling;
1266
last->next_sibling->prev_sibling=first->prev_sibling;
1268
if(position.node->first_child==0) {
1269
position.node->first_child=first;
1270
position.node->last_child=last;
1271
first->prev_sibling=0;
1274
position.node->last_child->next_sibling=first;
1275
first->prev_sibling=position.node->last_child;
1276
position.node->last_child=last;
1278
last->next_sibling=0;
1280
tree_node *pos=first;
1282
pos->parent=position.node;
1283
if(pos==last) break;
1284
pos=pos->next_sibling;
1290
template <class T, class tree_node_allocator>
1291
template <typename iter> iter tree<T, tree_node_allocator>::reparent(iter position, iter from)
1293
if(from.node->first_child==0) return position;
1294
return reparent(position, from.node->first_child, end(from));
1297
template <class T, class tree_node_allocator>
1298
template <typename iter> iter tree<T, tree_node_allocator>::wrap(iter position, const T& x)
1300
assert(position.node!=0);
1301
sibling_iterator fr=position, to=position;
1303
iter ret = insert(position, x);
1304
reparent(ret, fr, to);
1308
template <class T, class tree_node_allocator>
1309
template <typename iter> iter tree<T, tree_node_allocator>::move_after(iter target, iter source)
1311
tree_node *dst=target.node;
1312
tree_node *src=source.node;
1316
if(dst==src) return source;
1317
if(dst->next_sibling)
1318
if(dst->next_sibling==src) // already in the right spot
1321
// take src out of the tree
1322
if(src->prev_sibling!=0) src->prev_sibling->next_sibling=src->next_sibling;
1323
else src->parent->first_child=src->next_sibling;
1324
if(src->next_sibling!=0) src->next_sibling->prev_sibling=src->prev_sibling;
1325
else src->parent->last_child=src->prev_sibling;
1327
// connect it to the new point
1328
if(dst->next_sibling!=0) dst->next_sibling->prev_sibling=src;
1329
else dst->parent->last_child=src;
1330
src->next_sibling=dst->next_sibling;
1331
dst->next_sibling=src;
1332
src->prev_sibling=dst;
1333
src->parent=dst->parent;
1337
template <class T, class tree_node_allocator>
1338
template <typename iter> iter tree<T, tree_node_allocator>::move_before(iter target, iter source)
1340
tree_node *dst=target.node;
1341
tree_node *src=source.node;
1345
if(dst==src) return source;
1346
if(dst->prev_sibling)
1347
if(dst->prev_sibling==src) // already in the right spot
1350
// take src out of the tree
1351
if(src->prev_sibling!=0) src->prev_sibling->next_sibling=src->next_sibling;
1352
else src->parent->first_child=src->next_sibling;
1353
if(src->next_sibling!=0) src->next_sibling->prev_sibling=src->prev_sibling;
1354
else src->parent->last_child=src->prev_sibling;
1356
// connect it to the new point
1357
if(dst->prev_sibling!=0) dst->prev_sibling->next_sibling=src;
1358
else dst->parent->first_child=src;
1359
src->prev_sibling=dst->prev_sibling;
1360
dst->prev_sibling=src;
1361
src->next_sibling=dst;
1362
src->parent=dst->parent;
1366
// specialisation for sibling_iterators
1367
template <class T, class tree_node_allocator>
1368
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::move_before(sibling_iterator target,
1369
sibling_iterator source)
1371
tree_node *dst=target.node;
1372
tree_node *src=source.node;
1373
tree_node *dst_prev_sibling;
1374
if(dst==0) { // must then be an end iterator
1375
dst_prev_sibling=target.parent_->last_child;
1376
assert(dst_prev_sibling);
1378
else dst_prev_sibling=dst->prev_sibling;
1381
if(dst==src) return source;
1382
if(dst_prev_sibling)
1383
if(dst_prev_sibling==src) // already in the right spot
1386
// take src out of the tree
1387
if(src->prev_sibling!=0) src->prev_sibling->next_sibling=src->next_sibling;
1388
else src->parent->first_child=src->next_sibling;
1389
if(src->next_sibling!=0) src->next_sibling->prev_sibling=src->prev_sibling;
1390
else src->parent->last_child=src->prev_sibling;
1392
// connect it to the new point
1393
if(dst_prev_sibling!=0) dst_prev_sibling->next_sibling=src;
1394
else target.parent_->first_child=src;
1395
src->prev_sibling=dst_prev_sibling;
1397
dst->prev_sibling=src;
1398
src->parent=dst->parent;
1400
src->next_sibling=dst;
1404
template <class T, class tree_node_allocator>
1405
template <typename iter> iter tree<T, tree_node_allocator>::move_ontop(iter target, iter source)
1407
tree_node *dst=target.node;
1408
tree_node *src=source.node;
1412
if(dst==src) return source;
1414
// remember connection points
1415
tree_node *b_prev_sibling=dst->prev_sibling;
1416
tree_node *b_next_sibling=dst->next_sibling;
1417
tree_node *b_parent=dst->parent;
1422
// take src out of the tree
1423
if(src->prev_sibling!=0) src->prev_sibling->next_sibling=src->next_sibling;
1424
else src->parent->first_child=src->next_sibling;
1425
if(src->next_sibling!=0) src->next_sibling->prev_sibling=src->prev_sibling;
1426
else src->parent->last_child=src->prev_sibling;
1428
// connect it to the new point
1429
if(b_prev_sibling!=0) b_prev_sibling->next_sibling=src;
1430
else b_parent->first_child=src;
1431
if(b_next_sibling!=0) b_next_sibling->prev_sibling=src;
1432
else b_parent->last_child=src;
1433
src->prev_sibling=b_prev_sibling;
1434
src->next_sibling=b_next_sibling;
1435
src->parent=b_parent;
1439
template <class T, class tree_node_allocator>
1440
void tree<T, tree_node_allocator>::merge(sibling_iterator to1, sibling_iterator to2,
1441
sibling_iterator from1, sibling_iterator from2,
1442
bool duplicate_leaves)
1444
sibling_iterator fnd;
1445
while(from1!=from2) {
1446
if((fnd=std::find(to1, to2, (*from1))) != to2) { // element found
1447
if(from1.begin()==from1.end()) { // full depth reached
1448
if(duplicate_leaves)
1449
append_child(parent(to1), (*from1));
1451
else { // descend further
1452
merge(fnd.begin(), fnd.end(), from1.begin(), from1.end(), duplicate_leaves);
1455
else { // element missing
1456
insert_subtree(to2, from1);
1463
template <class T, class tree_node_allocator>
1464
void tree<T, tree_node_allocator>::sort(sibling_iterator from, sibling_iterator to, bool deep)
1467
sort(from, to, comp, deep);
1470
template <class T, class tree_node_allocator>
1471
template <class StrictWeakOrdering>
1472
void tree<T, tree_node_allocator>::sort(sibling_iterator from, sibling_iterator to,
1473
StrictWeakOrdering comp, bool deep)
1475
if(from==to) return;
1476
// make list of sorted nodes
1477
// CHECK: if multiset stores equivalent nodes in the order in which they
1478
// are inserted, then this routine should be called 'stable_sort'.
1479
std::multiset<tree_node *, compare_nodes<StrictWeakOrdering> > nodes(comp);
1480
sibling_iterator it=from, it2=to;
1482
nodes.insert(it.node);
1488
// prev and next are the nodes before and after the sorted range
1489
tree_node *prev=from.node->prev_sibling;
1490
tree_node *next=it2.node->next_sibling;
1491
typename std::multiset<tree_node *, compare_nodes<StrictWeakOrdering> >::iterator nit=nodes.begin(), eit=nodes.end();
1493
if((*nit)->parent!=0) // to catch "sorting the head" situations, when there is no parent
1494
(*nit)->parent->first_child=(*nit);
1496
else prev->next_sibling=(*nit);
1500
(*nit)->prev_sibling=prev;
1502
prev->next_sibling=(*nit);
1506
// prev now points to the last-but-one node in the sorted range
1508
prev->next_sibling=(*eit);
1510
// eit points to the last node in the sorted range.
1511
(*eit)->next_sibling=next;
1512
(*eit)->prev_sibling=prev; // missed in the loop above
1514
if((*eit)->parent!=0) // to catch "sorting the head" situations, when there is no parent
1515
(*eit)->parent->last_child=(*eit);
1517
else next->prev_sibling=(*eit);
1519
if(deep) { // sort the children of each node too
1520
sibling_iterator bcs(*nodes.begin());
1521
sibling_iterator ecs(*eit);
1524
sort(begin(bcs), end(bcs), comp, deep);
1530
template <class T, class tree_node_allocator>
1531
template <typename iter>
1532
bool tree<T, tree_node_allocator>::equal(const iter& one_, const iter& two, const iter& three_) const
1534
std::equal_to<T> comp;
1535
return equal(one_, two, three_, comp);
1538
template <class T, class tree_node_allocator>
1539
template <typename iter>
1540
bool tree<T, tree_node_allocator>::equal_subtree(const iter& one_, const iter& two_) const
1542
std::equal_to<T> comp;
1543
return equal_subtree(one_, two_, comp);
1546
template <class T, class tree_node_allocator>
1547
template <typename iter, class BinaryPredicate>
1548
bool tree<T, tree_node_allocator>::equal(const iter& one_, const iter& two, const iter& three_, BinaryPredicate fun) const
1550
pre_order_iterator one(one_), three(three_);
1552
// if(one==two && is_valid(three) && three.number_of_children()!=0)
1554
while(one!=two && is_valid(three)) {
1555
if(!fun(*one,*three))
1557
if(one.number_of_children()!=three.number_of_children())
1565
template <class T, class tree_node_allocator>
1566
template <typename iter, class BinaryPredicate>
1567
bool tree<T, tree_node_allocator>::equal_subtree(const iter& one_, const iter& two_, BinaryPredicate fun) const
1569
pre_order_iterator one(one_), two(two_);
1571
if(!fun(*one,*two)) return false;
1572
if(number_of_children(one)!=number_of_children(two)) return false;
1573
return equal(begin(one),end(one),begin(two),fun);
1576
template <class T, class tree_node_allocator>
1577
tree<T, tree_node_allocator> tree<T, tree_node_allocator>::subtree(sibling_iterator from, sibling_iterator to) const
1580
tmp.set_head(value_type());
1581
tmp.replace(tmp.begin(), tmp.end(), from, to);
1585
template <class T, class tree_node_allocator>
1586
void tree<T, tree_node_allocator>::subtree(tree& tmp, sibling_iterator from, sibling_iterator to) const
1588
tmp.set_head(value_type());
1589
tmp.replace(tmp.begin(), tmp.end(), from, to);
1592
template <class T, class tree_node_allocator>
1593
size_t tree<T, tree_node_allocator>::size() const
1596
pre_order_iterator it=begin(), eit=end();
1604
template <class T, class tree_node_allocator>
1605
size_t tree<T, tree_node_allocator>::size(const iterator_base& top) const
1608
pre_order_iterator it=top, eit=top;
1609
eit.skip_children();
1618
template <class T, class tree_node_allocator>
1619
bool tree<T, tree_node_allocator>::empty() const
1621
pre_order_iterator it=begin(), eit=end();
1625
template <class T, class tree_node_allocator>
1626
int tree<T, tree_node_allocator>::depth(const iterator_base& it)
1628
tree_node* pos=it.node;
1631
while(pos->parent!=0) {
1638
template <class T, class tree_node_allocator>
1639
int tree<T, tree_node_allocator>::depth(const iterator_base& it, const iterator_base& root)
1641
tree_node* pos=it.node;
1644
while(pos->parent!=0 && pos!=root.node) {
1651
template <class T, class tree_node_allocator>
1652
int tree<T, tree_node_allocator>::max_depth() const
1655
for(tree_node *it = head->next_sibling; it!=feet; it=it->next_sibling)
1656
maxd=std::max(maxd, max_depth(it));
1662
template <class T, class tree_node_allocator>
1663
int tree<T, tree_node_allocator>::max_depth(const iterator_base& pos) const
1665
tree_node *tmp=pos.node;
1667
if(tmp==0 || tmp==head || tmp==feet) return -1;
1669
int curdepth=0, maxdepth=0;
1670
while(true) { // try to walk the bottom of the tree
1671
while(tmp->first_child==0) {
1672
if(tmp==pos.node) return maxdepth;
1673
if(tmp->next_sibling==0) {
1674
// try to walk up and then right again
1677
if(tmp==0) return maxdepth;
1679
} while(tmp->next_sibling==0);
1681
if(tmp==pos.node) return maxdepth;
1682
tmp=tmp->next_sibling;
1684
tmp=tmp->first_child;
1686
maxdepth=std::max(curdepth, maxdepth);
1690
template <class T, class tree_node_allocator>
1691
unsigned int tree<T, tree_node_allocator>::number_of_children(const iterator_base& it)
1693
tree_node *pos=it.node->first_child;
1694
if(pos==0) return 0;
1697
// while(pos!=it.node->last_child) {
1699
// pos=pos->next_sibling;
1701
while((pos=pos->next_sibling))
1706
template <class T, class tree_node_allocator>
1707
unsigned int tree<T, tree_node_allocator>::number_of_siblings(const iterator_base& it) const
1709
tree_node *pos=it.node;
1712
while(pos->next_sibling &&
1713
pos->next_sibling!=head &&
1714
pos->next_sibling!=feet) {
1716
pos=pos->next_sibling;
1720
while(pos->prev_sibling &&
1721
pos->prev_sibling!=head &&
1722
pos->prev_sibling!=feet) {
1724
pos=pos->prev_sibling;
1730
template <class T, class tree_node_allocator>
1731
void tree<T, tree_node_allocator>::swap(sibling_iterator it)
1733
tree_node *nxt=it.node->next_sibling;
1735
if(it.node->prev_sibling)
1736
it.node->prev_sibling->next_sibling=nxt;
1738
it.node->parent->first_child=nxt;
1739
nxt->prev_sibling=it.node->prev_sibling;
1740
tree_node *nxtnxt=nxt->next_sibling;
1742
nxtnxt->prev_sibling=it.node;
1744
it.node->parent->last_child=it.node;
1745
nxt->next_sibling=it.node;
1746
it.node->prev_sibling=nxt;
1747
it.node->next_sibling=nxtnxt;
1751
template <class T, class tree_node_allocator>
1752
void tree<T, tree_node_allocator>::swap(iterator one, iterator two)
1754
// if one and two are adjacent siblings, use the sibling swap
1755
if(one.node->next_sibling==two.node) swap(one);
1756
else if(two.node->next_sibling==one.node) swap(two);
1758
tree_node *nxt1=one.node->next_sibling;
1759
tree_node *nxt2=two.node->next_sibling;
1760
tree_node *pre1=one.node->prev_sibling;
1761
tree_node *pre2=two.node->prev_sibling;
1762
tree_node *par1=one.node->parent;
1763
tree_node *par2=two.node->parent;
1766
one.node->parent=par2;
1767
one.node->next_sibling=nxt2;
1768
if(nxt2) nxt2->prev_sibling=one.node;
1769
else par2->last_child=one.node;
1770
one.node->prev_sibling=pre2;
1771
if(pre2) pre2->next_sibling=one.node;
1772
else par2->first_child=one.node;
1774
two.node->parent=par1;
1775
two.node->next_sibling=nxt1;
1776
if(nxt1) nxt1->prev_sibling=two.node;
1777
else par1->last_child=two.node;
1778
two.node->prev_sibling=pre1;
1779
if(pre1) pre1->next_sibling=two.node;
1780
else par1->first_child=two.node;
1784
// template <class BinaryPredicate>
1785
// tree<T, tree_node_allocator>::iterator tree<T, tree_node_allocator>::find_subtree(
1786
// sibling_iterator subfrom, sibling_iterator subto, iterator from, iterator to,
1787
// BinaryPredicate fun) const
1789
// assert(1==0); // this routine is not finished yet.
1790
// while(from!=to) {
1791
// if(fun(*subfrom, *from)) {
1798
template <class T, class tree_node_allocator>
1799
bool tree<T, tree_node_allocator>::is_in_subtree(const iterator_base& it, const iterator_base& begin,
1800
const iterator_base& end) const
1802
// FIXME: this should be optimised.
1803
pre_order_iterator tmp=begin;
1805
if(tmp==it) return true;
1811
template <class T, class tree_node_allocator>
1812
bool tree<T, tree_node_allocator>::is_valid(const iterator_base& it) const
1814
if(it.node==0 || it.node==feet || it.node==head) return false;
1818
template <class T, class tree_node_allocator>
1819
unsigned int tree<T, tree_node_allocator>::index(sibling_iterator it) const
1822
if(it.node->parent==0) {
1823
while(it.node->prev_sibling!=head) {
1824
it.node=it.node->prev_sibling;
1829
while(it.node->prev_sibling!=0) {
1830
it.node=it.node->prev_sibling;
1837
template <class T, class tree_node_allocator>
1838
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::sibling(const iterator_base& it, unsigned int num)
1841
if(it.node->parent==0) {
1842
tmp=head->next_sibling;
1844
tmp = tmp->next_sibling;
1849
tmp=it.node->parent->first_child;
1852
tmp = tmp->next_sibling;
1860
template <class T, class tree_node_allocator>
1861
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::child(const iterator_base& it, unsigned int num)
1863
tree_node *tmp=it.node->first_child;
1866
tmp=tmp->next_sibling;
1876
template <class T, class tree_node_allocator>
1877
tree<T, tree_node_allocator>::iterator_base::iterator_base()
1878
: node(0), skip_current_children_(false)
1882
template <class T, class tree_node_allocator>
1883
tree<T, tree_node_allocator>::iterator_base::iterator_base(tree_node *tn)
1884
: node(tn), skip_current_children_(false)
1888
template <class T, class tree_node_allocator>
1889
T& tree<T, tree_node_allocator>::iterator_base::operator*() const
1894
template <class T, class tree_node_allocator>
1895
T* tree<T, tree_node_allocator>::iterator_base::operator->() const
1897
return &(node->data);
1900
template <class T, class tree_node_allocator>
1901
bool tree<T, tree_node_allocator>::post_order_iterator::operator!=(const post_order_iterator& other) const
1903
if(other.node!=this->node) return true;
1907
template <class T, class tree_node_allocator>
1908
bool tree<T, tree_node_allocator>::post_order_iterator::operator==(const post_order_iterator& other) const
1910
if(other.node==this->node) return true;
1914
template <class T, class tree_node_allocator>
1915
bool tree<T, tree_node_allocator>::pre_order_iterator::operator!=(const pre_order_iterator& other) const
1917
if(other.node!=this->node) return true;
1921
template <class T, class tree_node_allocator>
1922
bool tree<T, tree_node_allocator>::pre_order_iterator::operator==(const pre_order_iterator& other) const
1924
if(other.node==this->node) return true;
1928
template <class T, class tree_node_allocator>
1929
bool tree<T, tree_node_allocator>::sibling_iterator::operator!=(const sibling_iterator& other) const
1931
if(other.node!=this->node) return true;
1935
template <class T, class tree_node_allocator>
1936
bool tree<T, tree_node_allocator>::sibling_iterator::operator==(const sibling_iterator& other) const
1938
if(other.node==this->node) return true;
1942
template <class T, class tree_node_allocator>
1943
bool tree<T, tree_node_allocator>::leaf_iterator::operator!=(const leaf_iterator& other) const
1945
if(other.node!=this->node) return true;
1949
template <class T, class tree_node_allocator>
1950
bool tree<T, tree_node_allocator>::leaf_iterator::operator==(const leaf_iterator& other) const
1952
if(other.node==this->node && other.top_node==this->top_node) return true;
1956
template <class T, class tree_node_allocator>
1957
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::iterator_base::begin() const
1959
if(node->first_child==0)
1962
sibling_iterator ret(node->first_child);
1963
ret.parent_=this->node;
1967
template <class T, class tree_node_allocator>
1968
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::iterator_base::end() const
1970
sibling_iterator ret(0);
1975
template <class T, class tree_node_allocator>
1976
void tree<T, tree_node_allocator>::iterator_base::skip_children()
1978
skip_current_children_=true;
1981
template <class T, class tree_node_allocator>
1982
void tree<T, tree_node_allocator>::iterator_base::skip_children(bool skip)
1984
skip_current_children_=skip;
1987
template <class T, class tree_node_allocator>
1988
unsigned int tree<T, tree_node_allocator>::iterator_base::number_of_children() const
1990
tree_node *pos=node->first_child;
1991
if(pos==0) return 0;
1994
while(pos!=node->last_child) {
1996
pos=pos->next_sibling;
2003
// Pre-order iterator
2005
template <class T, class tree_node_allocator>
2006
tree<T, tree_node_allocator>::pre_order_iterator::pre_order_iterator()
2011
template <class T, class tree_node_allocator>
2012
tree<T, tree_node_allocator>::pre_order_iterator::pre_order_iterator(tree_node *tn)
2017
template <class T, class tree_node_allocator>
2018
tree<T, tree_node_allocator>::pre_order_iterator::pre_order_iterator(const iterator_base &other)
2019
: iterator_base(other.node)
2023
template <class T, class tree_node_allocator>
2024
tree<T, tree_node_allocator>::pre_order_iterator::pre_order_iterator(const sibling_iterator& other)
2025
: iterator_base(other.node)
2028
if(other.range_last()!=0)
2029
this->node=other.range_last();
2031
this->node=other.parent_;
2032
this->skip_children();
2037
template <class T, class tree_node_allocator>
2038
typename tree<T, tree_node_allocator>::pre_order_iterator& tree<T, tree_node_allocator>::pre_order_iterator::operator++()
2040
assert(this->node!=0);
2041
if(!this->skip_current_children_ && this->node->first_child != 0) {
2042
this->node=this->node->first_child;
2045
this->skip_current_children_=false;
2046
while(this->node->next_sibling==0) {
2047
this->node=this->node->parent;
2051
this->node=this->node->next_sibling;
2056
template <class T, class tree_node_allocator>
2057
typename tree<T, tree_node_allocator>::pre_order_iterator& tree<T, tree_node_allocator>::pre_order_iterator::operator--()
2059
assert(this->node!=0);
2060
if(this->node->prev_sibling) {
2061
this->node=this->node->prev_sibling;
2062
while(this->node->last_child)
2063
this->node=this->node->last_child;
2066
this->node=this->node->parent;
2073
template <class T, class tree_node_allocator>
2074
typename tree<T, tree_node_allocator>::pre_order_iterator tree<T, tree_node_allocator>::pre_order_iterator::operator++(int)
2076
pre_order_iterator copy = *this;
2081
template <class T, class tree_node_allocator>
2082
typename tree<T, tree_node_allocator>::pre_order_iterator tree<T, tree_node_allocator>::pre_order_iterator::operator--(int)
2084
pre_order_iterator copy = *this;
2089
template <class T, class tree_node_allocator>
2090
typename tree<T, tree_node_allocator>::pre_order_iterator& tree<T, tree_node_allocator>::pre_order_iterator::operator+=(unsigned int num)
2099
template <class T, class tree_node_allocator>
2100
typename tree<T, tree_node_allocator>::pre_order_iterator& tree<T, tree_node_allocator>::pre_order_iterator::operator-=(unsigned int num)
2111
// Post-order iterator
2113
template <class T, class tree_node_allocator>
2114
tree<T, tree_node_allocator>::post_order_iterator::post_order_iterator()
2119
template <class T, class tree_node_allocator>
2120
tree<T, tree_node_allocator>::post_order_iterator::post_order_iterator(tree_node *tn)
2125
template <class T, class tree_node_allocator>
2126
tree<T, tree_node_allocator>::post_order_iterator::post_order_iterator(const iterator_base &other)
2127
: iterator_base(other.node)
2131
template <class T, class tree_node_allocator>
2132
tree<T, tree_node_allocator>::post_order_iterator::post_order_iterator(const sibling_iterator& other)
2133
: iterator_base(other.node)
2136
if(other.range_last()!=0)
2137
this->node=other.range_last();
2139
this->node=other.parent_;
2140
this->skip_children();
2145
template <class T, class tree_node_allocator>
2146
typename tree<T, tree_node_allocator>::post_order_iterator& tree<T, tree_node_allocator>::post_order_iterator::operator++()
2148
assert(this->node!=0);
2149
if(this->node->next_sibling==0) {
2150
this->node=this->node->parent;
2151
this->skip_current_children_=false;
2154
this->node=this->node->next_sibling;
2155
if(this->skip_current_children_) {
2156
this->skip_current_children_=false;
2159
while(this->node->first_child)
2160
this->node=this->node->first_child;
2166
template <class T, class tree_node_allocator>
2167
typename tree<T, tree_node_allocator>::post_order_iterator& tree<T, tree_node_allocator>::post_order_iterator::operator--()
2169
assert(this->node!=0);
2170
if(this->skip_current_children_ || this->node->last_child==0) {
2171
this->skip_current_children_=false;
2172
while(this->node->prev_sibling==0)
2173
this->node=this->node->parent;
2174
this->node=this->node->prev_sibling;
2177
this->node=this->node->last_child;
2182
template <class T, class tree_node_allocator>
2183
typename tree<T, tree_node_allocator>::post_order_iterator tree<T, tree_node_allocator>::post_order_iterator::operator++(int)
2185
post_order_iterator copy = *this;
2190
template <class T, class tree_node_allocator>
2191
typename tree<T, tree_node_allocator>::post_order_iterator tree<T, tree_node_allocator>::post_order_iterator::operator--(int)
2193
post_order_iterator copy = *this;
2199
template <class T, class tree_node_allocator>
2200
typename tree<T, tree_node_allocator>::post_order_iterator& tree<T, tree_node_allocator>::post_order_iterator::operator+=(unsigned int num)
2209
template <class T, class tree_node_allocator>
2210
typename tree<T, tree_node_allocator>::post_order_iterator& tree<T, tree_node_allocator>::post_order_iterator::operator-=(unsigned int num)
2219
template <class T, class tree_node_allocator>
2220
void tree<T, tree_node_allocator>::post_order_iterator::descend_all()
2222
assert(this->node!=0);
2223
while(this->node->first_child)
2224
this->node=this->node->first_child;
2228
// Breadth-first iterator
2230
template <class T, class tree_node_allocator>
2231
tree<T, tree_node_allocator>::breadth_first_queued_iterator::breadth_first_queued_iterator()
2236
template <class T, class tree_node_allocator>
2237
tree<T, tree_node_allocator>::breadth_first_queued_iterator::breadth_first_queued_iterator(tree_node *tn)
2240
traversal_queue.push(tn);
2243
template <class T, class tree_node_allocator>
2244
tree<T, tree_node_allocator>::breadth_first_queued_iterator::breadth_first_queued_iterator(const iterator_base& other)
2245
: iterator_base(other.node)
2247
traversal_queue.push(other.node);
2250
template <class T, class tree_node_allocator>
2251
bool tree<T, tree_node_allocator>::breadth_first_queued_iterator::operator!=(const breadth_first_queued_iterator& other) const
2253
if(other.node!=this->node) return true;
2257
template <class T, class tree_node_allocator>
2258
bool tree<T, tree_node_allocator>::breadth_first_queued_iterator::operator==(const breadth_first_queued_iterator& other) const
2260
if(other.node==this->node) return true;
2264
template <class T, class tree_node_allocator>
2265
typename tree<T, tree_node_allocator>::breadth_first_queued_iterator& tree<T, tree_node_allocator>::breadth_first_queued_iterator::operator++()
2267
assert(this->node!=0);
2269
// Add child nodes and pop current node
2270
sibling_iterator sib=this->begin();
2271
while(sib!=this->end()) {
2272
traversal_queue.push(sib.node);
2275
traversal_queue.pop();
2276
if(traversal_queue.size()>0)
2277
this->node=traversal_queue.front();
2283
template <class T, class tree_node_allocator>
2284
typename tree<T, tree_node_allocator>::breadth_first_queued_iterator tree<T, tree_node_allocator>::breadth_first_queued_iterator::operator++(int)
2286
breadth_first_queued_iterator copy = *this;
2291
template <class T, class tree_node_allocator>
2292
typename tree<T, tree_node_allocator>::breadth_first_queued_iterator& tree<T, tree_node_allocator>::breadth_first_queued_iterator::operator+=(unsigned int num)
2303
// Fixed depth iterator
2305
template <class T, class tree_node_allocator>
2306
tree<T, tree_node_allocator>::fixed_depth_iterator::fixed_depth_iterator()
2311
template <class T, class tree_node_allocator>
2312
tree<T, tree_node_allocator>::fixed_depth_iterator::fixed_depth_iterator(tree_node *tn)
2313
: iterator_base(tn), top_node(0)
2317
template <class T, class tree_node_allocator>
2318
tree<T, tree_node_allocator>::fixed_depth_iterator::fixed_depth_iterator(const iterator_base& other)
2319
: iterator_base(other.node), top_node(0)
2323
template <class T, class tree_node_allocator>
2324
tree<T, tree_node_allocator>::fixed_depth_iterator::fixed_depth_iterator(const sibling_iterator& 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 fixed_depth_iterator& other)
2331
: iterator_base(other.node), top_node(other.top_node)
2335
template <class T, class tree_node_allocator>
2336
bool tree<T, tree_node_allocator>::fixed_depth_iterator::operator==(const fixed_depth_iterator& other) const
2338
if(other.node==this->node && other.top_node==top_node) return true;
2342
template <class T, class tree_node_allocator>
2343
bool tree<T, tree_node_allocator>::fixed_depth_iterator::operator!=(const fixed_depth_iterator& other) const
2345
if(other.node!=this->node || other.top_node!=top_node) return true;
2349
template <class T, class tree_node_allocator>
2350
typename tree<T, tree_node_allocator>::fixed_depth_iterator& tree<T, tree_node_allocator>::fixed_depth_iterator::operator++()
2352
assert(this->node!=0);
2354
if(this->node->next_sibling) {
2355
this->node=this->node->next_sibling;
2358
int relative_depth=0;
2361
if(this->node==this->top_node) {
2362
this->node=0; // FIXME: return a proper fixed_depth end iterator once implemented
2365
this->node=this->node->parent;
2366
if(this->node==0) return *this;
2368
} while(this->node->next_sibling==0);
2370
this->node=this->node->next_sibling;
2371
while(this->node->first_child==0) {
2372
if(this->node->next_sibling==0)
2374
this->node=this->node->next_sibling;
2375
if(this->node==0) return *this;
2377
while(relative_depth<0 && this->node->first_child!=0) {
2378
this->node=this->node->first_child;
2381
if(relative_depth<0) {
2382
if(this->node->next_sibling==0) goto upper;
2389
template <class T, class tree_node_allocator>
2390
typename tree<T, tree_node_allocator>::fixed_depth_iterator& tree<T, tree_node_allocator>::fixed_depth_iterator::operator--()
2392
assert(this->node!=0);
2394
if(this->node->prev_sibling) {
2395
this->node=this->node->prev_sibling;
2398
int relative_depth=0;
2401
if(this->node==this->top_node) {
2405
this->node=this->node->parent;
2406
if(this->node==0) return *this;
2408
} while(this->node->prev_sibling==0);
2410
this->node=this->node->prev_sibling;
2411
while(this->node->last_child==0) {
2412
if(this->node->prev_sibling==0)
2414
this->node=this->node->prev_sibling;
2415
if(this->node==0) return *this;
2417
while(relative_depth<0 && this->node->last_child!=0) {
2418
this->node=this->node->last_child;
2421
if(relative_depth<0) {
2422
if(this->node->prev_sibling==0) goto upper;
2430
// assert(this->node!=0);
2431
// if(this->node->prev_sibling!=0) {
2432
// this->node=this->node->prev_sibling;
2433
// assert(this->node!=0);
2434
// if(this->node->parent==0 && this->node->prev_sibling==0) // head element
2438
// tree_node *par=this->node->parent;
2440
// par=par->prev_sibling;
2441
// if(par==0) { // FIXME: need to keep track of this!
2445
// } while(par->last_child==0);
2446
// this->node=par->last_child;
2451
template <class T, class tree_node_allocator>
2452
typename tree<T, tree_node_allocator>::fixed_depth_iterator tree<T, tree_node_allocator>::fixed_depth_iterator::operator++(int)
2454
fixed_depth_iterator copy = *this;
2459
template <class T, class tree_node_allocator>
2460
typename tree<T, tree_node_allocator>::fixed_depth_iterator tree<T, tree_node_allocator>::fixed_depth_iterator::operator--(int)
2462
fixed_depth_iterator copy = *this;
2467
template <class T, class tree_node_allocator>
2468
typename tree<T, tree_node_allocator>::fixed_depth_iterator& tree<T, tree_node_allocator>::fixed_depth_iterator::operator-=(unsigned int num)
2477
template <class T, class tree_node_allocator>
2478
typename tree<T, tree_node_allocator>::fixed_depth_iterator& tree<T, tree_node_allocator>::fixed_depth_iterator::operator+=(unsigned int num)
2490
template <class T, class tree_node_allocator>
2491
tree<T, tree_node_allocator>::sibling_iterator::sibling_iterator()
2497
template <class T, class tree_node_allocator>
2498
tree<T, tree_node_allocator>::sibling_iterator::sibling_iterator(tree_node *tn)
2504
template <class T, class tree_node_allocator>
2505
tree<T, tree_node_allocator>::sibling_iterator::sibling_iterator(const iterator_base& other)
2506
: iterator_base(other.node)
2511
template <class T, class tree_node_allocator>
2512
tree<T, tree_node_allocator>::sibling_iterator::sibling_iterator(const sibling_iterator& other)
2513
: iterator_base(other), parent_(other.parent_)
2517
template <class T, class tree_node_allocator>
2518
void tree<T, tree_node_allocator>::sibling_iterator::set_parent_()
2521
if(this->node==0) return;
2522
if(this->node->parent!=0)
2523
parent_=this->node->parent;
2526
template <class T, class tree_node_allocator>
2527
typename tree<T, tree_node_allocator>::sibling_iterator& tree<T, tree_node_allocator>::sibling_iterator::operator++()
2530
this->node=this->node->next_sibling;
2534
template <class T, class tree_node_allocator>
2535
typename tree<T, tree_node_allocator>::sibling_iterator& tree<T, tree_node_allocator>::sibling_iterator::operator--()
2537
if(this->node) this->node=this->node->prev_sibling;
2540
this->node=parent_->last_child;
2545
template <class T, class tree_node_allocator>
2546
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::sibling_iterator::operator++(int)
2548
sibling_iterator copy = *this;
2553
template <class T, class tree_node_allocator>
2554
typename tree<T, tree_node_allocator>::sibling_iterator tree<T, tree_node_allocator>::sibling_iterator::operator--(int)
2556
sibling_iterator copy = *this;
2561
template <class T, class tree_node_allocator>
2562
typename tree<T, tree_node_allocator>::sibling_iterator& tree<T, tree_node_allocator>::sibling_iterator::operator+=(unsigned int num)
2571
template <class T, class tree_node_allocator>
2572
typename tree<T, tree_node_allocator>::sibling_iterator& tree<T, tree_node_allocator>::sibling_iterator::operator-=(unsigned int num)
2581
template <class T, class tree_node_allocator>
2582
typename tree<T, tree_node_allocator>::tree_node *tree<T, tree_node_allocator>::sibling_iterator::range_first() const
2584
tree_node *tmp=parent_->first_child;
2588
template <class T, class tree_node_allocator>
2589
typename tree<T, tree_node_allocator>::tree_node *tree<T, tree_node_allocator>::sibling_iterator::range_last() const
2591
return parent_->last_child;
2596
template <class T, class tree_node_allocator>
2597
tree<T, tree_node_allocator>::leaf_iterator::leaf_iterator()
2598
: iterator_base(0), top_node(0)
2602
template <class T, class tree_node_allocator>
2603
tree<T, tree_node_allocator>::leaf_iterator::leaf_iterator(tree_node *tn, tree_node *top)
2604
: iterator_base(tn), top_node(top)
2608
template <class T, class tree_node_allocator>
2609
tree<T, tree_node_allocator>::leaf_iterator::leaf_iterator(const iterator_base &other)
2610
: iterator_base(other.node), top_node(0)
2614
template <class T, class tree_node_allocator>
2615
tree<T, tree_node_allocator>::leaf_iterator::leaf_iterator(const sibling_iterator& other)
2616
: iterator_base(other.node), top_node(0)
2619
if(other.range_last()!=0)
2620
this->node=other.range_last();
2622
this->node=other.parent_;
2627
template <class T, class tree_node_allocator>
2628
typename tree<T, tree_node_allocator>::leaf_iterator& tree<T, tree_node_allocator>::leaf_iterator::operator++()
2630
assert(this->node!=0);
2631
if(this->node->first_child!=0) { // current node is no longer leaf (children got added)
2632
while(this->node->first_child)
2633
this->node=this->node->first_child;
2636
while(this->node->next_sibling==0) {
2637
if (this->node->parent==0) return *this;
2638
this->node=this->node->parent;
2639
if (top_node != 0 && this->node==top_node) return *this;
2641
this->node=this->node->next_sibling;
2642
while(this->node->first_child)
2643
this->node=this->node->first_child;
2648
template <class T, class tree_node_allocator>
2649
typename tree<T, tree_node_allocator>::leaf_iterator& tree<T, tree_node_allocator>::leaf_iterator::operator--()
2651
assert(this->node!=0);
2652
while (this->node->prev_sibling==0) {
2653
if (this->node->parent==0) return *this;
2654
this->node=this->node->parent;
2655
if (top_node !=0 && this->node==top_node) return *this;
2657
this->node=this->node->prev_sibling;
2658
while(this->node->last_child)
2659
this->node=this->node->last_child;
2663
template <class T, class tree_node_allocator>
2664
typename tree<T, tree_node_allocator>::leaf_iterator tree<T, tree_node_allocator>::leaf_iterator::operator++(int)
2666
leaf_iterator copy = *this;
2671
template <class T, class tree_node_allocator>
2672
typename tree<T, tree_node_allocator>::leaf_iterator tree<T, tree_node_allocator>::leaf_iterator::operator--(int)
2674
leaf_iterator copy = *this;
2680
template <class T, class tree_node_allocator>
2681
typename tree<T, tree_node_allocator>::leaf_iterator& tree<T, tree_node_allocator>::leaf_iterator::operator+=(unsigned int num)
2690
template <class T, class tree_node_allocator>
2691
typename tree<T, tree_node_allocator>::leaf_iterator& tree<T, tree_node_allocator>::leaf_iterator::operator-=(unsigned int num)
2703
// default-tab-width: 3