ytls_util/
static_queue.rs1pub struct StaticQueue<T, const S: usize> {
4 pub q: [Option<T>; S],
5}
6
7impl<T, const S: usize> StaticQueue<T, S> {
8 #[inline]
10 pub fn push(&mut self, item: T) -> bool {
11 match self.q.iter().position(|i| i.is_none()) {
12 Some(i) => self.q[i] = Some(item),
13 None => return false,
14 }
15 true
16 }
17 #[inline]
19 pub fn pop(&mut self) -> Option<T> {
20 let i = match self.q.iter().position(|i| i.is_some()) {
21 Some(i) => i,
22 None => return None,
23 };
24 let mut r = None;
25 core::mem::swap(&mut r, &mut self.q[i]);
26 r
27 }
28}
29
30#[cfg(test)]
31mod test {
32
33 use super::*;
34
35 #[test]
36 fn static_queue_play() {
37 let mut q = StaticQueue::<&[u8], 8> { q: [None; 8] };
38
39 assert_eq!(q.pop(), None);
40 assert_eq!(q.push(&[1, 2]), true);
41 assert_eq!(q.push(&[3, 4]), true);
42 assert_eq!(q.push(&[5, 6]), true);
43 assert_eq!(q.push(&[7, 8]), true);
44 assert_eq!(q.push(&[9, 10]), true);
45 assert_eq!(q.push(&[11, 12]), true);
46 assert_eq!(q.push(&[13, 14]), true);
47 assert_eq!(q.push(&[15, 16]), true);
48 assert_eq!(q.push(&[42, 42]), false);
49 assert_eq!(q.pop(), Some([1_u8, 2_u8].as_ref()));
50 assert_eq!(q.pop(), Some([3_u8, 4_u8].as_ref()));
51 assert_eq!(q.pop(), Some([5_u8, 6_u8].as_ref()));
52 assert_eq!(q.pop(), Some([7_u8, 8_u8].as_ref()));
53 assert_eq!(q.pop(), Some([9_u8, 10_u8].as_ref()));
54 assert_eq!(q.pop(), Some([11_u8, 12_u8].as_ref()));
55 assert_eq!(q.pop(), Some([13_u8, 14_u8].as_ref()));
56 assert_eq!(q.pop(), Some([15_u8, 16_u8].as_ref()));
57 assert_eq!(q.pop(), None);
58 assert_eq!(q.push(&[69, 69]), true);
59 assert_eq!(q.pop(), Some([69u8, 69u8].as_ref()));
60 assert_eq!(q.pop(), None);
61 }
62}