Skip to main content

customizable_buddy/
avl.rs

1//! 没有实现线程安全
2//!
3//! ## 总体运算逻辑:
4//! 在进行存储的时候存在如下空间
5//!
6//! 空间序号:1,2,3,4,5,6,7,8
7//! 是否分配:0,1,1,1,0,0,0,0
8//!
9//! 此时对应的层级以及逐步删除划分为:
10//! 1:1 |1:x |1:    |1:5,6|1:x,6|1:x|1:7,8|1:x,8 |1:x
11//! 2:  |2:  |2:5,7 |2:x,7|2:7  |2:7|2:x  |2:    |2:
12//! 3:5 |3:5 |3:x   |3:   |3:   |3: |3:   |3:    |3:
13//!
14//! 因此,在进行插入的时候,如果发现存在两个类似的idx,比如7,8,则代表可能出现重复的情况
15//! 此时的想法在于添加一个新的函数,其主要作用在于删除一个制定ptr的节点(已经确定存在)通过这种方式来实现对于兄弟节点的回收
16//! 同时,在完成回收之后,将两个兄弟节点中的最小的节点返回给上一级(并且插入到上一级的avl树中)
17//!
18//! 同时,从总体上来说:在某一层删除一个节点其实相当于从avl树中获取一个节点
19//! 在如果在某一层没有找到对应元素,则向其上一层进行借用,在借用完成的时候再将其中的一部分插入到下一层的位置(这个地方按照lib是可以递归的)
20//! **层级代表着size**
21//!
22//! ## 算法设计:
23//! 整体的算法逻辑如下 [开启了删除伙伴节点方案]
24//! 插入:
25//!     IF 插入节点为空:
26//!         直接插入
27//!     ELSE:
28//!         判断当前节点以及插入节点的伙伴节点之间的关系以获取下一步的前进方向:
29//!             分成三种情况进行讨论,比当前节点小,大,以及相等
30//!             IF 前进方向的下一个节点就是伙伴节点
31//!                 按照四种不同删除方式对于伙伴节点进行删除
32//!                     (其中对于要删除的节点同时存在左右子树的情况下,引入了别的函数,主要目的在于找到当前子树中最大或者最小的节点,clone并返回)
33//!             ELSE
34//!                 递归到下一个节点处继续进行插入
35//!             ENDIF
36//!     ENDIF
37//! 删除:
38//!     IF 当前节点为空:
39//!         返回None
40//!     ELSE:
41//!         根据高度以及当前节点是否存在左右子树的情况,分成四种情况
42//!             找到距离根节点最近的叶子节点进行删除[根据节点的高度信息]
43
44// AVL 算法
45// # 静止的 AVL 树左右子树的高度差的绝对值最大为 1
46//
47// 如果如下的树是 AVL 树:
48//
49//     A
50//    / \
51//   B   γ
52//  / \
53// α   β
54//
55// 则 | α - β | <= 1, | max(α, β) + 1 - γ | <= 1。
56//
57// 如果这是一个需要右单旋的情况(α - β = 1, B - γ = 2),设 x = β,显然:
58//
59// - α = x + 1
60// - β = x
61// - γ = x
62// - A = x + 3
63// - B = x + 2
64//
65// 经过一次右单旋:
66//
67//   B     | - α = x + 1
68//  / \    | - β = x
69// α   A   | - γ = x
70//    / \  | - A = x + 1
71//   β   γ | - B = x + 2
72//
73// B 的高度不变但整棵树的高度降低 1。
74
75use crate::{BuddyCollection, BuddyLine, OligarchyCollection, Order};
76use core::{fmt, ptr::NonNull};
77/// 基于平衡二叉查找树的侵入式伙伴行。
78pub struct AvlBuddy {
79    tree: Tree,
80    order: Order,
81}
82
83/// 必须实现 [`Send`] 才能加锁。
84unsafe impl Send for AvlBuddy {}
85
86impl BuddyLine for AvlBuddy {
87    const INTRUSIVE_META_SIZE: usize = core::mem::size_of::<Node>();
88
89    const EMPTY: Self = Self {
90        tree: Tree(None),
91        order: Order::new(0),
92    };
93
94    #[inline]
95    fn init(&mut self, order: usize, _base: usize) {
96        self.order = Order::new(order);
97    }
98
99    fn take(&mut self, _idx: usize) -> bool {
100        todo!()
101    }
102}
103
104impl OligarchyCollection for AvlBuddy {
105    fn take_any(&mut self, _align_order: usize, _count: usize) -> Option<usize> {
106        // 个人感觉基于寡头行的数量而言,实现这个地方没有什么效率
107        todo!()
108    }
109
110    #[inline]
111    fn put(&mut self, _idx: usize) {
112        // 个人感觉基于寡头行的数量而言,实现这个没有效率
113        todo!()
114    }
115}
116
117impl BuddyCollection for AvlBuddy {
118    // 从 avl_buddy 行内分配器中获取获取一个节点
119    fn take_any(&mut self, _align_order: usize) -> Option<usize> {
120        // 默认以相同大小进行分配我感觉是比较好的,但是不排除后面修改了想法
121        // TODO 需要考虑是否进行边界判断
122        if _align_order != 0 {
123            None
124        } else {
125            self.tree.delete(&self.order)
126        }
127    }
128
129    /// insert node into avl_buddy
130    fn put(&mut self, idx: usize) -> Option<usize> {
131        // 需要额外考虑一个事情,就是在进行分配的时候,最小分配单元必须大于Node,因为这个Node实际上是存放在分配的空间中的,因此需要加入判定以确保空间不会出现重叠的情况
132        // buddy序号为 0 时地址为空指针,跳过合并。
133        if idx ^ 1 == 0 {
134            self.tree.insert_no_merge(idx, &self.order);
135            return None;
136        }
137        if self.tree.insert(idx, &self.order) {
138            None
139        } else {
140            // find it's buddy
141            /* DEBUG */
142            // println!("facing it's buddy");
143            // Some(idx & (!(1)))
144            Some(idx >> 1)
145        }
146    }
147}
148
149impl fmt::Debug for AvlBuddy {
150    /// 以序列化前序遍历的方式输出
151    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
152        // 这个地方我认为相对来说较难复现前面的算法,即使用层序便利对于结果进行呈现,可能需要采用标准搜索方案来对于结果进行呈现
153        // 同时由于在trait外部实现dfs算法相对比较困难(感觉会造成割裂感),因此采用内部函数递归来实现这个操作
154        write!(f, "[")?;
155
156        fn dfs(root: &Tree, order: &Order, f: &mut fmt::Formatter<'_>) -> fmt::Result {
157            // if it's leaf node
158            match root.0 {
159                // if it's leaf node
160                None => write!(f, "#,"),
161                Some(root_node) => {
162                    // let a = root_node.as_ref().l;
163                    write!(f, "{:#x}[{:?}],", order.ptr_to_idx(root_node), unsafe {
164                        root_node.as_ref().h
165                    })?;
166                    // write!(f, "{:#x}[{:?}],", root_node.as_ptr() as usize, unsafe { root_node.as_ref().h })?;
167                    // write!(f, "{:#x},", root_node.as_ptr() as usize)?;
168                    dfs(unsafe { &root_node.as_ref().l }, order, f)?;
169                    // write!(f, "{:#x},", root_node.as_ptr() as usize)?;
170                    dfs(unsafe { &root_node.as_ref().r }, order, f)
171                }
172            }
173            // if let None = root.0 {
174            //     write!(f, "#")
175            // }
176            // else {
177            //     write!(f, "{:X}", root.0.)
178            // }
179        }
180
181        dfs(&self.tree, &self.order, f)?;
182        write!(f, "]")
183    }
184}
185
186impl fmt::Debug for Node {
187    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
188        if let Some(left) = self.l.0 {
189            write!(f, "l:{:#x?}", left.as_ptr() as usize)?;
190            write!(f, "[{:?}] ", unsafe { left.as_ref().h })?;
191        } else {
192            write!(f, "l:null             ")?;
193        }
194        if let Some(right) = self.r.0 {
195            write!(f, "r:{:#x?}", right.as_ptr() as usize)?;
196            write!(f, "[{:?}] ", unsafe { right.as_ref().h })?;
197        } else {
198            write!(f, "r:null             ")?;
199        }
200        write!(f, "h:{}", self.h)
201    }
202}
203
204impl fmt::Debug for Tree {
205    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
206        if let Some(root) = self.0 {
207            write!(f, "{:?}", root)
208        } else {
209            write!(f, "null")
210        }
211    }
212}
213
214#[repr(transparent)]
215#[derive(Clone, Copy)]
216struct Tree(Option<NonNull<Node>>);
217
218#[repr(C)]
219#[derive(Clone, Copy)]
220struct Node {
221    l: Tree,
222    r: Tree,
223    h: usize,
224}
225
226/// 以递归方式找到距离传入子树最大节点最近的子树节点
227///
228/// 注意:调用者需要考虑到传出节点可能存在反向子树的情况
229///     这个地方没有考虑到开始递归节点处可能在一开始就没有右子树的情况
230fn find_max(node: &NonNull<Node>) -> NonNull<Node> {
231    // 需要考虑到有左子树的情况
232    //  [A]
233    //    \
234    //     [B] (node.r)
235    //    /
236    //   [?]
237    let right = unsafe { node.as_ref().r.0 };
238    if let Some(right_node) = right {
239        if unsafe { right_node.as_ref().r.0.is_some() } {
240            // if have right and it's right
241            find_max(&right_node)
242        } else {
243            *node
244        }
245    } else {
246        *node
247        // NonNull::new(node.as_ptr()).unwrap()
248    }
249}
250
251/// 以递归方式找到并返回距离最小子树最近的子树
252///
253/// 注意:调用者需要考虑到可能传出节点存在反向子树的情况
254///     在这个地方没有考虑到开始递归节点可能一开始就没有左子树的情况
255fn find_min(node: &NonNull<Node>) -> NonNull<Node> {
256    // 需要考虑有右子树的情况
257    //    [a]
258    //    /
259    //   [b]            (min point)
260    //    \
261    //     [c]
262    let left = unsafe { node.as_ref().l.0 };
263    if let Some(left_node) = left {
264        if unsafe { left_node.as_ref().l.0.is_some() } {
265            find_min(&left_node)
266        } else {
267            *node
268        }
269    } else {
270        *node
271        // NonNull::new(node.as_ptr()).unwrap()
272    }
273}
274
275impl Tree {
276    /// 向当前节点处插入一个节点
277    ///
278    /// 在碰到节点与伙伴节点同时存在的情况下,会删除伙伴节点并且返回false [插入失败]
279    fn insert(&mut self, idx: usize, order: &Order) -> bool {
280        // 这个地方我认为目前的速度瓶颈主要出现在大量使用递归所带来的影响,但是考虑到本lab主要完成的是分配器,因此可能没有办法实现动态的内存分配,进而使用栈或者队列来实现对应操作
281
282        // 版本二:在进行插入的时候直接完成对应伙伴节点的删除工作
283        let ptr: NonNull<Node> = order.idx_to_ptr(idx).expect("block address is null");
284        match self.0 {
285            // if this node is not empty
286            Some(mut root_ptr) => {
287                let root = unsafe { root_ptr.as_mut() };
288                let buddy = order
289                    .idx_to_ptr::<Node>(idx ^ 1)
290                    .expect("buddy address is null");
291                use core::cmp::Ordering::*;
292                // use core::mem::replace;
293
294                // 找到我们需要去的方向
295                let ret = match root_ptr.cmp(&buddy) {
296                    Less => {
297                        // 向右前方前进, 并且右边子树节点为伙伴节点 => 此时做可能出现的所有删除情形的判断
298                        if root.r.0.is_some() && order.ptr_to_idx(root.r.0.unwrap()) == idx ^ 1 {
299                            // 要删除的节点
300                            let node = unsafe { root.r.0.unwrap().as_mut() };
301                            // 测试两个子树的状态
302                            match (node.l.0.is_some(), node.r.0.is_some()) {
303                                (true, true) => {
304                                    // have both left and right subtree
305                                    if node.l.height() < node.r.height() {
306                                        // right tree higher than left tree
307                                        // root:    the point you using the function
308                                        // node:    the point you want to delete
309                                        // byond:   the point byond the leaf
310                                        //  [A]   (root)    |   [A]
311                                        //  / \             |   / \
312                                        // .. [B] (node)    |  ..  [E]
313                                        //    /       \     |      /  \
314                                        //  [C](byond)[D]   |    [C]  [D]
315                                        //    \             |     \
316                                        //    [E] (leaf)    |     [F]
317                                        //     \
318                                        //      [F]
319                                        if node.r.height() == 1 {
320                                            // right subtree is leaf => delete node
321                                            let leaf = unsafe { node.r.0.unwrap().as_mut() };
322                                            leaf.l = Tree(node.l.0);
323                                            root.r = Tree(NonNull::new(leaf));
324                                            leaf.update();
325                                            root.update();
326                                        } else {
327                                            // right subtree has subtree => delete link and relink this link to it's parent then delete node
328                                            let beyond =
329                                                unsafe { find_min(&node.r.0.unwrap()).as_mut() };
330
331                                            if let Some(mut leaf) = beyond.l.0 {
332                                                // 如果 beyond 存在左节点
333                                                let leaf = unsafe { leaf.as_mut() };
334
335                                                // 如果 leaf 存在反方向节点
336                                                if leaf.r.0.is_some() {
337                                                    beyond.l = Tree(leaf.l.0);
338                                                    leaf.l = Tree(None);
339                                                } else {
340                                                    beyond.l = Tree(None);
341                                                }
342                                                leaf.l = Tree(node.l.0);
343                                                leaf.r = Tree(node.r.0);
344                                                root.r = Tree(NonNull::new(leaf));
345                                                leaf.update();
346                                                root.update();
347                                            } else {
348                                                // 将 beyond 作为 leaf 替换 node 的位置
349                                                beyond.l = Tree(node.l.0);
350                                                root.r = Tree(NonNull::new(beyond));
351                                                beyond.update();
352                                                root.update();
353                                            }
354                                        }
355                                    } else {
356                                        // left tree higher than right subtree
357                                        // root:    the point you using the function
358                                        // node:    the point you want to delete
359                                        // byond:   the point byond the leaf
360                                        // [A]   (root)     | [A]
361                                        //   \              |  \
362                                        //   [B] (node)     |   [E]
363                                        //   / \            |   / \
364                                        //  [C] [D](byond)  | [C] [D]
365                                        //      /           |       \
366                                        // (E:leaf)         |        [F]
367                                        //     \
368                                        //     [F]
369                                        if node.l.height() == 1 {
370                                            // left subtree is leaf => delete node
371                                            let leaf = unsafe { node.l.0.unwrap().as_mut() };
372                                            leaf.r = Tree(node.r.0);
373                                            root.r = Tree(NonNull::new(leaf));
374                                            leaf.update();
375                                            root.update();
376                                        } else {
377                                            #[allow(unused_variables, unused_mut, dead_code)]
378                                            // left subtree has subtree => delete link and relink this link to it's parent then delete node
379                                            let mut beyond =
380                                                unsafe { find_max(&node.l.0.unwrap()).as_mut() };
381
382                                            if let Some(mut leaf) = beyond.r.0 {
383                                                // 如果 beyond 存在右子树【这个实际上是为了弥补 find_max 中无法获取这种情况下距离最大节点最近的节点设计的】
384                                                let leaf = unsafe { leaf.as_mut() };
385
386                                                // 如果 leaf 存在反方向子树
387                                                if leaf.l.0.is_some() {
388                                                    beyond.r = Tree(leaf.l.0);
389                                                    leaf.l = Tree(None);
390                                                } else {
391                                                    beyond.r = Tree(None);
392                                                }
393                                                leaf.l = Tree(node.l.0);
394                                                leaf.r = Tree(node.r.0);
395                                                root.r = Tree(NonNull::new(leaf));
396                                                leaf.update();
397                                                root.update();
398                                            } else {
399                                                // 将 beyond 作为 leaf 替换 node 的位置
400                                                beyond.r = Tree(node.r.0);
401                                                root.r = Tree(NonNull::new(beyond));
402                                                beyond.update();
403                                                root.update();
404                                            }
405                                        }
406                                    }
407                                    node.update();
408                                    root.r.rotate();
409                                }
410                                (true, false) => {
411                                    // have left but not right
412                                    // [A] <- root   | [A]
413                                    //   \           |   \
414                                    //    [B] <- node|  [C]
415                                    //    /          |
416                                    //  [C]          |
417                                    root.r = Tree(Some(node.l.0.unwrap()));
418                                    node.l = Tree(None); // 可有可无?
419                                    root.update();
420                                }
421                                (false, true) => {
422                                    // have left but not right
423                                    // [A] <- root   | [A]
424                                    //   \           |   \
425                                    //    [B] <- node|  [C]
426                                    //      \        |
427                                    //      [C]      | 这个地方不能直接上旋转,将节点转到叶子的原因是太麻烦了
428                                    root.r = Tree(Some(node.r.0.unwrap()));
429                                    node.r = Tree(None);
430                                    root.update();
431                                }
432                                (false, false) => {
433                                    root.r = Tree(None);
434                                    root.update();
435                                }
436                            }
437                            return false;
438                        } else {
439                            // 如果前进的方向不是 buddy 节点,则以递归方式继续进行插入,一直到达对应的位置(插入于空节点)
440                            root.r.insert(idx, order)
441                        }
442                    }
443                    Equal => {
444                        // 个人感觉这个地方只可能出现在根节点处
445                        match (root.l.0.is_some(), root.r.0.is_some()) {
446                            (true, true) => {
447                                match (
448                                    root.l.height() < root.r.height(),
449                                    core::cmp::max(root.l.height(), root.r.height()),
450                                ) {
451                                    (_, 1) => {
452                                        // if both of left and right is leaf => choice left as root
453                                        let left = unsafe { root.l.0.unwrap().as_mut() };
454                                        // left.l = Tree(None);
455                                        left.r = Tree(root.r.0);
456                                        self.0 = NonNull::new(left);
457                                        left.update();
458                                    }
459                                    (true, _) => {
460                                        // right higher that left
461                                        let beyond =
462                                            unsafe { find_min(&root.r.0.unwrap()).as_mut() };
463
464                                        if let Some(mut leaf) = beyond.l.0 {
465                                            let leaf = unsafe { leaf.as_mut() };
466
467                                            if leaf.r.0.is_some() {
468                                                beyond.l = Tree(leaf.r.0);
469                                                leaf.r = Tree(None);
470                                            } else {
471                                                beyond.l = Tree(None);
472                                            }
473                                            leaf.l = Tree(root.l.0);
474                                            leaf.r = Tree(root.r.0);
475                                            self.0 = NonNull::new(leaf);
476                                            leaf.update();
477                                        } else {
478                                            // 取右边最高节点出来作为root
479                                            let right = unsafe { root.r.0.unwrap().as_mut() };
480                                            right.l = Tree(root.l.0);
481                                            self.0 = NonNull::new(right);
482                                            right.update();
483                                        }
484                                    }
485                                    (false, _) => {
486                                        // left higher than right
487                                        let beyond =
488                                            unsafe { find_max(&root.l.0.unwrap()).as_mut() };
489                                        if let Some(mut leaf) = beyond.r.0 {
490                                            let leaf = unsafe { leaf.as_mut() };
491
492                                            if leaf.l.0.is_some() {
493                                                beyond.r = Tree(leaf.l.0);
494                                                leaf.l = Tree(None);
495                                            } else {
496                                                beyond.r = Tree(None);
497                                            }
498                                            leaf.l = Tree(root.l.0);
499                                            leaf.r = Tree(root.r.0);
500                                            self.0 = NonNull::new(leaf);
501                                            leaf.update();
502                                        } else {
503                                            let left = unsafe { root.l.0.unwrap().as_mut() };
504                                            left.r = Tree(root.r.0);
505                                            self.0 = NonNull::new(left);
506                                            left.update()
507                                        }
508                                    }
509                                }
510                            }
511                            (true, false) => {
512                                self.0 = Some(root.l.0.unwrap());
513                            }
514                            (false, true) => {
515                                self.0 = Some(root.r.0.unwrap());
516                            }
517                            (false, false) => {
518                                self.0 = None;
519                                return false;
520                            }
521                        };
522                        false
523                    }
524                    Greater => {
525                        // 向左方前进,前进前确认对应节点是否存在,以及节点是否是buddy
526                        if root.l.0.is_some() && order.ptr_to_idx(root.l.0.unwrap()) == idx ^ 1 {
527                            // if delete node is not leaf => delete link
528                            let node = unsafe { root.l.0.unwrap().as_mut() };
529                            match (node.l.0.is_some(), node.r.0.is_some()) {
530                                (true, true) => {
531                                    // have both left and right subtree
532                                    if node.l.height() < node.r.height() {
533                                        // right tree higher than left tree
534                                        // node:    the point you want to delete
535                                        // byond:   the point byond the leaf
536                                        //      [A] (root)  |      [A]
537                                        //     /            |       /
538                                        // . [B] (node)     |      [E]
539                                        //    /       \     |      /  \
540                                        //  [C](byond)[D]   |    [C]  [D]
541                                        //    \             |     \
542                                        //    [E] (leaf)    |     [F]
543                                        //     \
544                                        //      [F]// 找到距离左子树最大节点最近的节点
545                                        if node.r.height() == 1 {
546                                            let leaf = unsafe { node.r.0.unwrap().as_mut() };
547                                            leaf.l = Tree(node.l.0);
548                                            root.l = Tree(NonNull::new(leaf));
549                                            leaf.update();
550                                            root.update();
551                                        } else {
552                                            let beyond =
553                                                unsafe { find_min(&node.r.0.unwrap()).as_mut() };
554                                            if let Some(mut leaf) = beyond.l.0 {
555                                                // 如果 beyond 存在左子树
556                                                let leaf = unsafe { leaf.as_mut() };
557
558                                                // 如果存在反方向子树
559                                                if leaf.r.0.is_some() {
560                                                    beyond.l = Tree(leaf.r.0);
561                                                    leaf.r = Tree(None);
562                                                } else {
563                                                    beyond.l = Tree(None);
564                                                }
565
566                                                leaf.l = Tree(node.l.0);
567                                                leaf.r = Tree(node.r.0);
568                                                root.l = Tree(NonNull::new(leaf));
569
570                                                leaf.update();
571                                                root.update();
572                                            } else {
573                                                // 将 beyond 作为 leaf 替换 node
574                                                beyond.l = Tree(node.l.0);
575                                                root.l = Tree(NonNull::new(beyond));
576                                                beyond.update();
577                                                root.update();
578                                            }
579                                        }
580                                    } else {
581                                        // left tree higher than right subtree
582                                        // node:    the point you want to delete
583                                        // byond:   the point byond the leaf
584                                        //    [A]   (root)  |     [A]
585                                        //    /             |    /
586                                        //   [B] (node)     |   [E]
587                                        //   / \            |   / \
588                                        //  [C] [D](byond)  | [C] [D]
589                                        //      /           |       \
590                                        // (E:leaf)         |        [F]
591                                        //     \
592                                        //     [F]
593                                        if node.l.height() == 1 {
594                                            // left subtree is leaf => delete node
595                                            let leaf = unsafe { node.l.0.unwrap().as_mut() };
596                                            leaf.r = Tree(node.r.0);
597                                            root.l = Tree(NonNull::new(leaf));
598                                            leaf.update();
599                                            root.update();
600                                        } else {
601                                            // left subtree has subtree => delete link and relink this link to it's parent then delete node
602                                            let beyond =
603                                                unsafe { find_max(&node.l.0.unwrap()).as_mut() };
604                                            if let Some(mut leaf) = beyond.r.0 {
605                                                let leaf = unsafe { leaf.as_mut() };
606
607                                                if leaf.l.0.is_some() {
608                                                    beyond.r = Tree(leaf.l.0);
609                                                    leaf.l = Tree(None);
610                                                } else {
611                                                    beyond.r = Tree(None);
612                                                }
613                                                leaf.l = Tree(node.l.0);
614                                                leaf.r = Tree(node.r.0);
615                                                root.l = Tree(NonNull::new(leaf));
616                                                leaf.update();
617                                                root.update();
618                                            } else {
619                                                beyond.r = Tree(node.r.0);
620                                                root.l = Tree(NonNull::new(beyond));
621                                                beyond.update();
622                                                root.update();
623                                            }
624                                        }
625                                    }
626                                }
627                                (true, false) => {
628                                    // have left but not right
629                                    //      [A] <- root |   [A]
630                                    //     /            |   /
631                                    //    [B] <- node   |  [C]
632                                    //    /             |
633                                    //  [C]             |
634                                    root.l = Tree(Some(node.l.0.unwrap()));
635                                    node.l = Tree(None);
636                                    node.update();
637                                }
638                                (false, true) => {
639                                    // have left but not right
640                                    //      [A] <- root |    [A]
641                                    //      /           |   /
642                                    //    [B] <- node   |  [C]
643                                    //      \           |
644                                    //      [C]         |
645                                    root.l = Tree(Some(node.r.0.unwrap()));
646                                    node.l = Tree(None);
647                                    node.update();
648                                }
649                                (false, false) => {
650                                    // is leaf node
651                                    root.l = Tree(None);
652                                    root.update();
653                                }
654                            }
655                            return false;
656                        } else {
657                            // 如果前进的方向不是 buddy 节点,则以递归方式继续进行插入,一直到达对应的位置(插入于空节点)
658                            root.l.insert(idx, order)
659                        }
660                    }
661                };
662                root.update();
663                unsafe { self.0.unwrap().as_mut() }.update();
664                self.rotate();
665                ret
666            }
667            // if this node is empty => insert in this point
668            None => {
669                self.0 = Some(ptr);
670                *unsafe { order.idx_to_ptr(idx).unwrap().as_mut() } = Node {
671                    l: Tree(None),
672                    r: Tree(None),
673                    h: 1,
674                };
675                true
676            }
677        }
678    }
679
680    /// 插入结点(不合并buddy)。buddy地址为空时使用。
681    fn insert_no_merge(&mut self, idx: usize, order: &Order) {
682        let ptr: NonNull<Node> = order.idx_to_ptr(idx).expect("block address is null");
683        match self.0 {
684            Some(mut root_ptr) => {
685                let root = unsafe { root_ptr.as_mut() };
686                if ptr < root_ptr {
687                    root.l.insert_no_merge(idx, order);
688                } else {
689                    root.r.insert_no_merge(idx, order);
690                }
691                root.update();
692                self.rotate();
693            }
694            None => {
695                self.0 = Some(ptr);
696                unsafe {
697                    ptr.as_ptr().write(Node {
698                        l: Tree(None),
699                        r: Tree(None),
700                        h: 1,
701                    });
702                }
703            }
704        }
705    }
706
707    /// 从地址池中获取一个单位的地址, 并且返回这个地址
708    fn delete(&mut self, order: &Order) -> Option<usize> {
709        /*
710        根据需求,此处需要实现的子模块包括,通过 左右子树中的最小高度导航到 到最近的叶子结点,然后再进行 删除节点操作
711        删除节点操作的时候,由于当前操作在叶子节点处产生,因此不需要考虑额外信息,直接将其删除即可
712        */
713        match self.0 {
714            None => None,
715            Some(mut root_ptr) => {
716                let root = unsafe { root_ptr.as_mut() };
717                let ret = match (root.l.0.is_some(), root.r.0.is_some()) {
718                    (true, true) => {
719                        // have both left and right subtree
720                        // 如果某个方向只剩下一个节点,则直接删除这个节点,并且返回对应信息
721                        // 否则以递归方式继续进行
722                        // 这个地方实际上主要目的在于减少代码量...但是反而带来了可读性的降低
723                        match (
724                            root.l.height() < root.r.height(),
725                            core::cmp::min(root.l.height(), root.r.height()),
726                        ) {
727                            (true, 1) => {
728                                let node = order.ptr_to_idx(root.l.0.unwrap());
729                                root.l = Tree(None);
730                                root.update();
731                                return Some(node);
732                            }
733                            (true, _) => root.l.delete(order),
734                            (false, 1) => {
735                                let node = order.ptr_to_idx(root.r.0.unwrap());
736                                root.r = Tree(None);
737                                root.update();
738                                return Some(node);
739                            }
740                            (false, _) => root.r.delete(order),
741                        }
742                    }
743                    (true, false) => {
744                        // only have left subtree
745                        match root.l.height() {
746                            1 => {
747                                let node = order.ptr_to_idx(root.l.0.unwrap());
748                                root.l = Tree(None);
749                                root.update();
750                                return Some(node);
751                            }
752                            _ => root.l.delete(order),
753                        }
754                    }
755                    (false, true) => {
756                        // only have right subtree
757                        match root.r.height() {
758                            1 => {
759                                let node = order.ptr_to_idx(root.r.0.unwrap());
760                                root.r = Tree(None);
761                                root.update();
762                                return Some(node);
763                            }
764                            _ => root.r.delete(order),
765                        }
766                    }
767                    (false, false) => {
768                        // this is the root node (and it's leaf) => clean itself
769                        // let node = self.0.unwrap().as_ptr() as usize;
770                        let node = order.ptr_to_idx(self.0.unwrap());
771                        self.0 = None;
772                        return Some(node);
773                    }
774                };
775                root.update();
776                self.rotate();
777                ret
778            }
779        }
780    }
781
782    /// 树高。
783    ///
784    /// 空树高度为 0;单独的结点高度为 1。
785    #[inline]
786    fn height(&self) -> usize {
787        self.0.map_or(0, |node| unsafe { node.as_ref() }.h)
788    }
789
790    /// 旋转
791    fn rotate(&mut self) {
792        let root = unsafe { self.0.unwrap().as_mut() };
793        let bf = root.bf();
794        if bf > 1 {
795            if unsafe { root.l.0.unwrap().as_mut() }.bf() >= 0 {
796                self.rotate_r();
797            } else {
798                root.l.rotate_l();
799                self.rotate_r();
800            }
801        } else if bf < -1 {
802            if unsafe { root.r.0.unwrap().as_mut() }.bf() <= 0 {
803                self.rotate_l();
804            } else {
805                root.r.rotate_r();
806                self.rotate_l();
807            }
808        }
809    }
810
811    #[inline]
812    /// 右旋
813    fn rotate_r(&mut self) {
814        use core::mem::replace;
815        let a = unsafe { self.0.unwrap().as_mut() };
816        let b = unsafe { a.l.0.unwrap().as_mut() };
817        //     A    ->    B     |     -->
818        //    / \   ->   / \    |    _[A]
819        //   B   γ  ->  α   A   |    /|  \
820        //  / \     ->     / \  |   /    _\|
821        // α   β    ->    β   γ | [B]<----[β]
822        self.0 = replace(&mut a.l.0, replace(&mut b.r.0, self.0));
823        a.update();
824        b.update();
825    }
826
827    #[inline]
828    /// 左旋
829    fn rotate_l(&mut self) {
830        use core::mem::replace;
831        let a = unsafe { self.0.unwrap().as_mut() };
832        let b = unsafe { a.r.0.unwrap().as_mut() };
833        //   A      ->      B   |     <--
834        //  / \     ->     / \  |     [A]_
835        // α   B    ->    A   γ |    /  |\
836        //    / \   ->   / \    |  |/_    \
837        //   β   γ  ->  α   β   | [β]---->[B]
838        self.0 = replace(&mut a.r.0, replace(&mut b.l.0, self.0));
839        a.update();
840        b.update();
841    }
842}
843
844impl Node {
845    /// 更新结点。
846    #[inline]
847    fn update(&mut self) {
848        // 结点高度比左右子树中高的高 1
849        self.h = core::cmp::max(self.l.height(), self.r.height()) + 1;
850    }
851
852    /// 平衡因子。
853    #[inline]
854    fn bf(&self) -> isize {
855        self.l.height() as isize - self.r.height() as isize
856    }
857}
858
859#[cfg(test)]
860#[allow(unused_variables, dead_code)]
861mod test {
862    // 这个地方主要是基于白盒测试点需要实现的,但是随之出现的问题在于其依赖项(pirnt(删除不方便测试),vec[非——必要])
863    // 没有办法在no_std的情况下运行,也因 rust pub use only for tests 相对比较复杂,同时可能有隔离的问题,因而没有使用这个方法
864    // 也不太能转换成为 write 宏进行实现
865    use super::*;
866
867    #[repr(C, align(4096))]
868    struct Page([u8; 4096]);
869
870    impl Page {
871        const ZERO: Self = Self([0; 4096]);
872    }
873
874    impl Node {
875        const EMPTY: Node = Self {
876            l: Tree(None),
877            r: Tree(None),
878            h: 1,
879        };
880    }
881
882    /// 256 MiB
883    static mut MEMORY: [Page; 1024] = [Page::ZERO; 1024];
884
885    // 彼此之间要间隔开至少24个数字以防止某种程度上的冲突
886    // NonNull<Node>: 8; Node: 24; u8:1
887    // 0  64  128  192  256  320  384  448  512  576  640  704  768  832  896  960
888    fn create_nonnull_list() -> [NonNull<Node>; 1024 / 64] {
889        // let mut list = Vec::new();
890        let mut list = [NonNull::<Node>::dangling(); 1024 / 64];
891        for i in 0..1024 / 64 {
892            list[i] = unsafe { NonNull::new_unchecked(MEMORY[i * 64].0.as_mut_ptr() as *mut Node) };
893        }
894        /* DEBUG
895        println!("num\tidx\t\tptr");
896        for i in 0..list.len() {
897            print!("> {i}:\t");
898            println!("{:#x?}\t", (list[i].as_ptr() as usize) >> ORDER_LEVEL);
899            // println!("{:#x?}", (list[i].as_ptr() as usize));
900        }
901        */
902        list
903    }
904
905    use crate::{AvlBuddy, BuddyCollection};
906    const ORDER_LEVEL: usize = 12;
907    /* TEST FOR BASAL INSERT OPERATION */
908    #[test]
909    fn test_for_insert_l() {
910        let vec = create_nonnull_list();
911        // println!("{}", vec.len());
912        let mut avl_buddy = AvlBuddy::EMPTY;
913        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
914
915        <AvlBuddy as BuddyCollection>::put(
916            &mut avl_buddy,
917            (vec[7].as_ptr() as usize) >> ORDER_LEVEL,
918        );
919        <AvlBuddy as BuddyCollection>::put(
920            &mut avl_buddy,
921            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
922        );
923        <AvlBuddy as BuddyCollection>::put(
924            &mut avl_buddy,
925            (vec[9].as_ptr() as usize) >> ORDER_LEVEL,
926        );
927        // <avlbuddy as buddycollection>::put(&mut avl_buddy, (vec[6].as_ptr() as usize) >> order_level);
928
929        // let a = unsafe { &avl_buddy.tree.0.unwrap().as_ref().l};
930        // println!("{avl_buddy:#x?}");
931        assert_eq!(avl_buddy.tree.0.unwrap(), vec[8]);
932        assert_eq!(
933            unsafe { avl_buddy.tree.0.unwrap().as_ref().l.0.unwrap() },
934            vec[7]
935        );
936        assert_eq!(
937            unsafe { avl_buddy.tree.0.unwrap().as_ref().r.0.unwrap() },
938            vec[9]
939        );
940    }
941    #[test]
942    fn test_for_insert_r() {
943        let vec = create_nonnull_list();
944        // println!("{}", vec.len());
945        let mut avl_buddy = AvlBuddy::EMPTY;
946        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
947
948        <AvlBuddy as BuddyCollection>::put(
949            &mut avl_buddy,
950            (vec[9].as_ptr() as usize) >> ORDER_LEVEL,
951        );
952        <AvlBuddy as BuddyCollection>::put(
953            &mut avl_buddy,
954            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
955        );
956        <AvlBuddy as BuddyCollection>::put(
957            &mut avl_buddy,
958            (vec[7].as_ptr() as usize) >> ORDER_LEVEL,
959        );
960        // <avlbuddy as buddycollection>::put(&mut avl_buddy, (vec[6].as_ptr() as usize) >> order_level);
961
962        // let a = unsafe { &avl_buddy.tree.0.unwrap().as_ref().l};
963        // println!("{avl_buddy:#x?}");
964        assert_eq!(avl_buddy.tree.0.unwrap(), vec[8]);
965        assert_eq!(
966            unsafe { avl_buddy.tree.0.unwrap().as_ref().l.0.unwrap() },
967            vec[7]
968        );
969        assert_eq!(
970            unsafe { avl_buddy.tree.0.unwrap().as_ref().r.0.unwrap() },
971            vec[9]
972        );
973    }
974    #[test]
975    fn test_for_insert_lr() {
976        let vec = create_nonnull_list();
977        // println!("{}", vec.len());
978        let mut avl_buddy = AvlBuddy::EMPTY;
979        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
980
981        <AvlBuddy as BuddyCollection>::put(
982            &mut avl_buddy,
983            (vec[9].as_ptr() as usize) >> ORDER_LEVEL,
984        );
985        <AvlBuddy as BuddyCollection>::put(
986            &mut avl_buddy,
987            (vec[7].as_ptr() as usize) >> ORDER_LEVEL,
988        );
989        <AvlBuddy as BuddyCollection>::put(
990            &mut avl_buddy,
991            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
992        );
993        // <avlbuddy as buddycollection>::put(&mut avl_buddy, (vec[6].as_ptr() as usize) >> order_level);
994
995        // let a = unsafe { &avl_buddy.tree.0.unwrap().as_ref().l};
996        // println!("{avl_buddy:#x?}");
997        assert_eq!(avl_buddy.tree.0.unwrap(), vec[8]);
998        assert_eq!(
999            unsafe { avl_buddy.tree.0.unwrap().as_ref().l.0.unwrap() },
1000            vec[7]
1001        );
1002        assert_eq!(
1003            unsafe { avl_buddy.tree.0.unwrap().as_ref().r.0.unwrap() },
1004            vec[9]
1005        );
1006    }
1007    #[test]
1008    fn test_for_insert_rl() {
1009        let vec = create_nonnull_list();
1010        // println!("{}", vec.len());
1011        let mut avl_buddy = AvlBuddy::EMPTY;
1012        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
1013
1014        <AvlBuddy as BuddyCollection>::put(
1015            &mut avl_buddy,
1016            (vec[7].as_ptr() as usize) >> ORDER_LEVEL,
1017        );
1018        <AvlBuddy as BuddyCollection>::put(
1019            &mut avl_buddy,
1020            (vec[9].as_ptr() as usize) >> ORDER_LEVEL,
1021        );
1022        <AvlBuddy as BuddyCollection>::put(
1023            &mut avl_buddy,
1024            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
1025        );
1026
1027        // println!("{avl_buddy:#x?}");
1028        assert_eq!(avl_buddy.tree.0.unwrap(), vec[8]);
1029        assert_eq!(
1030            unsafe { avl_buddy.tree.0.unwrap().as_ref().l.0.unwrap() },
1031            vec[7]
1032        );
1033        assert_eq!(
1034            unsafe { avl_buddy.tree.0.unwrap().as_ref().r.0.unwrap() },
1035            vec[9]
1036        );
1037    }
1038    /* TEST FOR BUDDY OPERATION: DELETE BUDDY NODE AND NOT INSERT */
1039    #[test]
1040    fn test_for_insert_buddy_root() {
1041        let vec = create_nonnull_list();
1042        // println!("{}", vec.len());
1043        let mut avl_buddy = AvlBuddy::EMPTY;
1044        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
1045
1046        let root_idx = (vec[7].as_ptr() as usize) >> ORDER_LEVEL;
1047        let buddy_idx = ((vec[7].as_ptr() as usize) >> ORDER_LEVEL) ^ 1;
1048        // println!("{root_idx:#x?}\t{buddy_idx:#x?}");
1049        <AvlBuddy as BuddyCollection>::put(&mut avl_buddy, root_idx);
1050        <AvlBuddy as BuddyCollection>::put(&mut avl_buddy, buddy_idx);
1051
1052        // println!("{avl_buddy:#x?}");
1053        assert_eq!(avl_buddy.tree.0, None);
1054    }
1055    #[test]
1056    fn test_for_insert_buddy_left_leaf() {
1057        let vec = create_nonnull_list();
1058        // println!("{}", vec.len());
1059        let mut avl_buddy = AvlBuddy::EMPTY;
1060        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
1061
1062        let buddy_idx = ((vec[7].as_ptr() as usize) >> ORDER_LEVEL) ^ 1;
1063        // println!("{buddy_idx:#x?}");
1064        <AvlBuddy as BuddyCollection>::put(
1065            &mut avl_buddy,
1066            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
1067        );
1068        <AvlBuddy as BuddyCollection>::put(
1069            &mut avl_buddy,
1070            (vec[7].as_ptr() as usize) >> ORDER_LEVEL,
1071        );
1072        <AvlBuddy as BuddyCollection>::put(
1073            &mut avl_buddy,
1074            (vec[9].as_ptr() as usize) >> ORDER_LEVEL,
1075        );
1076        <AvlBuddy as BuddyCollection>::put(&mut avl_buddy, buddy_idx);
1077
1078        // println!("{avl_buddy:#x?}");
1079        assert_eq!(avl_buddy.tree.0.unwrap(), vec[8]);
1080        assert_eq!(unsafe { avl_buddy.tree.0.unwrap().as_ref().l.0 }, None);
1081        assert_eq!(
1082            unsafe { avl_buddy.tree.0.unwrap().as_ref().r.0.unwrap() },
1083            vec[9]
1084        );
1085    }
1086    #[test]
1087    fn test_for_insert_buddy_right_leaf() {
1088        let vec = create_nonnull_list();
1089        // println!("{}", vec.len());
1090        let mut avl_buddy = AvlBuddy::EMPTY;
1091        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
1092
1093        let buddy_idx = ((vec[9].as_ptr() as usize) >> ORDER_LEVEL) ^ 1;
1094        // println!("{buddy_idx:#x?}");
1095        <AvlBuddy as BuddyCollection>::put(
1096            &mut avl_buddy,
1097            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
1098        );
1099        <AvlBuddy as BuddyCollection>::put(
1100            &mut avl_buddy,
1101            (vec[7].as_ptr() as usize) >> ORDER_LEVEL,
1102        );
1103        <AvlBuddy as BuddyCollection>::put(
1104            &mut avl_buddy,
1105            (vec[9].as_ptr() as usize) >> ORDER_LEVEL,
1106        );
1107        // println!("{avl_buddy:#x?}");
1108        <AvlBuddy as BuddyCollection>::put(&mut avl_buddy, buddy_idx);
1109        // println!("{avl_buddy:#x?}");
1110        assert_eq!(avl_buddy.tree.0.unwrap(), vec[8]);
1111        assert_eq!(
1112            unsafe { avl_buddy.tree.0.unwrap().as_ref().l.0.unwrap() },
1113            vec[7]
1114        );
1115        assert_eq!(unsafe { avl_buddy.tree.0.unwrap().as_ref().r.0 }, None);
1116    }
1117    #[test]
1118    fn test_for_insert_buddy_right_not_leaf_right_only() {
1119        let vec = create_nonnull_list();
1120        // println!("{}", vec.len());
1121        let mut avl_buddy = AvlBuddy::EMPTY;
1122        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
1123
1124        let buddy_idx = ((vec[9].as_ptr() as usize) >> ORDER_LEVEL) ^ 1;
1125        // println!("{buddy_idx:#x?}");
1126        <AvlBuddy as BuddyCollection>::put(
1127            &mut avl_buddy,
1128            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
1129        );
1130        <AvlBuddy as BuddyCollection>::put(
1131            &mut avl_buddy,
1132            (vec[6].as_ptr() as usize) >> ORDER_LEVEL,
1133        );
1134        <AvlBuddy as BuddyCollection>::put(
1135            &mut avl_buddy,
1136            (vec[9].as_ptr() as usize) >> ORDER_LEVEL,
1137        );
1138        <AvlBuddy as BuddyCollection>::put(
1139            &mut avl_buddy,
1140            (vec[4].as_ptr() as usize) >> ORDER_LEVEL,
1141        );
1142        <AvlBuddy as BuddyCollection>::put(
1143            &mut avl_buddy,
1144            (vec[10].as_ptr() as usize) >> ORDER_LEVEL,
1145        );
1146        // println!("{avl_buddy:#x?}");
1147        <AvlBuddy as BuddyCollection>::put(&mut avl_buddy, buddy_idx);
1148        // println!("{avl_buddy:#x?}");
1149        assert_eq!(avl_buddy.tree.0.unwrap(), vec[8]);
1150        assert_eq!(
1151            unsafe { avl_buddy.tree.0.unwrap().as_ref().r.0.unwrap() },
1152            vec[10]
1153        );
1154    }
1155    #[test]
1156    fn test_for_insert_buddy_right_not_leaf_left_only() {
1157        let vec = create_nonnull_list();
1158        // println!("{}", vec.len());
1159        let mut avl_buddy = AvlBuddy::EMPTY;
1160        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
1161
1162        let buddy_idx = ((vec[10].as_ptr() as usize) >> ORDER_LEVEL) ^ 1;
1163        // println!("{buddy_idx:#x?}");
1164        <AvlBuddy as BuddyCollection>::put(
1165            &mut avl_buddy,
1166            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
1167        );
1168        <AvlBuddy as BuddyCollection>::put(
1169            &mut avl_buddy,
1170            (vec[6].as_ptr() as usize) >> ORDER_LEVEL,
1171        );
1172        <AvlBuddy as BuddyCollection>::put(
1173            &mut avl_buddy,
1174            (vec[10].as_ptr() as usize) >> ORDER_LEVEL,
1175        );
1176        <AvlBuddy as BuddyCollection>::put(
1177            &mut avl_buddy,
1178            (vec[4].as_ptr() as usize) >> ORDER_LEVEL,
1179        );
1180        <AvlBuddy as BuddyCollection>::put(
1181            &mut avl_buddy,
1182            (vec[9].as_ptr() as usize) >> ORDER_LEVEL,
1183        );
1184        // println!("{avl_buddy:#x?}");
1185        <AvlBuddy as BuddyCollection>::put(&mut avl_buddy, buddy_idx);
1186
1187        // println!("{avl_buddy:#x?}");
1188        assert_eq!(avl_buddy.tree.0.unwrap(), vec[8]);
1189        assert_eq!(
1190            unsafe { avl_buddy.tree.0.unwrap().as_ref().r.0.unwrap() },
1191            vec[9]
1192        );
1193    }
1194    #[test]
1195    fn test_for_insert_buddy_right_not_leaf_both_no_subleaf() {
1196        let vec = create_nonnull_list();
1197        // println!("{}", vec.len());
1198        let mut avl_buddy = AvlBuddy::EMPTY;
1199        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
1200
1201        let buddy_idx = ((vec[10].as_ptr() as usize) >> ORDER_LEVEL) ^ 1;
1202        // println!("{buddy_idx:#x?}");
1203        <AvlBuddy as BuddyCollection>::put(
1204            &mut avl_buddy,
1205            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
1206        );
1207        <AvlBuddy as BuddyCollection>::put(
1208            &mut avl_buddy,
1209            (vec[6].as_ptr() as usize) >> ORDER_LEVEL,
1210        );
1211        <AvlBuddy as BuddyCollection>::put(
1212            &mut avl_buddy,
1213            (vec[10].as_ptr() as usize) >> ORDER_LEVEL,
1214        );
1215        <AvlBuddy as BuddyCollection>::put(
1216            &mut avl_buddy,
1217            (vec[4].as_ptr() as usize) >> ORDER_LEVEL,
1218        );
1219        <AvlBuddy as BuddyCollection>::put(
1220            &mut avl_buddy,
1221            (vec[9].as_ptr() as usize) >> ORDER_LEVEL,
1222        );
1223        <AvlBuddy as BuddyCollection>::put(
1224            &mut avl_buddy,
1225            (vec[11].as_ptr() as usize) >> ORDER_LEVEL,
1226        );
1227        // println!("{avl_buddy:#x?}");
1228        <AvlBuddy as BuddyCollection>::put(&mut avl_buddy, buddy_idx);
1229        // println!("{avl_buddy:#x?}");
1230        assert_eq!(avl_buddy.tree.0.unwrap(), vec[8]);
1231        assert_eq!(
1232            unsafe { avl_buddy.tree.0.unwrap().as_ref().r.0.unwrap() },
1233            vec[9]
1234        );
1235    }
1236    #[test]
1237    fn test_for_insert_buddy_right_not_leaf_both_with_subleaf() {
1238        let vec = create_nonnull_list();
1239        // println!("{}", vec.len());
1240        let mut avl_buddy = AvlBuddy::EMPTY;
1241        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
1242
1243        let buddy_idx = ((vec[10].as_ptr() as usize) >> ORDER_LEVEL) ^ 1;
1244        // println!("{buddy_idx:#x?}");
1245        <AvlBuddy as BuddyCollection>::put(
1246            &mut avl_buddy,
1247            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
1248        );
1249        <AvlBuddy as BuddyCollection>::put(
1250            &mut avl_buddy,
1251            (vec[6].as_ptr() as usize) >> ORDER_LEVEL,
1252        );
1253        <AvlBuddy as BuddyCollection>::put(
1254            &mut avl_buddy,
1255            (vec[10].as_ptr() as usize) >> ORDER_LEVEL,
1256        );
1257        <AvlBuddy as BuddyCollection>::put(
1258            &mut avl_buddy,
1259            (vec[4].as_ptr() as usize) >> ORDER_LEVEL,
1260        );
1261        <AvlBuddy as BuddyCollection>::put(
1262            &mut avl_buddy,
1263            (vec[9].as_ptr() as usize) >> ORDER_LEVEL,
1264        );
1265        <AvlBuddy as BuddyCollection>::put(
1266            &mut avl_buddy,
1267            (vec[12].as_ptr() as usize) >> ORDER_LEVEL,
1268        );
1269        <AvlBuddy as BuddyCollection>::put(
1270            &mut avl_buddy,
1271            (vec[2].as_ptr() as usize) >> ORDER_LEVEL,
1272        );
1273        <AvlBuddy as BuddyCollection>::put(
1274            &mut avl_buddy,
1275            (vec[11].as_ptr() as usize) >> ORDER_LEVEL,
1276        );
1277        // println!("{avl_buddy:#x?}");
1278        <AvlBuddy as BuddyCollection>::put(&mut avl_buddy, buddy_idx);
1279        // println!("{avl_buddy:#x?}");
1280        assert_eq!(avl_buddy.tree.0.unwrap(), vec[8]);
1281        assert_eq!(
1282            unsafe { avl_buddy.tree.0.unwrap().as_ref().r.0.unwrap() },
1283            vec[11]
1284        );
1285    }
1286    #[test]
1287    fn test_for_delete_root() {
1288        let vec = create_nonnull_list();
1289        // println!("{}", vec.len());
1290        let mut avl_buddy = AvlBuddy::EMPTY;
1291        avl_buddy.init(ORDER_LEVEL, vec[0].as_ptr() as usize);
1292
1293        <AvlBuddy as BuddyCollection>::put(
1294            &mut avl_buddy,
1295            (vec[8].as_ptr() as usize) >> ORDER_LEVEL,
1296        );
1297        let a = <AvlBuddy as BuddyCollection>::take_any(&mut avl_buddy, 0);
1298
1299        assert_eq!(avl_buddy.tree.0, None);
1300    }
1301}