platform_trees/lists/
absolute_circular_linked_list.rs1use 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}