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}