vortex_array/arrays/varbinview/
accessor.rs1use std::iter;
5
6use vortex_error::VortexExpect;
7
8use crate::ToCanonical;
9use crate::accessor::ArrayAccessor;
10use crate::arrays::VarBinViewArray;
11use crate::validity::Validity;
12
13impl ArrayAccessor<[u8]> for VarBinViewArray {
14 fn with_iterator<F: for<'a> FnOnce(&mut dyn Iterator<Item = Option<&'a [u8]>>) -> R, R>(
15 &self,
16 f: F,
17 ) -> R {
18 let bytes = (0..self.data_buffers().len())
19 .map(|i| self.buffer(i))
20 .collect::<Vec<_>>();
21
22 let views = self.views();
23
24 match self
25 .validity()
26 .vortex_expect("varbinview validity should be derivable")
27 {
28 Validity::NonNullable | Validity::AllValid => {
29 let mut iter = views.iter().map(|view| {
30 if view.is_inlined() {
31 Some(view.as_inlined().value())
32 } else {
33 Some(
34 &bytes[view.as_view().buffer_index as usize][view.as_view().as_range()],
35 )
36 }
37 });
38 f(&mut iter)
39 }
40 Validity::AllInvalid => f(&mut iter::repeat_n(None, views.len())),
41 Validity::Array(v) => {
42 let validity = v.to_bool().into_bit_buffer();
43 let mut iter = views.iter().zip(validity.iter()).map(|(view, valid)| {
44 if valid {
45 if view.is_inlined() {
46 Some(view.as_inlined().value())
47 } else {
48 Some(
49 &bytes[view.as_view().buffer_index as usize]
50 [view.as_view().as_range()],
51 )
52 }
53 } else {
54 None
55 }
56 });
57 f(&mut iter)
58 }
59 }
60 }
61}
62
63impl ArrayAccessor<[u8]> for &VarBinViewArray {
64 fn with_iterator<F, R>(&self, f: F) -> R
65 where
66 F: for<'a> FnOnce(&mut dyn Iterator<Item = Option<&'a [u8]>>) -> R,
67 {
68 <VarBinViewArray as ArrayAccessor<[u8]>>::with_iterator(*self, f)
69 }
70}