cl_generic_vec/iter/
splice.rs

1use crate::{iter::RawCursor, Storage};
2
3/// This struct is created by [`GenericVec::splice`](crate::GenericVec::splice).
4/// See its documentation for more.
5pub struct Splice<'a, S, I>
6where
7    S: ?Sized + Storage,
8    I: Iterator<Item = S::Item>,
9{
10    raw: RawCursor<'a, S>,
11    replace_with: I,
12}
13
14impl<'a, S: ?Sized + Storage, I: Iterator<Item = S::Item>> Splice<'a, S, I> {
15    pub(crate) fn new(raw: RawCursor<'a, S>, replace_with: I) -> Self { Self { raw, replace_with } }
16}
17
18impl<S: ?Sized + Storage, I: Iterator<Item = S::Item>> Drop for Splice<'_, S, I> {
19    fn drop(&mut self) {
20        unsafe {
21            self.raw.drop_n_front(self.raw.len());
22        }
23
24        let Self { raw, replace_with } = self;
25
26        if raw.at_back_of_vec() {
27            self.raw.finish();
28            unsafe { self.raw.vec_mut().extend(replace_with) }
29            return
30        }
31
32        while !raw.is_write_empty() {
33            match replace_with.next() {
34                Some(value) => unsafe { raw.write_front(value) },
35                None => return,
36            }
37        }
38
39        #[cfg(not(feature = "alloc"))]
40        {
41            const CAPACITY: usize = 16;
42
43            let mut buffer = crate::uninit_array::<_, CAPACITY>();
44            let mut buffer = crate::SliceVec::new(&mut buffer);
45
46            replace_with.for_each(|item| unsafe {
47                buffer.push_unchecked(item);
48
49                if buffer.is_full() {
50                    unsafe {
51                        raw.reserve(buffer.len());
52                        raw.write_slice_front(&buffer);
53                        buffer.set_len_unchecked(0);
54                    }
55                }
56            });
57
58            unsafe {
59                raw.reserve(buffer.len());
60                raw.write_slice_front(&buffer);
61                core::mem::forget(buffer);
62            }
63        }
64
65        #[cfg(feature = "alloc")]
66        {
67            let mut temp: std::vec::Vec<S::Item> = replace_with.collect();
68
69            unsafe {
70                raw.reserve(temp.len());
71                raw.write_slice_front(&temp);
72                temp.set_len(0);
73            }
74        }
75    }
76}
77
78impl<S: ?Sized + Storage, I: Iterator<Item = S::Item>> ExactSizeIterator for Splice<'_, S, I> {}
79
80impl<'a, S: ?Sized + Storage, I: Iterator<Item = S::Item>> Iterator for Splice<'a, S, I> {
81    type Item = I::Item;
82
83    fn next(&mut self) -> Option<Self::Item> {
84        if self.raw.is_empty() {
85            None
86        } else {
87            Some(unsafe { self.raw.take_front() })
88        }
89    }
90
91    fn size_hint(&self) -> (usize, Option<usize>) {
92        let size = self.raw.len();
93        (size, Some(size))
94    }
95}
96
97impl<'a, S: ?Sized + Storage, I: Iterator<Item = S::Item>> DoubleEndedIterator for Splice<'a, S, I> {
98    fn next_back(&mut self) -> Option<Self::Item> {
99        if self.raw.is_empty() {
100            None
101        } else {
102            Some(unsafe { self.raw.take_back() })
103        }
104    }
105}