squeue/
drain.rs

1// Copyright (C) 2024 Christian Mauduit <ufoot@ufoot.org>
2
3use crate::queue::Queue;
4use std::collections::VecDeque;
5use std::iter::FusedIterator;
6
7/// Iterator which drains a FIFO queue.
8///
9/// Use this when you want to get all the items, at a given point,
10/// and free space in the queue.
11///
12/// ```
13/// use squeue::Queue;
14///
15/// let mut queue = Queue::new(10);
16/// queue.push(1);
17/// queue.push(10);
18/// let drain = queue.drain();
19/// assert_eq!(0, queue.len());
20/// for i in drain {
21///     println!("{}", i);
22/// }
23/// ```
24#[derive(Debug, Clone)]
25pub struct Drain<T> {
26    queue: VecDeque<T>,
27}
28
29impl<T> Drain<T> {
30    /// Create a drain from a FIFO queue.
31    ///
32    /// Use this when you want to get all the items, at a given point,
33    /// and free space in the queue.
34    ///
35    /// ```
36    /// use squeue::{Queue, Drain};
37    ///
38    /// let mut queue = Queue::new(10);
39    /// queue.push(1);
40    /// queue.push(10);
41    /// let drain = Drain::new(&mut queue);
42    /// assert_eq!(0, queue.len());
43    /// for i in drain {
44    ///     println!("{}", i);
45    /// }
46    /// ```
47    pub fn new(old_queue: &mut Queue<T>) -> Self {
48        let mut new_queue = VecDeque::with_capacity(old_queue.len());
49        loop {
50            match old_queue.pop() {
51                Some(v) => new_queue.push_back(v),
52                None => break,
53            }
54        }
55        Drain { queue: new_queue }
56    }
57}
58
59impl<T> Drain<T> {
60    pub fn len(&self) -> usize {
61        self.queue.len()
62    }
63}
64
65impl<T> Iterator for Drain<T> {
66    type Item = T;
67
68    fn next(&mut self) -> Option<T> {
69        self.queue.pop_front()
70    }
71
72    fn size_hint(&self) -> (usize, Option<usize>) {
73        let len = self.queue.len();
74        (len, Some(len))
75    }
76}
77
78impl<T> ExactSizeIterator for Drain<T> {}
79impl<T> FusedIterator for Drain<T> {}
80
81#[cfg(test)]
82mod tests {
83    use super::*;
84
85    #[test]
86    fn test_drain() {
87        let mut queue: Queue<usize> = Queue::new(10);
88        assert_eq!(None, queue.push(4));
89        assert_eq!(None, queue.push(42));
90        assert_eq!(None, queue.push(421));
91        let mut drain = queue.drain();
92        assert_eq!(0, queue.len());
93        assert_eq!(None, queue.push(7));
94        assert_eq!(Some(4), drain.next());
95        assert_eq!(Some(42), drain.next());
96        assert_eq!(Some(421), drain.next());
97        assert_eq!(None, drain.next());
98        assert_eq!(Some(7), queue.pop());
99        assert_eq!(None, queue.pop());
100    }
101}