platform_trees/lists/
absolute_circular_linked_list.rs1use crate::{AbsoluteLinkedList, LinkType};
2
3pub trait AbsoluteCircularLinkedList<T: LinkType>: AbsoluteLinkedList<T> {
12 fn attach_before(&mut self, base_element: T, new_element: T) {
17 let base_element_previous = self.get_previous(base_element);
18 self.set_previous(new_element, base_element_previous);
19 self.set_next(new_element, base_element);
20 if base_element == self.get_first() {
21 self.set_first(new_element);
22 }
23 self.set_next(base_element_previous, new_element);
24 self.set_previous(base_element, new_element);
25 self.inc_size();
26 }
27
28 fn attach_after(&mut self, base_element: T, new_element: T) {
33 let base_element_next = self.get_next(base_element);
34 self.set_previous(new_element, base_element);
35 self.set_next(new_element, base_element_next);
36 if base_element == self.get_last() {
37 self.set_last(new_element);
38 }
39 self.set_previous(base_element_next, new_element);
40 self.set_next(base_element, new_element);
41 self.inc_size();
42 }
43
44 fn attach_as_first(&mut self, element: T) {
49 let first = self.get_first();
50 if first == T::funty(0) {
51 self.set_first(element);
52 self.set_last(element);
53 self.set_previous(element, element);
54 self.set_next(element, element);
55 self.inc_size();
56 } else {
57 self.attach_before(first, element);
58 }
59 }
60
61 fn attach_as_last(&mut self, element: T) {
65 let last = self.get_last();
66 if last == T::funty(0) {
67 self.attach_as_first(element);
68 } else {
69 self.attach_after(last, element);
70 }
71 }
72
73 fn detach(&mut self, element: T) {
78 let element_previous = self.get_previous(element);
79 let element_next = self.get_next(element);
80 if element_next == element {
81 self.set_first(T::funty(0));
82 self.set_last(T::funty(0));
83 } else {
84 self.set_next(element_previous, element_next);
85 self.set_previous(element_next, element_previous);
86 if element == self.get_first() {
87 self.set_first(element_next);
88 }
89 if element == self.get_last() {
90 self.set_last(element_previous);
91 }
92 }
93 self.set_previous(element, T::funty(0));
94 self.set_next(element, T::funty(0));
95 self.dec_size();
96 }
97}