vortex_vector/primitive/
generic_mut.rs1use vortex_buffer::BufferMut;
7use vortex_dtype::NativePType;
8use vortex_error::{VortexExpect, VortexResult, vortex_ensure};
9use vortex_mask::MaskMut;
10
11use crate::primitive::PVector;
12use crate::{VectorMutOps, VectorOps};
13
14#[derive(Debug, Clone)]
19pub struct PVectorMut<T> {
20 pub(super) elements: BufferMut<T>,
22 pub(super) validity: MaskMut,
24}
25
26impl<T> PVectorMut<T> {
27 pub fn new(elements: BufferMut<T>, validity: MaskMut) -> Self {
33 Self::try_new(elements, validity).vortex_expect("Failed to create `PVectorMut`")
34 }
35
36 pub fn try_new(elements: BufferMut<T>, validity: MaskMut) -> VortexResult<Self> {
43 vortex_ensure!(
44 validity.len() == elements.len(),
45 "`PVectorMut` validity mask must have the same length as elements"
46 );
47
48 Ok(Self { elements, validity })
49 }
50
51 pub unsafe fn new_unchecked(elements: BufferMut<T>, validity: MaskMut) -> Self {
61 if cfg!(debug_assertions) {
62 Self::new(elements, validity)
63 } else {
64 Self { elements, validity }
65 }
66 }
67
68 pub fn with_capacity(capacity: usize) -> Self {
70 Self {
71 elements: BufferMut::with_capacity(capacity),
72 validity: MaskMut::with_capacity(capacity),
73 }
74 }
75
76 pub unsafe fn set_len(&mut self, new_len: usize) {
85 debug_assert!(new_len < self.elements.capacity());
86 debug_assert!(new_len < self.validity.capacity());
87 unsafe { self.elements.set_len(new_len) };
88 unsafe { self.validity.set_len(new_len) };
89 }
90
91 pub unsafe fn elements_mut(&mut self) -> &mut BufferMut<T> {
98 &mut self.elements
99 }
100
101 pub unsafe fn validity_mut(&mut self) -> &mut MaskMut {
108 &mut self.validity
109 }
110
111 pub fn into_parts(self) -> (BufferMut<T>, MaskMut) {
113 (self.elements, self.validity)
114 }
115
116 pub fn append_values(&mut self, value: T, n: usize)
118 where
119 T: Copy,
120 {
121 self.elements.push_n(value, n);
122 self.validity.append_n(true, n);
123 }
124}
125
126impl<T: NativePType> VectorMutOps for PVectorMut<T> {
127 type Immutable = PVector<T>;
128
129 fn len(&self) -> usize {
130 self.elements.len()
131 }
132
133 fn validity(&self) -> &MaskMut {
134 &self.validity
135 }
136
137 fn capacity(&self) -> usize {
138 self.elements.capacity()
139 }
140
141 fn reserve(&mut self, additional: usize) {
142 self.elements.reserve(additional);
143 self.validity.reserve(additional);
144 }
145
146 fn clear(&mut self) {
147 self.elements.clear();
148 self.validity.clear();
149 }
150
151 fn truncate(&mut self, len: usize) {
152 self.elements.truncate(len);
153 self.validity.truncate(len);
154 }
155
156 fn extend_from_vector(&mut self, other: &PVector<T>) {
158 self.elements.extend_from_slice(other.elements.as_slice());
159 self.validity.append_mask(other.validity());
160 }
161
162 fn append_nulls(&mut self, n: usize) {
163 self.elements.push_n(T::zero(), n); self.validity.append_n(false, n);
165 }
166
167 fn freeze(self) -> PVector<T> {
169 PVector {
170 elements: self.elements.freeze(),
171 validity: self.validity.freeze(),
172 }
173 }
174
175 fn split_off(&mut self, at: usize) -> Self {
176 Self {
177 elements: self.elements.split_off(at),
178 validity: self.validity.split_off(at),
179 }
180 }
181
182 fn unsplit(&mut self, other: Self) {
183 if self.is_empty() {
184 *self = other;
185 return;
186 }
187 self.elements.unsplit(other.elements);
188 self.validity.unsplit(other.validity);
189 }
190}