annotate foosdk/sdk/pfc/avltree.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "iterators.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 template<typename t_storage>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 class _avltree_node : public _list_node<t_storage> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 typedef _list_node<t_storage> t_node;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 typedef _avltree_node<t_storage> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 template<typename t_param> _avltree_node(t_param const& param) : t_node(param) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 typedef refcounted_object_ptr_t<t_self> t_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 typedef t_self* t_rawptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 t_ptr m_left, m_right; // smart ptr, no init
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 t_rawptr m_parent = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 t_size m_depth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 void link_left(t_self* ptr) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 m_left = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 if (ptr != NULL) ptr->m_parent = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 void link_right(t_self* ptr) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 m_right = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 if (ptr != NULL) ptr->m_parent = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 void link_child(bool which,t_self* ptr) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 (which ? m_right : m_left) = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 if (ptr != NULL) ptr->m_parent = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 void unlink() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 m_left.release(); m_right.release(); m_parent = NULL; m_depth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 inline void add_ref() throw() {this->refcount_add_ref();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 inline void release() throw() {this->refcount_release();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 inline t_rawptr child(bool which) const throw() {return which ? m_right.get_ptr() : m_left.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 inline bool which_child(const t_self* ptr) const throw() {return ptr == m_right.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 t_rawptr step(bool direction) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 t_self* walk = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 t_self* t = walk->child(direction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 if (t != NULL) return t->peakchild(!direction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 t = walk->m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 if (t == NULL) return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 if (t->which_child(walk) != direction) return t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 walk = t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 t_rawptr peakchild(bool direction) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 t_self* walk = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 t_rawptr next = walk->child(direction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 if (next == NULL) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 walk = next;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 t_node * prev() throw() {return step(false);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 t_node * next() throw() {return step(true);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 ~_avltree_node() throw() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 template<typename t_storage,typename t_comparator = comparator_default>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 class avltree_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 typedef avltree_t<t_storage,t_comparator> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 typedef pfc::const_iterator<t_storage> const_iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 typedef pfc::iterator<t_storage> iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 typedef pfc::forward_iterator<t_storage> forward_iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 typedef pfc::forward_const_iterator<t_storage> forward_const_iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 typedef t_storage t_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 typedef _avltree_node<t_storage> t_node;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 #if 1//MSVC8 bug fix
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 typedef refcounted_object_ptr_t<t_node> t_nodeptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 typedef t_node * t_noderawptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 typedef typename t_node::t_ptr t_nodeptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 typedef typename t_node::t_rawptr t_noderawptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 static bool is_ptr_valid(t_nodeptr const & p) { return p.is_valid(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 static bool is_ptr_valid(t_node const * p) { return p != NULL; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 template<typename t_item1,typename t_item2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 inline static int compare(const t_item1 & p_item1, const t_item2 & p_item2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 return t_comparator::compare(p_item1,p_item2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 t_nodeptr m_root;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 static t_size calc_depth(const t_nodeptr & ptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 return ptr.is_valid() ? 1+ptr->m_depth : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 static void recalc_depth(t_nodeptr const& ptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 ptr->m_depth = pfc::max_t(calc_depth(ptr->m_left), calc_depth(ptr->m_right));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 static void assert_children(t_nodeptr ptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 PFC_ASSERT(ptr->m_depth == pfc::max_t(calc_depth(ptr->m_left),calc_depth(ptr->m_right)) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 static t_ssize test_depth(t_nodeptr const& ptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 if (ptr==0) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 else return calc_depth(ptr->m_right) - calc_depth(ptr->m_left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 static t_nodeptr extract_left_leaf(t_nodeptr & p_base) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 if (is_ptr_valid(p_base->m_left)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 t_nodeptr ret = extract_left_leaf(p_base->m_left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 recalc_depth(p_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 g_rebalance(p_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 t_nodeptr node = p_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 p_base = node->m_right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 if (p_base.is_valid()) p_base->m_parent = node->m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 node->m_right.release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 node->m_depth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 node->m_parent = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 return node;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 static t_nodeptr extract_right_leaf(t_nodeptr & p_base) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 if (is_ptr_valid(p_base->m_right)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 t_nodeptr ret = extract_right_leaf(p_base->m_right);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 recalc_depth(p_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 g_rebalance(p_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 t_nodeptr node = p_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 p_base = node->m_left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 if (p_base.is_valid()) p_base->m_parent = node->m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 node->m_left.release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 node->m_depth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 node->m_parent = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 return node;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 static void remove_internal(t_nodeptr & p_node) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 t_nodeptr oldval = p_node;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 if (p_node->m_left.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 p_node = p_node->m_right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 if (p_node.is_valid()) p_node->m_parent = oldval->m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 } else if (p_node->m_right.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 p_node = p_node->m_left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 if (p_node.is_valid()) p_node->m_parent = oldval->m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 t_nodeptr swap = extract_left_leaf(p_node->m_right);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 swap->link_left(oldval->m_left.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 swap->link_right(oldval->m_right.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 swap->m_parent = oldval->m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 recalc_depth(swap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 p_node = swap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 oldval->unlink();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 template<typename t_nodewalk,typename t_callback>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 static void __enum_items_recur(t_nodewalk * p_node,t_callback && p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 if (is_ptr_valid(p_node)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 __enum_items_recur<t_nodewalk>(p_node->m_left.get_ptr(),p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 p_callback (p_node->m_content);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 __enum_items_recur<t_nodewalk>(p_node->m_right.get_ptr(),p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 template<typename t_search>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 static t_node * g_find_or_add_node(t_nodeptr & p_base,t_node * parent,t_search const & p_search,bool & p_new)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 if (p_base.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 p_base = new t_node(p_search);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 p_base->m_parent = parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 p_new = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 return p_base.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 PFC_ASSERT( p_base->m_parent == parent );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 int result = compare(p_base->m_content,p_search);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 if (result > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 t_node * ret = g_find_or_add_node<t_search>(p_base->m_left,p_base.get_ptr(),p_search,p_new);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 PFC_ASSERT(compare(ret->m_content, p_search) == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 if (p_new) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 recalc_depth(p_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 g_rebalance(p_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 } else if (result < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 t_node * ret = g_find_or_add_node<t_search>(p_base->m_right,p_base.get_ptr(),p_search,p_new);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 PFC_ASSERT(compare(ret->m_content, p_search) == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 if (p_new) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 recalc_depth(p_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 g_rebalance(p_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 p_new = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 return p_base.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 template<typename t_search>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 static t_storage * g_find_or_add(t_nodeptr & p_base,t_node * parent,t_search const & p_search,bool & p_new) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 return &g_find_or_add_node(p_base,parent,p_search,p_new)->m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 static void g_rotate_right(t_nodeptr & oldroot) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 t_nodeptr newroot ( oldroot->m_right );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 oldroot->link_child(true, newroot->m_left.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 newroot->m_left = oldroot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 newroot->m_parent = oldroot->m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 oldroot->m_parent = newroot.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 recalc_depth(oldroot);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 recalc_depth(newroot);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 oldroot = newroot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 static void g_rotate_left(t_nodeptr & oldroot) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 t_nodeptr newroot ( oldroot->m_left );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 oldroot->link_child(false, newroot->m_right.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 newroot->m_right = oldroot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 newroot->m_parent = oldroot->m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 oldroot->m_parent = newroot.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 recalc_depth(oldroot);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 recalc_depth(newroot);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 oldroot = newroot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 static void g_rebalance(t_nodeptr & p_node) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 t_ssize balance = test_depth(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 if (balance > 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 //right becomes root
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 if (test_depth(p_node->m_right) < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 g_rotate_left(p_node->m_right);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 g_rotate_right(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 } else if (balance < -1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 //left becomes root
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 if (test_depth(p_node->m_left) > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 g_rotate_right(p_node->m_left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 g_rotate_left(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 selftest(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 template<typename t_search>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 static bool g_remove(t_nodeptr & p_node,t_search const & p_search) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 if (p_node.is_empty()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 int result = compare(p_node->m_content,p_search);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 if (result == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 remove_internal(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 if (is_ptr_valid(p_node)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 recalc_depth(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 g_rebalance(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 if (g_remove<t_search>(result > 0 ? p_node->m_left : p_node->m_right,p_search)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 recalc_depth(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 g_rebalance(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 static void selftest(t_nodeptr const& p_node) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 (void)p_node;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 #if 0 //def _DEBUG//SLOW!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 if (is_ptr_valid(p_node)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 selftest(p_node->m_left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 selftest(p_node->m_right);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 assert_children(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 t_ssize delta = test_depth(p_node);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 PFC_ASSERT(delta >= -1 && delta <= 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 if (p_node->m_left.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 PFC_ASSERT( p_node.get_ptr() == p_node->m_left->m_parent );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 if (p_node->m_right.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 PFC_ASSERT( p_node.get_ptr() == p_node->m_right->m_parent );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 if (is_ptr_valid(p_node->m_parent)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 PFC_ASSERT(p_node == p_node->m_parent->m_left || p_node == p_node->m_parent->m_right);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 static t_size calc_count(const t_node * p_node) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 if (is_ptr_valid(p_node)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 return 1 + calc_count(p_node->m_left.get_ptr()) + calc_count(p_node->m_right.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 t_storage * _find_item_ptr(t_param const & p_item) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 t_node* ptr = m_root.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 while(is_ptr_valid(ptr)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 int result = compare(ptr->m_content,p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 if (result > 0) ptr=ptr->m_left.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 else if (result < 0) ptr=ptr->m_right.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 else return &ptr->m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 t_node * _find_node_ptr(t_param const & p_item) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 t_node* ptr = m_root.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 while(is_ptr_valid(ptr)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 int result = compare(ptr->m_content,p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 if (result > 0) ptr=ptr->m_left.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 else if (result < 0) ptr=ptr->m_right.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 else return ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 template<bool inclusive,bool above,typename t_search> t_storage * __find_nearest(const t_search & p_search) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 t_node * ptr = m_root.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 t_storage * found = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 while(is_ptr_valid(ptr)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 int result = compare(ptr->m_content,p_search);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 if (above) result = -result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 if (inclusive && result == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 //direct hit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 found = &ptr->m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 } else if (result < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 //match
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 found = &ptr->m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 ptr = ptr->child(!above);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 //mismatch
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 ptr = ptr->child(above);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 return found;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 avltree_t() : m_root(NULL) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 ~avltree_t() {reset();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 const t_self & operator=(const t_self & p_other) {__copy(p_other);return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 avltree_t(const t_self & p_other) : m_root(NULL) {try{__copy(p_other);} catch(...) {remove_all(); throw;}}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 template<typename t_other> const t_self & operator=(const t_other & p_other) {copy_list_enumerated(*this,p_other);return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 template<typename t_other> avltree_t(const t_other & p_other) : m_root(NULL) {try{copy_list_enumerated(*this,p_other);}catch(...){remove_all(); throw;}}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 template<bool inclusive,bool above,typename t_search> const t_storage * find_nearest_item(const t_search & p_search) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 return __find_nearest<inclusive,above>(p_search);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 template<bool inclusive,bool above,typename t_search> t_storage * find_nearest_item(const t_search & p_search) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 return __find_nearest<inclusive,above>(p_search);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 avltree_t( t_self && other ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 m_root = std::move( other.m_root ); other.m_root.release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 const t_self & operator=( t_self && other ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 move_from ( other ); return *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 void move_from( t_self & other ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 reset(); m_root = std::move( other.m_root ); other.m_root.release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 t_storage & add_item(t_param const & p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 bool dummy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 return add_item_ex(p_item,dummy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 t_self & operator+=(const t_param & p_item) {add_item(p_item);return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 t_self & operator-=(const t_param & p_item) {remove_item(p_item);return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 //! Returns true when the list has been altered, false when the item was already present before.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 bool add_item_check(t_param const & item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 bool isNew = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 g_find_or_add(m_root,NULL,item,isNew);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 selftest(m_root);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 return isNew;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 t_storage & add_item_ex(t_param const & p_item,bool & p_isnew) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 t_storage * ret = g_find_or_add(m_root,NULL,p_item,p_isnew);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 selftest(m_root);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 return *ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 void set_item(const t_param & p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 bool isnew;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 t_storage & found = add_item_ex(p_item,isnew);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 if (isnew) found = p_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 const t_storage * find_item_ptr(t_param const & p_item) const {return _find_item_ptr(p_item);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 //! Unsafe! Caller must not modify items in a way that changes sort order!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 t_storage * find_item_ptr(t_param const & p_item) { return _find_item_ptr(p_item); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 template<typename t_param> const_iterator find(t_param const & item) const { return _find_node_ptr(item);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 //! Unsafe! Caller must not modify items in a way that changes sort order!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 template<typename t_param> iterator find(t_param const & item) { return _find_node_ptr(item);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 bool contains(const t_param & p_item) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 return find_item_ptr(p_item) != NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 //! Same as contains().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 bool have_item(const t_param & p_item) const {return contains(p_item);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 void remove_all() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 _unlink_recur(m_root);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 m_root.release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 void clear() throw() { remove_all(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 bool remove(const_iterator const& iter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 PFC_ASSERT(iter.is_valid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 return remove_item(*iter);//OPTIMIZEME
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 //should never return false unless there's a bug in calling code
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 template<typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 bool remove_item(t_param const & p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 bool ret = g_remove<t_param>(m_root,p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 selftest(m_root);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 t_size get_count() const throw() { return calc_count(m_root.get_ptr()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 size_t size() const throw() { return get_count(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 template<typename t_callback>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 void enumerate(t_callback && p_callback) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 __enum_items_recur<const t_node>(m_root.get_ptr(),p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 //! Allows callback to modify the tree content.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 //! Unsafe! Caller must not modify items in a way that changes sort order!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 template<typename t_callback>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 void _enumerate_var(t_callback & p_callback) { __enum_items_recur<t_node>(m_root.get_ptr(),p_callback); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 template<typename t_param> iterator insert(const t_param & p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 bool isNew;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 t_node * ret = g_find_or_add_node(m_root,NULL,p_item,isNew);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 selftest(m_root);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 //deprecated backwards compatibility method wrappers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 template<typename t_param> t_storage & add(const t_param & p_item) {return add_item(p_item);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 template<typename t_param> t_storage & add_ex(const t_param & p_item,bool & p_isnew) {return add_item_ex(p_item,p_isnew);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 template<typename t_param> const t_storage * find_ptr(t_param const & p_item) const {return find_item_ptr(p_item);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 template<typename t_param> t_storage * find_ptr(t_param const & p_item) {return find_item_ptr(p_item);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 template<typename t_param> bool exists(t_param const & p_item) const {return have_item(p_item);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 void reset() {remove_all();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 const_iterator first() const noexcept {return _firstlast(false);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 const_iterator last() const noexcept {return _firstlast(true);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 //! Unsafe! Caller must not modify items in a way that changes sort order!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 iterator _first_var() { return _firstlast(false); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 //! Unsafe! Caller must not modify items in a way that changes sort order!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 iterator _last_var() { return _firstlast(true); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 const_iterator cfirst() const noexcept {return _firstlast(false);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 const_iterator clast() const noexcept {return _firstlast(true);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 forward_const_iterator begin() const noexcept { return first(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 forward_const_iterator end() const noexcept { return forward_const_iterator(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 template<typename t_param> bool get_first(t_param & p_item) const throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 const_iterator iter = first();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 if (!iter.is_valid()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 p_item = *iter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 template<typename t_param> bool get_last(t_param & p_item) const throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 const_iterator iter = last();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 if (!iter.is_valid()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 p_item = *iter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 static bool equals(const t_self & v1, const t_self & v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 return listEquals(v1,v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 bool operator==(const t_self & other) const {return equals(*this,other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 bool operator!=(const t_self & other) const {return !equals(*this,other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 static void _unlink_recur(t_nodeptr & node) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 if (node.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 _unlink_recur(node->m_left);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 _unlink_recur(node->m_right);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 node->unlink();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 t_node* _firstlast(bool which) const noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 if (m_root.is_empty()) return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 for(t_node * walk = m_root.get_ptr(); ; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 t_node * next = walk->child(which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 if (next == nullptr) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 PFC_ASSERT( next->m_parent == walk );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 walk = next;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 static t_nodeptr __copy_recur(t_node * p_source,t_node * parent) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 if (p_source == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 t_nodeptr newnode = new t_node(p_source->m_content);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 newnode->m_depth = p_source->m_depth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 newnode->m_left = __copy_recur(p_source->m_left.get_ptr(),newnode.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 newnode->m_right = __copy_recur(p_source->m_right.get_ptr(),newnode.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 newnode->m_parent = parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 return newnode;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 void __copy(const t_self & p_other) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 m_root = __copy_recur(p_other.m_root.get_ptr(),NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 selftest(m_root);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 template<typename t_storage,typename t_comparator>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 class traits_t<avltree_t<t_storage,t_comparator> > : public traits_default_movable {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 }