orx_split_vec/common_traits/iterator/
into_iter.rs1use 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
14pub 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> {}