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