Skip to main content

token_deque/
slot.rs

1pub(crate) struct Free(FreeInner);
2pub(crate) struct FreeInner {
3    // The next free slot.
4    next: usize,
5}
6
7impl Free {
8    fn new(next: usize) -> Free {
9        Free(FreeInner { next })
10    }
11
12    pub(crate) fn next(&self) -> usize {
13        self.0.next
14    }
15}
16
17pub(crate) struct Used<T>(UsedInner<T>);
18struct UsedInner<T> {
19    // The index of the slot before this slot.
20    front: usize,
21    // The index of the slot after this slot.
22    back: usize,
23    // The generation ID for this slot.
24    generation: usize,
25    // The contained data.
26    data: T,
27}
28
29impl<T> Used<T> {
30    fn new(front: usize, back: usize, generation: usize, data: T) -> Used<T> {
31        Used(UsedInner {
32            front,
33            back,
34            generation,
35            data,
36        })
37    }
38
39    pub(crate) fn front(&self) -> usize {
40        self.0.front
41    }
42
43    pub(crate) fn set_front(&mut self, new_front: usize) {
44        self.0.front = new_front;
45    }
46
47    pub(crate) fn back(&self) -> usize {
48        self.0.back
49    }
50
51    pub(crate) fn set_back(&mut self, new_back: usize) {
52        self.0.back = new_back;
53    }
54
55    pub(crate) fn take(self) -> (usize, T, usize) {
56        let Used(UsedInner {
57            front, back, data, ..
58        }) = self;
59        (front, data, back)
60    }
61
62    pub(crate) fn as_generation(&self, g: usize) -> Option<&Used<T>> {
63        if self.0.generation == g {
64            Some(self)
65        } else {
66            None
67        }
68    }
69
70    pub(crate) fn as_generation_mut(&mut self, g: usize) -> Option<&mut Used<T>> {
71        if self.0.generation == g {
72            Some(self)
73        } else {
74            None
75        }
76    }
77
78    pub(crate) fn data(&self) -> &T {
79        &self.0.data
80    }
81
82    pub(crate) fn data_mut(&mut self) -> &mut T {
83        &mut self.0.data
84    }
85}
86
87pub(crate) enum Slot<T> {
88    Free(Free),
89    Used(Used<T>),
90}
91
92impl<T> Slot<T> {
93    pub(crate) fn new_free(next: usize) -> Slot<T> {
94        Slot::Free(Free::new(next))
95    }
96
97    pub(crate) fn new_used(front: usize, back: usize, generation: usize, data: T) -> Slot<T> {
98        Slot::Used(Used::new(front, back, generation, data))
99    }
100
101    pub(crate) fn get_used(&self) -> Option<&Used<T>> {
102        if let Slot::Used(used) = self {
103            Some(used)
104        } else {
105            None
106        }
107    }
108
109    pub(crate) fn get_used_mut(&mut self) -> Option<&mut Used<T>> {
110        if let Slot::Used(used) = self {
111            Some(used)
112        } else {
113            None
114        }
115    }
116
117    pub(crate) fn get_free(&self) -> Option<&Free> {
118        if let Slot::Free(free) = self {
119            Some(free)
120        } else {
121            None
122        }
123    }
124
125    pub(crate) fn into_used(self) -> Option<Used<T>> {
126        if let Slot::Used(used) = self {
127            Some(used)
128        } else {
129            None
130        }
131    }
132}