vortex_array/arrays/varbin/
accessor.rs1use std::iter;
2
3use vortex_dtype::match_each_integer_ptype;
4use vortex_error::VortexResult;
5
6use crate::ToCanonical;
7use crate::accessor::ArrayAccessor;
8use crate::arrays::varbin::VarBinArray;
9use crate::validity::Validity;
10use crate::vtable::ValidityHelper;
11
12impl ArrayAccessor<[u8]> for VarBinArray {
13 fn with_iterator<F, R>(&self, f: F) -> VortexResult<R>
14 where
15 F: for<'a> FnOnce(&mut (dyn Iterator<Item = Option<&'a [u8]>>)) -> R,
16 {
17 let offsets = self.offsets().to_primitive()?;
18 let validity = self.validity();
19
20 let bytes = self.bytes();
21 let bytes = bytes.as_slice();
22
23 match_each_integer_ptype!(offsets.ptype(), |T| {
24 let offsets = offsets.as_slice::<T>();
25
26 #[allow(clippy::cast_possible_truncation)]
27 match validity {
28 Validity::NonNullable | Validity::AllValid => {
29 let mut iter = offsets
30 .windows(2)
31 .map(|w| Some(&bytes[w[0] as usize..w[1] as usize]));
32 Ok(f(&mut iter))
33 }
34 Validity::AllInvalid => Ok(f(&mut iter::repeat_n(None, self.len()))),
35 Validity::Array(v) => {
36 let validity = v.to_bool()?;
37 let mut iter = offsets
38 .windows(2)
39 .zip(validity.boolean_buffer())
40 .map(|(w, valid)| valid.then(|| &bytes[w[0] as usize..w[1] as usize]));
41 Ok(f(&mut iter))
42 }
43 }
44 })
45 }
46}