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