fixed_slice_deque/
drain_filter.rs1use crate::FixedSliceDeque;
2
3pub 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}