vec_collections/
iterators.rs

1/// An interator that is guaranteed to be sorted by item
2pub struct VecSetIter<I> {
3    i: I,
4}
5
6impl<I> sorted_iter::sorted_iterator::SortedByItem for VecSetIter<I> {}
7
8impl<I: Iterator> VecSetIter<I> {
9    pub(crate) fn new(i: I) -> Self {
10        Self { i }
11    }
12}
13
14impl<I: Iterator> Iterator for VecSetIter<I> {
15    type Item = I::Item;
16
17    fn next(&mut self) -> Option<Self::Item> {
18        self.i.next()
19    }
20
21    fn size_hint(&self) -> (usize, Option<usize>) {
22        self.i.size_hint()
23    }
24}
25
26/// An interator that is guaranteed to be sorted by key
27pub struct VecMapIter<I> {
28    i: I,
29}
30
31impl<I> sorted_iter::sorted_pair_iterator::SortedByKey for VecMapIter<I> {}
32
33impl<I: Iterator> VecMapIter<I> {
34    pub(crate) fn new(i: I) -> Self {
35        Self { i }
36    }
37}
38
39impl<I: Iterator> Iterator for VecMapIter<I> {
40    type Item = I::Item;
41
42    fn next(&mut self) -> Option<Self::Item> {
43        self.i.next()
44    }
45
46    fn size_hint(&self) -> (usize, Option<usize>) {
47        self.i.size_hint()
48    }
49}
50
51pub(crate) struct SliceIterator<'a, T>(pub &'a [T]);
52
53impl<'a, T> Iterator for SliceIterator<'a, T> {
54    type Item = &'a T;
55
56    fn next(&mut self) -> Option<Self::Item> {
57        if self.0.is_empty() {
58            None
59        } else {
60            let res: Self::Item = &self.0[0];
61            self.0 = &self.0[1..];
62            Some(res)
63        }
64    }
65}
66
67impl<'a, T> SliceIterator<'a, T> {
68    pub fn as_slice(&self) -> &[T] {
69        self.0
70    }
71
72    pub(crate) fn drop_front(&mut self, n: usize) {
73        self.0 = &self.0[n..];
74    }
75
76    pub(crate) fn take_front(&mut self, n: usize) -> &'a [T] {
77        let res = &self.0[..n];
78        self.0 = &self.0[n..];
79        res
80    }
81}