1use crate::queue::Queue;
4use std::collections::VecDeque;
5use std::iter::FusedIterator;
6
7#[derive(Debug, Clone)]
25pub struct Drain<T> {
26 queue: VecDeque<T>,
27}
28
29impl<T> Drain<T> {
30 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}