ytls_util/
static_queue.rs

1/// Statically defined fixed size "queue" of T
2/// bounded by queue max size S
3pub struct StaticQueue<T, const S: usize> {
4    pub q: [Option<T>; S],
5}
6
7impl<T, const S: usize> StaticQueue<T, S> {
8    /// Push T to queue returning true if added or false if beyond capacity
9    #[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    /// Pop an item from quuee
18    #[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}