orx_split_vec/common_traits/iterator/
into_iter.rs

1use crate::{Fragment, Growth, SplitVec};
2use alloc::vec::Vec;
3use core::iter::FusedIterator;
4
5impl<T, G: Growth> IntoIterator for SplitVec<T, G> {
6    type Item = T;
7    type IntoIter = IntoIter<T>;
8
9    fn into_iter(self) -> Self::IntoIter {
10        Self::IntoIter::new(self.fragments)
11    }
12}
13
14/// An iterator that moves out of a vector.
15///
16/// This struct is created by the `into_iter` method on `SplitVec` (provided by the `IntoIterator` trait).
17pub struct IntoIter<T> {
18    outer: alloc::vec::IntoIter<Fragment<T>>,
19    inner: alloc::vec::IntoIter<T>,
20}
21
22impl<T> IntoIter<T> {
23    pub(crate) fn new(fragments: Vec<Fragment<T>>) -> Self {
24        let mut outer = fragments.into_iter();
25        let inner = outer
26            .next()
27            .map(|f| f.data.into_iter())
28            .unwrap_or(Vec::new().into_iter());
29
30        Self { outer, inner }
31    }
32
33    fn next_fragment(&mut self) -> Option<T> {
34        match self.outer.next() {
35            Some(f) => {
36                self.inner = f.data.into_iter();
37                self.next()
38            }
39            None => None,
40        }
41    }
42}
43
44impl<T: Clone> Clone for IntoIter<T> {
45    fn clone(&self) -> Self {
46        Self {
47            outer: self.outer.clone(),
48            inner: self.inner.clone(),
49        }
50    }
51}
52
53impl<T> Iterator for IntoIter<T> {
54    type Item = T;
55
56    #[inline(always)]
57    fn next(&mut self) -> Option<Self::Item> {
58        let next_element = self.inner.next();
59        if next_element.is_some() {
60            next_element
61        } else {
62            self.next_fragment()
63        }
64    }
65}
66
67impl<T> FusedIterator for IntoIter<T> {}