1use super::element::Element;
2use super::pointer::ElementPtr;
3
4static mut FREE_LIST: Vec<usize> = vec![];
6pub static mut ELEMENTS: Vec<Element> = vec![];
7
8pub fn init() {
9 unsafe {
10 ELEMENTS = vec![];
11 FREE_LIST = vec![];
12 }
13}
14
15pub fn delete(pointer: ElementPtr) {
16 unsafe {
17 ELEMENTS[pointer.ptr].is_alive = false;
18 FREE_LIST.push(pointer.ptr);
19
20 for child in pointer.get_children().into_iter() {
21 delete(child);
22 }
23
24 }
25}
26
27pub fn allocate(mut element: Element) -> ElementPtr {
28
29 unsafe {
30
31 if FREE_LIST.len() == 0 {
32 #[cfg(test)]
33 assert!(element.pointer.ptr == super::pointer::NULL);
34
35 element.pointer = ElementPtr::new(ELEMENTS.len());
36 ELEMENTS.push(element);
37
38 ElementPtr::new(ELEMENTS.len() - 1)
39 }
40
41 else {
42 let pointer = FREE_LIST.pop().unwrap();
43 element.pointer = ElementPtr::new(pointer);
44 ELEMENTS[pointer] = element;
45
46 ElementPtr::new(pointer)
47 }
48
49 }
50
51}
52
53pub fn get<'a>(pointer: usize) -> &'a Element {
54 unsafe {
55 &ELEMENTS[pointer]
56 }
57}
58
59pub fn get_mut<'a>(pointer: usize) -> &'a mut Element {
60 unsafe {
61 &mut ELEMENTS[pointer]
62 }
63}