orx_split_vec/common_traits/iterator/
iter_rev.rs1use crate::fragment::fragment_struct::Fragment;
2use core::iter::{FusedIterator, Rev};
3
4#[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> {}