orx_split_vec/common_traits/iterator/
iter_rev.rs

1use crate::fragment::fragment_struct::Fragment;
2use core::iter::{FusedIterator, Rev};
3
4/// Iterator over the `SplitVec`.
5///
6/// This struct is created by `SplitVec::iter_rev()` method.
7#[derive(Debug)]
8#[must_use = "iterators are lazy and do nothing unless consumed"]
9pub struct IterRev<'a, T> {
10    iter_outer: Rev<core::slice::Iter<'a, Fragment<T>>>,
11    iter_inner: Rev<core::slice::Iter<'a, T>>,
12}
13
14impl<'a, T> IterRev<'a, T> {
15    pub(crate) fn new(fragments: &'a [Fragment<T>]) -> Self {
16        let mut iter_outer = fragments.iter().rev();
17        let iter_inner = iter_outer
18            .next()
19            .map(|x| x.iter().rev())
20            .unwrap_or([].iter().rev());
21        Self {
22            iter_outer,
23            iter_inner,
24        }
25    }
26
27    fn next_fragment(&mut self) -> Option<&'a T> {
28        match self.iter_outer.next() {
29            Some(f) => {
30                self.iter_inner = f.iter().rev();
31                self.next()
32            }
33            None => None,
34        }
35    }
36}
37
38impl<T> Clone for IterRev<'_, T> {
39    fn clone(&self) -> Self {
40        Self {
41            iter_outer: self.iter_outer.clone(),
42            iter_inner: self.iter_inner.clone(),
43        }
44    }
45}
46
47impl<'a, T> Iterator for IterRev<'a, T> {
48    type Item = &'a T;
49
50    #[inline(always)]
51    fn next(&mut self) -> Option<Self::Item> {
52        let next_element = self.iter_inner.next();
53        if next_element.is_some() {
54            next_element
55        } else {
56            self.next_fragment()
57        }
58    }
59}
60
61impl<T> FusedIterator for IterRev<'_, T> {}