polars_arrow/legacy/trusted_len/
push_unchecked.rs

1use crate::trusted_len::TrustedLen;
2
3pub trait TrustedLenPush<T> {
4    /// Will push an item and not check if there is enough capacity.
5    ///
6    /// # Safety
7    /// Caller must ensure the array has enough capacity to hold `T`.
8    unsafe fn push_unchecked(&mut self, value: T);
9
10    /// Extend the array with an iterator who's length can be trusted.
11    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    /// # Safety
19    /// Caller must ensure the iterators reported length is correct.
20    unsafe fn extend_trusted_len_unchecked<I: IntoIterator<Item = T>>(&mut self, iter: I);
21
22    /// # Safety
23    /// Caller must ensure the iterators reported length is correct.
24    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    /// # Safety
38    /// Caller must ensure the iterators reported length is correct.
39    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    /// # Safety
54    /// Caller must ensure the iterators reported length is correct.
55    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}