1pub(crate) struct Free(FreeInner);
2pub(crate) struct FreeInner {
3 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 front: usize,
21 back: usize,
23 generation: usize,
25 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}