cl_generic_vec/iter/
splice.rs1use crate::{iter::RawCursor, Storage};
2
3pub 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}