Skip to main content

vortex_fastlanes/bitpacking/vtable/
visitor.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_array::ArrayBufferVisitor;
5use vortex_array::ArrayChildVisitor;
6use vortex_array::vtable::ValidityHelper;
7use vortex_array::vtable::VisitorVTable;
8use vortex_array::vtable::validity_nchildren;
9
10use crate::BitPackedArray;
11use crate::BitPackedVTable;
12
13impl VisitorVTable<BitPackedVTable> for BitPackedVTable {
14    fn visit_buffers(array: &BitPackedArray, visitor: &mut dyn ArrayBufferVisitor) {
15        visitor.visit_buffer_handle("packed", array.packed());
16    }
17
18    fn nbuffers(_array: &BitPackedArray) -> usize {
19        1
20    }
21
22    fn visit_children(array: &BitPackedArray, visitor: &mut dyn ArrayChildVisitor) {
23        if let Some(patches) = array.patches() {
24            visitor.visit_patches(patches);
25        }
26        visitor.visit_validity(array.validity(), array.len());
27    }
28
29    fn nchildren(array: &BitPackedArray) -> usize {
30        // optional patches (indices + values + optional chunk_offsets) + optional validity
31        array
32            .patches()
33            .map_or(0, |p| 2 + p.chunk_offsets().is_some() as usize)
34            + validity_nchildren(array.validity())
35    }
36}