hxml/node/
memory.rs

1use super::element::Element;
2use super::pointer::ElementPtr;
3
4// IT'S NOT THREAD-SAFE!!!!
5static 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}