vortex_array/array/vtable/
validity.rs1use vortex_error::VortexResult;
5
6use crate::ArrayRef;
7use crate::array::ArrayView;
8use crate::array::VTable;
9use crate::validity::Validity;
10
11pub trait ValidityVTable<V: VTable> {
12 fn validity(array: ArrayView<'_, V>) -> VortexResult<Validity>;
18}
19
20pub struct ValidityVTableFromChild;
23
24pub trait ValidityChild<V: VTable> {
25 fn validity_child(array: ArrayView<'_, V>) -> ArrayRef;
26}
27
28impl<V: VTable> ValidityVTable<V> for ValidityVTableFromChild
29where
30 V: ValidityChild<V>,
31{
32 fn validity(array: ArrayView<'_, V>) -> VortexResult<Validity> {
33 V::validity_child(array).validity()
34 }
35}
36
37pub struct ValidityVTableFromChildSliceHelper;
40
41pub trait ValidityChildSliceHelper {
42 fn unsliced_child_and_slice(&self) -> (&ArrayRef, usize, usize);
43
44 fn sliced_child_array(&self) -> VortexResult<ArrayRef> {
45 let (unsliced_validity, start, stop) = self.unsliced_child_and_slice();
46 unsliced_validity.slice(start..stop)
47 }
48}
49
50impl<V: VTable> ValidityVTable<V> for ValidityVTableFromChildSliceHelper
51where
52 V::ArrayData: ValidityChildSliceHelper,
53{
54 fn validity(array: ArrayView<'_, V>) -> VortexResult<Validity> {
55 array.data().sliced_child_array()?.validity()
56 }
57}