polars_arrow/legacy/trusted_len/
push_unchecked.rs

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