1use crate::{
2 node_allocator::{NodeAllocator, ZeroCopy, SENTINEL},
3 FromSlice,
4};
5use bytemuck::{Pod, Zeroable};
6
7pub const PREV: u32 = 0;
9pub const NEXT: u32 = 1;
10
11#[repr(C)]
12#[derive(Copy, Clone)]
13pub struct Deque<T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> {
14 pub sequence_number: u64,
15 pub head: u32,
16 pub tail: u32,
17 allocator: NodeAllocator<T, MAX_SIZE, 2>,
18}
19
20unsafe impl<T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> Zeroable
21 for Deque<T, MAX_SIZE>
22{
23}
24unsafe impl<T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> Pod
25 for Deque<T, MAX_SIZE>
26{
27}
28
29impl<T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> ZeroCopy
30 for Deque<T, MAX_SIZE>
31{
32}
33
34impl<T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> FromSlice
35 for Deque<T, MAX_SIZE>
36{
37 fn new_from_slice(slice: &mut [u8]) -> &mut Self {
38 let deque = Self::load_mut_bytes(slice).unwrap();
39 deque.initialize();
40 deque
41 }
42}
43
44impl<T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> Default
45 for Deque<T, MAX_SIZE>
46{
47 fn default() -> Self {
48 Deque {
49 sequence_number: 0,
50 head: SENTINEL,
51 tail: SENTINEL,
52 allocator: NodeAllocator::<T, MAX_SIZE, 2>::default(),
53 }
54 }
55}
56
57impl<T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> Deque<T, MAX_SIZE> {
58 pub fn new() -> Self {
59 Self::default()
60 }
61
62 pub fn initialize(&mut self) {
63 self.allocator.initialize();
64 }
65
66 pub fn front(&self) -> Option<&T> {
67 if self.head == SENTINEL {
68 return None;
69 }
70 Some(self.get_node(self.head))
71 }
72
73 pub fn back(&self) -> Option<&T> {
74 if self.tail == SENTINEL {
75 return None;
76 }
77 Some(self.allocator.get(self.tail).get_value())
78 }
79
80 pub fn get_next(&self, index: u32) -> u32 {
81 self.allocator.get_register(index, NEXT)
82 }
83
84 pub fn get_prev(&self, index: u32) -> u32 {
85 self.allocator.get_register(index, PREV)
86 }
87
88 #[inline(always)]
89 fn get_node(&self, i: u32) -> &T {
90 self.allocator.get(i).get_value()
91 }
92
93 pub fn push_back(&mut self, node: T) {
94 let index = self.allocator.add_node(node);
95 if self.head == SENTINEL {
96 self.head = index;
97 }
98 if self.tail != SENTINEL {
99 self.allocator.connect(index, self.tail, PREV, NEXT);
100 }
101 self.tail = index;
102 self.sequence_number += 1;
103 }
104
105 pub fn push_front(&mut self, node: T) {
106 let index = self.allocator.add_node(node);
107 if self.tail == SENTINEL {
108 self.tail = index;
109 }
110 if self.head != SENTINEL {
111 self.allocator.connect(index, self.head, NEXT, PREV);
112 }
113 self.head = index;
114 self.sequence_number += 1;
115 }
116
117 pub fn pop_front(&mut self) -> Option<T> {
118 if self.head == SENTINEL {
119 return None;
120 }
121 let head = self.head;
122 self._remove(head)
123 }
124
125 pub fn pop_back(&mut self) -> Option<T> {
126 if self.tail == SENTINEL {
127 return None;
128 }
129 let tail = self.tail;
130 self._remove(tail)
131 }
132
133 fn _remove(&mut self, i: u32) -> Option<T> {
134 let (left, right, value) = {
135 let value = *self.get_node(i);
136 let left = self.get_prev(i);
137 let right = self.get_next(i);
138 (left, right, value)
139 };
140 self.allocator.clear_register(i as u32, PREV);
141 self.allocator.clear_register(i as u32, NEXT);
142 if left != SENTINEL && right != SENTINEL {
143 self.allocator.connect(left, right, NEXT, PREV);
144 }
145 if i == self.head {
146 self.head = right;
147 self.allocator.clear_register(right, PREV);
148 }
149 if i == self.tail {
150 self.tail = left;
151 self.allocator.clear_register(left, NEXT);
152 }
153 self.allocator.remove_node(i as u32);
154 self.sequence_number += 1;
155 Some(value)
156 }
157
158 pub fn len(&self) -> usize {
159 self.allocator.size as usize
160 }
161
162 pub fn is_empty(&self) -> bool {
163 self.len() == 0
164 }
165
166 pub fn iter(&self) -> DequeIterator<'_, T, MAX_SIZE> {
167 DequeIterator::<T, MAX_SIZE> {
168 deque: self,
169 fwd_ptr: self.head,
170 rev_ptr: self.tail,
171 terminated: false,
172 }
173 }
174
175 pub fn iter_mut(&mut self) -> DequeIteratorMut<'_, T, MAX_SIZE> {
176 let head = self.head;
177 let tail = self.tail;
178 DequeIteratorMut::<T, MAX_SIZE> {
179 deque: self,
180 fwd_ptr: head,
181 rev_ptr: tail,
182 terminated: false,
183 }
184 }
185}
186
187pub struct DequeIterator<'a, T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> {
188 deque: &'a Deque<T, MAX_SIZE>,
189 fwd_ptr: u32,
190 rev_ptr: u32,
191 terminated: bool,
192}
193
194impl<'a, T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> Iterator
195 for DequeIterator<'a, T, MAX_SIZE>
196{
197 type Item = (usize, &'a T);
198
199 fn next(&mut self) -> Option<Self::Item> {
200 if self.terminated {
201 return None;
202 }
203 match self.fwd_ptr {
204 SENTINEL => None,
205 _ => {
206 let ptr = self.fwd_ptr;
207 if ptr == self.rev_ptr {
208 self.terminated = true;
209 }
210 self.fwd_ptr = self.deque.get_next(ptr);
211 Some((ptr as usize, self.deque.get_node(ptr)))
212 }
213 }
214 }
215}
216
217impl<'a, T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> DoubleEndedIterator
218 for DequeIterator<'a, T, MAX_SIZE>
219{
220 fn next_back(&mut self) -> Option<Self::Item> {
221 if self.terminated {
222 return None;
223 }
224 match self.rev_ptr {
225 SENTINEL => None,
226 _ => {
227 let ptr = self.rev_ptr;
228 if ptr == self.fwd_ptr {
229 self.terminated = true;
230 }
231 self.rev_ptr = self.deque.get_prev(ptr);
232 Some((ptr as usize, self.deque.get_node(ptr)))
233 }
234 }
235 }
236}
237
238pub struct DequeIteratorMut<'a, T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> {
239 deque: &'a mut Deque<T, MAX_SIZE>,
240 fwd_ptr: u32,
241 rev_ptr: u32,
242 terminated: bool,
243}
244
245impl<'a, T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> Iterator
246 for DequeIteratorMut<'a, T, MAX_SIZE>
247{
248 type Item = (usize, &'a mut T);
249
250 fn next(&mut self) -> Option<Self::Item> {
251 if self.terminated {
252 return None;
253 }
254 match self.fwd_ptr {
255 SENTINEL => None,
256 _ => {
257 let ptr = self.fwd_ptr;
258 if ptr == self.rev_ptr {
259 self.terminated = true;
260 }
261 self.fwd_ptr = self.deque.get_next(ptr);
262 Some((ptr as usize, unsafe {
263 (*self
264 .deque
265 .allocator
266 .nodes
267 .as_mut_ptr()
268 .add((ptr - 1) as usize))
269 .get_value_mut()
270 }))
271 }
272 }
273 }
274}
275
276impl<'a, T: Default + Copy + Clone + Pod + Zeroable, const MAX_SIZE: usize> DoubleEndedIterator
277 for DequeIteratorMut<'a, T, MAX_SIZE>
278{
279 fn next_back(&mut self) -> Option<Self::Item> {
280 if self.terminated {
281 return None;
282 }
283 match self.rev_ptr {
284 SENTINEL => None,
285 _ => {
286 let ptr = self.rev_ptr;
287 if ptr == self.fwd_ptr {
288 self.terminated = true;
289 }
290 self.rev_ptr = self.deque.get_prev(ptr);
291 Some((ptr as usize, unsafe {
292 (*self
293 .deque
294 .allocator
295 .nodes
296 .as_mut_ptr()
297 .add((ptr - 1) as usize))
298 .get_value_mut()
299 }))
300 }
301 }
302 }
303}
304
305#[test]
306fn test_deque() {
308 use rand::thread_rng;
309 use rand::Rng;
310 use std::collections::VecDeque;
311 let mut rng = thread_rng();
312 type Q = Deque<u64, 1024>;
313 let mut buf = vec![0u8; std::mem::size_of::<Q>()];
314 let mut v = VecDeque::new();
315 let q = Q::new_from_slice(buf.as_mut_slice());
316 (0..128).for_each(|_| {
317 let t = rng.gen::<u64>();
318 q.push_back(t);
319 v.push_back(t);
320 });
321 (0..128).for_each(|_| {
322 let t = rng.gen::<u64>();
323 q.push_front(t);
324 v.push_front(t);
325 });
326 for ((_, i), j) in q.iter().zip(v.iter()) {
327 assert_eq!(i, j);
328 }
329 for ((_, i), j) in q.iter().rev().zip(v.iter().rev()) {
330 assert_eq!(i, j);
331 }
332
333 {
334 let mut q_iter = q.iter();
335 let mut v_iter = v.iter();
336 let breakpoint = rng.gen_range(1, 255);
337 for _ in 0..breakpoint {
338 assert_eq!(q_iter.next().map(|x| x.1), v_iter.next());
339 }
340 for _ in breakpoint..256 {
341 assert_eq!(q_iter.next_back().map(|x| x.1), v_iter.next_back());
342 }
343
344 assert!(q_iter.next().is_none());
345 assert!(q_iter.next_back().is_none());
346 assert!(v_iter.next().is_none());
347 assert!(v_iter.next_back().is_none());
348 assert!(q_iter.next().is_none());
350 assert!(q_iter.next_back().is_none());
351 assert!(v_iter.next().is_none());
352 assert!(v_iter.next_back().is_none());
353 }
354
355 {
356 let mut q_iter_mut = q.iter_mut();
357 let mut v_iter_mut = v.iter_mut();
358 let breakpoint = rng.gen_range(1, 255);
359 for _ in 0..breakpoint {
360 assert_eq!(q_iter_mut.next().map(|x| x.1), v_iter_mut.next());
361 }
362 for _ in breakpoint..256 {
363 assert_eq!(q_iter_mut.next_back().map(|x| x.1), v_iter_mut.next_back());
364 }
365
366 assert!(q_iter_mut.next().is_none());
367 assert!(q_iter_mut.next_back().is_none());
368 assert!(v_iter_mut.next().is_none());
369 assert!(v_iter_mut.next_back().is_none());
370 assert!(q_iter_mut.next().is_none());
372 assert!(q_iter_mut.next_back().is_none());
373 assert!(v_iter_mut.next().is_none());
374 assert!(v_iter_mut.next_back().is_none());
375 }
376
377 (0..256).for_each(|_| {
378 assert_eq!(q.pop_back(), v.pop_back());
379 });
380 assert!(q.is_empty() && v.is_empty());
381 (0..128).for_each(|_| {
382 let t = rng.gen::<u64>();
383 q.push_back(t);
384 v.push_back(t);
385 });
386 (0..128).for_each(|_| {
387 let t = rng.gen::<u64>();
388 q.push_front(t);
389 v.push_front(t);
390 });
391 for ((_, i), j) in q.iter().zip(v.iter()) {
392 assert_eq!(i, j);
393 }
394 for ((_, i), j) in q.iter().rev().zip(v.iter().rev()) {
395 assert_eq!(i, j);
396 }
397 (0..256).for_each(|_| {
398 assert_eq!(q.pop_front(), v.pop_front());
399 });
400 assert!(q.is_empty() && v.is_empty());
401}