tree_node/
node.rs

1use crate::mutable::Mutable;
2
3#[derive(Debug)]
4pub struct Node<T> {
5    parent: * const Node<T>,
6    children: Vec<Box<Node<T>>>,
7    id: usize,
8    value: T,
9}
10
11impl<T> Node<T> {
12
13    pub(crate) fn new(parent: * const Node<T>, value: T, id: usize) -> Self {
14        Self {
15            parent,
16            children: Vec::new(),
17            value,
18            id,
19        }
20    }
21
22    pub fn add_child(&self, child_data: T) -> &Node<T> {
23        let child = Box::new(Node::new(
24            self as * const Node<T>,
25            child_data,
26            self.children.len(),
27        ));
28        unsafe { self.mut_self().children.push(child) };
29        self.children.last().unwrap()
30    }
31
32    pub fn insert_child(&self, child_data: T, index: usize) -> &Node<T> {
33        let child = Box::new(Node::new(
34            self as * const Node<T>,
35            child_data,
36            index,
37        ));
38        unsafe { self.mut_self().children.insert(index, child) };
39        self.increase_child_ids(index + 1, 1);
40        self.children.get(index).unwrap()
41    }
42
43    pub unsafe fn remove_child(&self, index: usize) {
44        let child = self.mut_self().children.get_mut(index).unwrap();
45        child.parent = std::ptr::null();
46        child.id = 0;
47        self.mut_self().children.remove(index);
48        self.decrease_child_ids(index, 1);
49    }
50
51    pub fn child(&self, index: usize) -> &Node<T> {
52        self.children.get(index).unwrap()
53    }
54
55    pub unsafe fn child_mut(&self, index: usize) -> &mut Node<T> {
56        self.mut_self().children.get_mut(index).unwrap()
57    }
58
59    pub fn parent(&self) -> Option<&Node<T>> {
60        if self.parent.is_null() {
61            None
62        } else {
63            unsafe { Some(&*self.parent) }
64        }
65    }
66
67    pub unsafe fn parent_mut(&self) -> Option<&mut Node<T>> {
68        if self.parent.is_null() {
69            None
70        } else {
71            unsafe { Some(&mut *(self.parent as *mut Node<T>)) }
72        }
73    }
74
75    pub fn value(&self) -> &T {
76        &self.value
77    }
78
79    pub unsafe fn value_mut(&self) -> &mut T {
80        &mut self.mut_self().value
81    }
82
83    pub unsafe fn set_value(&self, value: T) {
84        self.mut_self().value = value;
85    }
86
87    unsafe fn mut_self(&self) -> &mut Self {
88        let container = Mutable::new(self as *const Node<T> as *mut Node<T>);
89        container.as_ref(self)
90    }
91
92    fn increase_child_ids(&self, from_index: usize, by: usize) {
93        let children = unsafe { &mut self.mut_self().children };
94        let slice = &mut children[from_index..];
95        slice.iter_mut().for_each(|child| child.id += by);
96    }
97
98    fn decrease_child_ids(&self, from_index: usize, by: usize) {
99        let children = unsafe { &mut self.mut_self().children };
100        let slice = &mut children[from_index..];
101        slice.iter_mut().for_each(|child| child.id -= by);
102    }
103}