vortex_vector/primitive/iter.rs
1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4//! Iterator implementations for [`PVectorMut`].
5
6use vortex_dtype::NativePType;
7
8use crate::VectorMutOps;
9use crate::primitive::PVector;
10use crate::primitive::PVectorMut;
11use crate::primitive::PrimitiveVector;
12
13impl<T: NativePType> Extend<Option<T>> for PVectorMut<T> {
14 /// Extends the vector from an iterator of optional values.
15 ///
16 /// `None` values will be marked as null in the validity mask.
17 ///
18 /// # Examples
19 ///
20 /// ```
21 /// use vortex_vector::primitive::PVectorMut;
22 /// use vortex_vector::{VectorMutOps, VectorOps};
23 ///
24 /// let mut vec = PVectorMut::from_iter([Some(1i32), None]);
25 /// vec.extend([Some(3), None, Some(5)]);
26 /// assert_eq!(vec.len(), 5);
27 ///
28 /// let frozen = vec.freeze();
29 /// assert_eq!(frozen.validity().true_count(), 3); // Only 3 non-null values.
30 /// ```
31 fn extend<I: IntoIterator<Item = Option<T>>>(&mut self, iter: I) {
32 let iter = iter.into_iter();
33 // Since we do not know the length of the iterator, we can only guess how much memory we
34 // need to reserve. Note that these hints may be inaccurate.
35 let (lower_bound, _) = iter.size_hint();
36
37 // We choose not to use the optional upper bound size hint to match the standard library.
38
39 self.reserve(lower_bound);
40
41 // We have to update validity per-element since it depends on Option variant.
42 for opt_val in iter {
43 match opt_val {
44 Some(val) => {
45 self.elements.push(val);
46 self.validity.append_n(true, 1);
47 }
48 None => {
49 self.elements.push(T::default());
50 self.validity.append_n(false, 1);
51 }
52 }
53 }
54 }
55}
56
57impl<T: NativePType> FromIterator<Option<T>> for PVectorMut<T> {
58 /// Creates a new [`PVectorMut<T>`] from an iterator of `Option<T>` values.
59 ///
60 /// `None` values will be marked as invalid in the validity mask.
61 ///
62 /// Internally, this uses the [`Extend<Option<T>>`] trait implementation.
63 fn from_iter<I>(iter: I) -> Self
64 where
65 I: IntoIterator<Item = Option<T>>,
66 {
67 let iter = iter.into_iter();
68
69 let mut vec = Self::with_capacity(iter.size_hint().0);
70 vec.extend(iter);
71
72 vec
73 }
74}
75
76impl<T: NativePType> Extend<T> for PVectorMut<T> {
77 /// Extends the vector from an iterator of values.
78 ///
79 /// All values from the iterator will be marked as non-null in the validity mask.
80 ///
81 /// Internally, this uses the [`Extend<T>`] trait implementation.
82 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
83 let start_len = self.len();
84
85 // Allow the `BufferMut` implementation to handle extending efficiently.
86 self.elements.extend(iter);
87 self.validity.append_n(true, self.len() - start_len);
88 }
89}
90
91impl<T: NativePType> FromIterator<T> for PVectorMut<T> {
92 /// Creates a new [`PVectorMut<T>`] from an iterator of `T` values.
93 ///
94 /// All values will be treated as non-null.
95 ///
96 /// # Examples
97 ///
98 /// ```
99 /// use vortex_vector::primitive::PVectorMut;
100 /// use vortex_vector::VectorMutOps;
101 ///
102 /// let mut vec = PVectorMut::from_iter([1i32, 2, 3, 4]);
103 /// assert_eq!(vec.len(), 4);
104 /// ```
105 fn from_iter<I>(iter: I) -> Self
106 where
107 I: IntoIterator<Item = T>,
108 {
109 let iter = iter.into_iter();
110
111 let mut vec = Self::with_capacity(iter.size_hint().0);
112 vec.extend(iter);
113
114 vec
115 }
116}
117
118impl<T: NativePType> FromIterator<T> for PVector<T> {
119 /// Creates a new [`PVector<T>`] from an iterator of `T` values.
120 fn from_iter<I>(iter: I) -> Self
121 where
122 I: IntoIterator<Item = T>,
123 {
124 let vec_mut: PVectorMut<T> = iter.into_iter().collect();
125
126 vec_mut.freeze()
127 }
128}
129
130impl<T: NativePType> FromIterator<T> for PrimitiveVector {
131 /// Creates a new [`PVector<T>`] from an iterator of `T` values.
132 fn from_iter<I>(iter: I) -> Self
133 where
134 I: IntoIterator<Item = T>,
135 {
136 let vec_mut: PVectorMut<T> = iter.into_iter().collect();
137
138 PrimitiveVector::from(vec_mut.freeze())
139 }
140}
141
142/// Iterator over a [`PVectorMut<T>`] that yields [`Option<T>`] values.
143///
144/// This iterator is created by calling [`IntoIterator::into_iter`] on a [`PVectorMut<T>`].
145///
146/// It consumes the mutable vector and iterates over the elements, yielding `None` for null values
147/// and `Some(value)` for valid values.
148#[derive(Debug)]
149pub struct PVectorMutIterator<T: NativePType> {
150 /// The vector being iterated over.
151 vector: PVectorMut<T>,
152 /// The current index into the vector.
153 index: usize,
154}
155
156impl<T: NativePType> Iterator for PVectorMutIterator<T> {
157 type Item = Option<T>;
158
159 fn next(&mut self) -> Option<Self::Item> {
160 (self.index < self.vector.len()).then(|| {
161 let value = self
162 .vector
163 .validity
164 .value(self.index)
165 .then(|| self.vector.elements[self.index]);
166 self.index += 1;
167 value
168 })
169 }
170
171 fn size_hint(&self) -> (usize, Option<usize>) {
172 let remaining = self.vector.len() - self.index;
173 (remaining, Some(remaining))
174 }
175}
176
177impl<T: NativePType> IntoIterator for PVectorMut<T> {
178 type Item = Option<T>;
179 type IntoIter = PVectorMutIterator<T>;
180
181 /// Converts the mutable vector into an iterator over [`Option<T>`] values.
182 ///
183 /// This method consumes the [`PVectorMut<T>`] and returns an iterator that yields `None` for
184 /// null values and `Some(value)` for valid values.
185 ///
186 /// # Examples
187 ///
188 /// ```
189 /// use vortex_vector::primitive::PVectorMut;
190 ///
191 /// let vec = PVectorMut::<i32>::from_iter([Some(1), None, Some(3), Some(4)]);
192 /// let collected: Vec<_> = vec.into_iter().collect();
193 /// assert_eq!(collected, vec![Some(1), None, Some(3), Some(4)]);
194 /// ```
195 fn into_iter(self) -> Self::IntoIter {
196 PVectorMutIterator {
197 vector: self,
198 index: 0,
199 }
200 }
201}