platform_trees/trees/
recursive_size_balanced_tree.rs1use crate::LinkType;
2
3pub trait RecursiveSizeBalancedTree<T: LinkType> {
21 unsafe fn get_mut_left_reference(&mut self, node: T) -> *mut T;
23
24 unsafe fn get_mut_right_reference(&mut self, node: T) -> *mut T;
26
27 unsafe fn get_left_reference(&self, node: T) -> *const T;
29
30 unsafe fn get_right_reference(&self, node: T) -> *const T;
32
33 unsafe fn get_left(&self, node: T) -> T;
35
36 unsafe fn get_right(&self, node: T) -> T;
38
39 unsafe fn get_size(&self, node: T) -> T;
41
42 unsafe fn set_left(&mut self, node: T, left: T);
44
45 unsafe fn set_right(&mut self, node: T, right: T);
47
48 unsafe fn set_size(&mut self, node: T, size: T);
50
51 unsafe fn first_is_to_the_left_of_second(&self, first: T, second: T) -> bool;
53
54 unsafe fn first_is_to_the_right_of_second(&self, first: T, second: T) -> bool;
56
57 unsafe fn get_left_or_default(&self, node: T) -> T {
59 unsafe {
60 if node == T::funty(0) {
61 T::funty(0)
62 } else {
63 self.get_left(node)
64 }
65 }
66 }
67
68 unsafe fn get_right_or_default(&self, node: T) -> T {
70 unsafe {
71 if node == T::funty(0) {
72 T::funty(0)
73 } else {
74 self.get_right(node)
75 }
76 }
77 }
78
79 unsafe fn get_size_or_zero(&self, node: T) -> T {
81 unsafe {
82 if node == T::funty(0) {
83 T::funty(0)
84 } else {
85 self.get_size(node)
86 }
87 }
88 }
89
90 unsafe fn inc_size(&mut self, node: T) {
92 unsafe {
93 self.set_size(node, self.get_size(node) + T::funty(1));
94 }
95 }
96
97 unsafe fn dec_size(&mut self, node: T) {
99 unsafe {
100 self.set_size(node, self.get_size(node) - T::funty(1));
101 }
102 }
103
104 unsafe fn get_left_size(&self, node: T) -> T {
106 unsafe { self.get_size_or_zero(self.get_left_or_default(node)) }
107 }
108
109 unsafe fn get_right_size(&self, node: T) -> T {
111 unsafe { self.get_size_or_zero(self.get_right_or_default(node)) }
112 }
113
114 unsafe fn fix_size(&mut self, node: T) {
117 unsafe {
118 self.set_size(
119 node,
120 (self.get_left_size(node) + self.get_right_size(node)) + T::funty(1),
121 );
122 }
123 }
124
125 unsafe fn left_rotate(&mut self, root: *mut T) {
128 unsafe {
129 *root = self.left_rotate_core(*root);
130 }
131 }
132
133 unsafe fn left_rotate_core(&mut self, root: T) -> T {
135 unsafe {
136 let right = self.get_right(root);
137 self.set_right(root, self.get_left(right));
138 self.set_left(right, root);
139 self.set_size(right, self.get_size(root));
140 self.fix_size(root);
141 right
142 }
143 }
144
145 unsafe fn right_rotate(&mut self, root: *mut T) {
148 unsafe {
149 *root = self.right_rotate_core(*root);
150 }
151 }
152
153 unsafe fn right_rotate_core(&mut self, root: T) -> T {
155 unsafe {
156 let left = self.get_left(root);
157 self.set_left(root, self.get_right(left));
158 self.set_right(left, root);
159 self.set_size(left, self.get_size(root));
160 self.fix_size(root);
161 left
162 }
163 }
164
165 unsafe fn get_rightest(&self, mut current: T) -> T {
167 unsafe {
168 let mut current_right = self.get_right(current);
169 while current_right != T::funty(0) {
170 current = current_right;
171 current_right = self.get_right(current);
172 }
173 current
174 }
175 }
176
177 unsafe fn get_leftest(&self, mut current: T) -> T {
179 unsafe {
180 let mut current_left = self.get_left(current);
181 while current_left != T::funty(0) {
182 current = current_left;
183 current_left = self.get_left(current);
184 }
185 current
186 }
187 }
188
189 unsafe fn get_next(&self, node: T) -> T {
191 unsafe { self.get_leftest(self.get_right(node)) }
192 }
193
194 unsafe fn get_previous(&self, node: T) -> T {
196 unsafe { self.get_rightest(self.get_left(node)) }
197 }
198
199 unsafe fn contains(&self, node: T, mut root: T) -> bool {
201 unsafe {
202 while root != T::funty(0) {
203 if self.first_is_to_the_left_of_second(node, root) {
204 root = self.get_left(root);
205 } else if self.first_is_to_the_right_of_second(node, root) {
206 root = self.get_right(root);
207 } else {
208 return true;
209 }
210 }
211 false
212 }
213 }
214
215 unsafe fn clear_node(&mut self, node: T) {
217 unsafe {
218 self.set_left(node, T::funty(0));
219 self.set_right(node, T::funty(0));
220 self.set_size(node, T::funty(0));
221 }
222 }
223}