platform_trees/lists/linked_list.rs
1use crate::LinkType;
2
3/// Base doubly-linked list trait providing node-level navigation.
4///
5/// Implementors provide the storage for previous/next pointers.
6/// Higher-level traits ([`AbsoluteLinkedList`](super::AbsoluteLinkedList),
7/// [`RelativeLinkedList`](super::RelativeLinkedList)) build on this to
8/// add head, tail, and size tracking.
9///
10/// # Examples
11///
12/// ```
13/// use platform_trees::LinkedList;
14///
15/// struct SimpleList { prev: Vec<usize>, next: Vec<usize> }
16///
17/// impl LinkedList<usize> for SimpleList {
18/// fn get_previous(&self, el: usize) -> usize { self.prev[el] }
19/// fn get_next(&self, el: usize) -> usize { self.next[el] }
20/// fn set_previous(&mut self, el: usize, p: usize) { self.prev[el] = p; }
21/// fn set_next(&mut self, el: usize, n: usize) { self.next[el] = n; }
22/// }
23///
24/// let mut list = SimpleList {
25/// prev: vec![0; 4],
26/// next: vec![0; 4],
27/// };
28/// list.set_next(1, 2);
29/// assert_eq!(list.get_next(1), 2);
30/// ```
31pub trait LinkedList<T: LinkType> {
32 /// Returns the previous element of `element`.
33 fn get_previous(&self, element: T) -> T;
34
35 /// Returns the next element of `element`.
36 fn get_next(&self, element: T) -> T;
37
38 /// Sets the previous pointer of `element` to `previous`.
39 fn set_previous(&mut self, element: T, previous: T);
40
41 /// Sets the next pointer of `element` to `next`.
42 fn set_next(&mut self, element: T, next: T);
43}