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