Path: blob/main/crates/polars-arrow/src/legacy/trusted_len/push_unchecked.rs
6939 views
#![allow(unsafe_op_in_unsafe_fn)]1use crate::trusted_len::TrustedLen;23pub trait TrustedLenPush<T> {4/// Will push an item and not check if there is enough capacity.5///6/// # Safety7/// Caller must ensure the array has enough capacity to hold `T`.8unsafe fn push_unchecked(&mut self, value: T);910/// Extend the array with an iterator who's length can be trusted.11fn extend_trusted_len<I: IntoIterator<Item = T, IntoIter = J>, J: TrustedLen>(12&mut self,13iter: I,14) {15unsafe { self.extend_trusted_len_unchecked(iter) }16}1718/// # Safety19/// Caller must ensure the iterators reported length is correct.20unsafe fn extend_trusted_len_unchecked<I: IntoIterator<Item = T>>(&mut self, iter: I);2122/// # Safety23/// Caller must ensure the iterators reported length is correct.24unsafe fn try_extend_trusted_len_unchecked<E, I: IntoIterator<Item = Result<T, E>>>(25&mut self,26iter: I,27) -> Result<(), E>;2829fn from_trusted_len_iter<I: IntoIterator<Item = T, IntoIter = J>, J: TrustedLen>(30iter: I,31) -> Self32where33Self: Sized,34{35unsafe { Self::from_trusted_len_iter_unchecked(iter) }36}37/// # Safety38/// Caller must ensure the iterators reported length is correct.39unsafe fn from_trusted_len_iter_unchecked<I: IntoIterator<Item = T>>(iter: I) -> Self;4041fn try_from_trusted_len_iter<42E,43I: IntoIterator<Item = Result<T, E>, IntoIter = J>,44J: TrustedLen,45>(46iter: I,47) -> Result<Self, E>48where49Self: Sized,50{51unsafe { Self::try_from_trusted_len_iter_unchecked(iter) }52}53/// # Safety54/// Caller must ensure the iterators reported length is correct.55unsafe fn try_from_trusted_len_iter_unchecked<E, I: IntoIterator<Item = Result<T, E>>>(56iter: I,57) -> Result<Self, E>58where59Self: Sized;60}6162impl<T> TrustedLenPush<T> for Vec<T> {63#[inline(always)]64unsafe fn push_unchecked(&mut self, value: T) {65debug_assert!(self.capacity() > self.len());66let end = self.as_mut_ptr().add(self.len());67std::ptr::write(end, value);68self.set_len(self.len() + 1);69}7071#[inline]72unsafe fn extend_trusted_len_unchecked<I: IntoIterator<Item = T>>(&mut self, iter: I) {73let iter = iter.into_iter();74let upper = iter.size_hint().1.expect("must have an upper bound");75self.reserve(upper);7677let mut dst = self.as_mut_ptr().add(self.len());78for value in iter {79std::ptr::write(dst, value);80dst = dst.add(1)81}82self.set_len(self.len() + upper)83}8485unsafe fn try_extend_trusted_len_unchecked<E, I: IntoIterator<Item = Result<T, E>>>(86&mut self,87iter: I,88) -> Result<(), E> {89let iter = iter.into_iter();90let upper = iter.size_hint().1.expect("must have an upper bound");91self.reserve(upper);9293let mut dst = self.as_mut_ptr().add(self.len());94for value in iter {95std::ptr::write(dst, value?);96dst = dst.add(1)97}98self.set_len(self.len() + upper);99Ok(())100}101102#[inline]103unsafe fn from_trusted_len_iter_unchecked<I: IntoIterator<Item = T>>(iter: I) -> Self {104let mut v = vec![];105v.extend_trusted_len_unchecked(iter);106v107}108109unsafe fn try_from_trusted_len_iter_unchecked<E, I: IntoIterator<Item = Result<T, E>>>(110iter: I,111) -> Result<Self, E>112where113Self: Sized,114{115let mut v = vec![];116v.try_extend_trusted_len_unchecked(iter)?;117Ok(v)118}119}120121122