fixed_slice_deque/
drain_filter.rs

1use crate::FixedSliceDeque;
2
3/// An iterator that filters elements and removes them from the deque.
4pub struct DrainFilter<'a, T, F>
5where
6    F: FnMut(&mut T) -> bool,
7{
8    pub(crate) deque: &'a mut FixedSliceDeque<T>,
9    pub(crate) filter: F,
10    pub(crate) old_len: usize,
11    pub(crate) idx: usize,
12    pub(crate) del: usize,
13}
14
15impl<'a, T, F> Iterator for DrainFilter<'a, T, F>
16where
17    F: FnMut(&mut T) -> bool,
18{
19    type Item = T;
20
21    fn next(&mut self) -> Option<T> {
22        while self.idx < self.old_len {
23            let i = self.idx;
24            self.idx += 1;
25            let current_idx = i - self.del;
26            if (self.filter)(&mut self.deque.buffer[current_idx]) {
27                self.del += 1;
28                return self.deque.buffer.remove(current_idx);
29            }
30        }
31        None
32    }
33
34    fn size_hint(&self) -> (usize, Option<usize>) {
35        (0, Some(self.old_len - self.idx))
36    }
37}
38
39impl<'a, T, F> Drop for DrainFilter<'a, T, F>
40where
41    F: FnMut(&mut T) -> bool,
42{
43    fn drop(&mut self) {
44        while self.next().is_some() {}
45    }
46}