vortex_vector/primitive/
generic_mut.rs1use vortex_buffer::BufferMut;
7use vortex_dtype::NativePType;
8use vortex_error::VortexExpect;
9use vortex_error::VortexResult;
10use vortex_error::vortex_ensure;
11use vortex_mask::MaskMut;
12
13use crate::VectorMutOps;
14use crate::VectorOps;
15use crate::primitive::PScalar;
16use crate::primitive::PVector;
17
18#[derive(Debug, Clone)]
23pub struct PVectorMut<T> {
24 pub(super) elements: BufferMut<T>,
26 pub(super) validity: MaskMut,
28}
29
30impl<T> PVectorMut<T> {
31 pub fn new(elements: BufferMut<T>, validity: MaskMut) -> Self {
37 Self::try_new(elements, validity).vortex_expect("Failed to create `PVectorMut`")
38 }
39
40 pub fn try_new(elements: BufferMut<T>, validity: MaskMut) -> VortexResult<Self> {
47 vortex_ensure!(
48 validity.len() == elements.len(),
49 "`PVectorMut` validity mask must have the same length as elements"
50 );
51
52 Ok(Self { elements, validity })
53 }
54
55 pub unsafe fn new_unchecked(elements: BufferMut<T>, validity: MaskMut) -> Self {
65 if cfg!(debug_assertions) {
66 Self::new(elements, validity)
67 } else {
68 Self { elements, validity }
69 }
70 }
71
72 pub fn with_capacity(capacity: usize) -> Self {
74 Self {
75 elements: BufferMut::with_capacity(capacity),
76 validity: MaskMut::with_capacity(capacity),
77 }
78 }
79
80 pub unsafe fn set_len(&mut self, new_len: usize) {
89 debug_assert!(new_len < self.elements.capacity());
90 debug_assert!(new_len < self.validity.capacity());
91 unsafe { self.elements.set_len(new_len) };
92 unsafe { self.validity.set_len(new_len) };
93 }
94
95 pub unsafe fn elements_mut(&mut self) -> &mut BufferMut<T> {
102 &mut self.elements
103 }
104
105 pub unsafe fn validity_mut(&mut self) -> &mut MaskMut {
112 &mut self.validity
113 }
114
115 pub fn into_parts(self) -> (BufferMut<T>, MaskMut) {
117 (self.elements, self.validity)
118 }
119
120 pub fn append_values(&mut self, value: T, n: usize)
122 where
123 T: Copy,
124 {
125 self.elements.push_n(value, n);
126 self.validity.append_n(true, n);
127 }
128
129 pub unsafe fn transmute<U: NativePType>(self) -> PVectorMut<U> {
140 let (buffer, mask) = self.into_parts();
141
142 let buffer = unsafe { buffer.transmute::<U>() };
144
145 PVectorMut::new(buffer, mask)
146 }
147}
148
149impl<T: NativePType> VectorMutOps for PVectorMut<T> {
150 type Immutable = PVector<T>;
151
152 fn len(&self) -> usize {
153 self.elements.len()
154 }
155
156 fn validity(&self) -> &MaskMut {
157 &self.validity
158 }
159
160 fn capacity(&self) -> usize {
161 self.elements.capacity()
162 }
163
164 fn reserve(&mut self, additional: usize) {
165 self.elements.reserve(additional);
166 self.validity.reserve(additional);
167 }
168
169 fn clear(&mut self) {
170 self.elements.clear();
171 self.validity.clear();
172 }
173
174 fn truncate(&mut self, len: usize) {
175 self.elements.truncate(len);
176 self.validity.truncate(len);
177 }
178
179 fn extend_from_vector(&mut self, other: &PVector<T>) {
181 self.elements.extend_from_slice(other.elements.as_slice());
182 self.validity.append_mask(other.validity());
183 }
184
185 fn append_nulls(&mut self, n: usize) {
186 self.elements.push_n(T::zero(), n); self.validity.append_n(false, n);
188 }
189
190 fn append_zeros(&mut self, n: usize) {
191 self.elements.push_n(T::zero(), n);
192 self.validity.append_n(true, n);
193 }
194
195 fn append_scalars(&mut self, scalar: &PScalar<T>, n: usize) {
196 match scalar.value() {
197 None => {
198 self.append_nulls(n);
199 }
200 Some(v) => {
201 self.append_values(v, n);
202 }
203 }
204 }
205
206 fn freeze(self) -> PVector<T> {
208 PVector {
209 elements: self.elements.freeze(),
210 validity: self.validity.freeze(),
211 }
212 }
213
214 fn split_off(&mut self, at: usize) -> Self {
215 Self {
216 elements: self.elements.split_off(at),
217 validity: self.validity.split_off(at),
218 }
219 }
220
221 fn unsplit(&mut self, other: Self) {
222 if self.is_empty() {
223 *self = other;
224 return;
225 }
226 self.elements.unsplit(other.elements);
227 self.validity.unsplit(other.validity);
228 }
229}