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}