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