polars_arrow/legacy/trusted_len/
push_unchecked.rs1use crate::trusted_len::TrustedLen;
2
3pub trait TrustedLenPush<T> {
4 unsafe fn push_unchecked(&mut self, value: T);
9
10 fn extend_trusted_len<I: IntoIterator<Item = T, IntoIter = J>, J: TrustedLen>(
12 &mut self,
13 iter: I,
14 ) {
15 unsafe { self.extend_trusted_len_unchecked(iter) }
16 }
17
18 unsafe fn extend_trusted_len_unchecked<I: IntoIterator<Item = T>>(&mut self, iter: I);
21
22 unsafe fn try_extend_trusted_len_unchecked<E, I: IntoIterator<Item = Result<T, E>>>(
25 &mut self,
26 iter: I,
27 ) -> Result<(), E>;
28
29 fn from_trusted_len_iter<I: IntoIterator<Item = T, IntoIter = J>, J: TrustedLen>(
30 iter: I,
31 ) -> Self
32 where
33 Self: Sized,
34 {
35 unsafe { Self::from_trusted_len_iter_unchecked(iter) }
36 }
37 unsafe fn from_trusted_len_iter_unchecked<I: IntoIterator<Item = T>>(iter: I) -> Self;
40
41 fn try_from_trusted_len_iter<
42 E,
43 I: IntoIterator<Item = Result<T, E>, IntoIter = J>,
44 J: TrustedLen,
45 >(
46 iter: I,
47 ) -> Result<Self, E>
48 where
49 Self: Sized,
50 {
51 unsafe { Self::try_from_trusted_len_iter_unchecked(iter) }
52 }
53 unsafe fn try_from_trusted_len_iter_unchecked<E, I: IntoIterator<Item = Result<T, E>>>(
56 iter: I,
57 ) -> Result<Self, E>
58 where
59 Self: Sized;
60}
61
62impl<T> TrustedLenPush<T> for Vec<T> {
63 #[inline(always)]
64 unsafe fn push_unchecked(&mut self, value: T) {
65 debug_assert!(self.capacity() > self.len());
66 let end = self.as_mut_ptr().add(self.len());
67 std::ptr::write(end, value);
68 self.set_len(self.len() + 1);
69 }
70
71 #[inline]
72 unsafe fn extend_trusted_len_unchecked<I: IntoIterator<Item = T>>(&mut self, iter: I) {
73 let iter = iter.into_iter();
74 let upper = iter.size_hint().1.expect("must have an upper bound");
75 self.reserve(upper);
76
77 let mut dst = self.as_mut_ptr().add(self.len());
78 for value in iter {
79 std::ptr::write(dst, value);
80 dst = dst.add(1)
81 }
82 self.set_len(self.len() + upper)
83 }
84
85 unsafe fn try_extend_trusted_len_unchecked<E, I: IntoIterator<Item = Result<T, E>>>(
86 &mut self,
87 iter: I,
88 ) -> Result<(), E> {
89 let iter = iter.into_iter();
90 let upper = iter.size_hint().1.expect("must have an upper bound");
91 self.reserve(upper);
92
93 let mut dst = self.as_mut_ptr().add(self.len());
94 for value in iter {
95 std::ptr::write(dst, value?);
96 dst = dst.add(1)
97 }
98 self.set_len(self.len() + upper);
99 Ok(())
100 }
101
102 #[inline]
103 unsafe fn from_trusted_len_iter_unchecked<I: IntoIterator<Item = T>>(iter: I) -> Self {
104 let mut v = vec![];
105 v.extend_trusted_len_unchecked(iter);
106 v
107 }
108
109 unsafe fn try_from_trusted_len_iter_unchecked<E, I: IntoIterator<Item = Result<T, E>>>(
110 iter: I,
111 ) -> Result<Self, E>
112 where
113 Self: Sized,
114 {
115 let mut v = vec![];
116 v.try_extend_trusted_len_unchecked(iter)?;
117 Ok(v)
118 }
119}