Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-arrow/src/legacy/trusted_len/push_unchecked.rs
6939 views
1
#![allow(unsafe_op_in_unsafe_fn)]
2
use crate::trusted_len::TrustedLen;
3
4
pub 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
63
impl<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
}
121
122