arrow2/array/primitive/
iterator.rs1use crate::{
2 array::MutableArray,
3 bitmap::utils::{BitmapIter, ZipValidity},
4 bitmap::IntoIter as BitmapIntoIter,
5 buffer::IntoIter,
6 types::NativeType,
7};
8
9use super::{MutablePrimitiveArray, PrimitiveArray};
10
11impl<T: NativeType> IntoIterator for PrimitiveArray<T> {
12 type Item = Option<T>;
13 type IntoIter = ZipValidity<T, IntoIter<T>, BitmapIntoIter>;
14
15 #[inline]
16 fn into_iter(self) -> Self::IntoIter {
17 let (_, values, validity) = self.into_inner();
18 let values = values.into_iter();
19 let validity =
20 validity.and_then(|validity| (validity.unset_bits() > 0).then(|| validity.into_iter()));
21 ZipValidity::new(values, validity)
22 }
23}
24
25impl<'a, T: NativeType> IntoIterator for &'a PrimitiveArray<T> {
26 type Item = Option<&'a T>;
27 type IntoIter = ZipValidity<&'a T, std::slice::Iter<'a, T>, BitmapIter<'a>>;
28
29 #[inline]
30 fn into_iter(self) -> Self::IntoIter {
31 self.iter()
32 }
33}
34
35impl<'a, T: NativeType> MutablePrimitiveArray<T> {
36 #[inline]
38 pub fn iter(&'a self) -> ZipValidity<&'a T, std::slice::Iter<'a, T>, BitmapIter<'a>> {
39 ZipValidity::new(
40 self.values().iter(),
41 self.validity().as_ref().map(|x| x.iter()),
42 )
43 }
44
45 #[inline]
47 pub fn values_iter(&'a self) -> std::slice::Iter<'a, T> {
48 self.values().iter()
49 }
50}