Skip to main content

platform_trees/lists/
absolute_circular_linked_list.rs

1use crate::{AbsoluteLinkedList, LinkType};
2
3pub trait AbsoluteCircularLinkedList<T: LinkType>: AbsoluteLinkedList<T> {
4    fn attach_before(&mut self, base_element: T, new_element: T) {
5        let base_element_previous = self.get_previous(base_element);
6        self.set_previous(new_element, base_element_previous);
7        self.set_next(new_element, base_element);
8        if base_element == self.get_first() {
9            self.set_first(new_element);
10        }
11        self.set_next(base_element_previous, new_element);
12        self.set_previous(base_element, new_element);
13        self.inc_size();
14    }
15
16    fn attach_after(&mut self, base_element: T, new_element: T) {
17        let base_element_next = self.get_next(base_element);
18        self.set_previous(new_element, base_element);
19        self.set_next(new_element, base_element_next);
20        if base_element == self.get_last() {
21            self.set_last(new_element);
22        }
23        self.set_previous(base_element_next, new_element);
24        self.set_next(base_element, new_element);
25        self.inc_size();
26    }
27
28    fn attach_as_first(&mut self, element: T) {
29        let first = self.get_first();
30        if first == T::funty(0) {
31            self.set_first(element);
32            self.set_last(element);
33            self.set_previous(element, element);
34            self.set_next(element, element);
35            self.inc_size();
36        } else {
37            self.attach_before(first, element);
38        }
39    }
40
41    fn attach_as_last(&mut self, element: T) {
42        let last = self.get_last();
43        if last == T::funty(0) {
44            self.attach_as_first(element);
45        } else {
46            self.attach_after(last, element);
47        }
48    }
49
50    fn detach(&mut self, element: T) {
51        let element_previous = self.get_previous(element);
52        let element_next = self.get_next(element);
53        if element_next == element {
54            self.set_first(T::funty(0));
55            self.set_last(T::funty(0));
56        } else {
57            self.set_next(element_previous, element_next);
58            self.set_previous(element_next, element_previous);
59            if element == self.get_first() {
60                self.set_first(element_next);
61            }
62            if element == self.get_last() {
63                self.set_last(element_previous);
64            }
65        }
66        self.set_previous(element, T::funty(0));
67        self.set_next(element, T::funty(0));
68        self.dec_size();
69    }
70}