vortex_array/vtable/
validity.rs1use vortex_error::VortexResult;
5
6use crate::Array;
7use crate::ArrayRef;
8use crate::validity::Validity;
9use crate::vtable::VTable;
10
11pub trait ValidityVTable<V: VTable> {
12 fn validity(array: &V::Array) -> VortexResult<Validity>;
18}
19
20pub struct ValidityVTableFromValidityHelper;
22
23pub trait ValidityHelper {
25 fn validity(&self) -> &Validity;
26}
27
28impl<V: VTable> ValidityVTable<V> for ValidityVTableFromValidityHelper
29where
30 V::Array: ValidityHelper,
31{
32 fn validity(array: &V::Array) -> VortexResult<Validity> {
33 Ok(array.validity().clone())
34 }
35}
36
37pub struct ValidityVTableFromValiditySliceHelper;
40
41pub trait ValiditySliceHelper {
42 fn unsliced_validity_and_slice(&self) -> (&Validity, usize, usize);
43
44 fn sliced_validity(&self) -> VortexResult<Validity> {
45 let (unsliced_validity, start, stop) = self.unsliced_validity_and_slice();
46 unsliced_validity.slice(start..stop)
47 }
48}
49
50impl<V: VTable> ValidityVTable<V> for ValidityVTableFromValiditySliceHelper
51where
52 V::Array: ValiditySliceHelper,
53{
54 fn validity(array: &V::Array) -> VortexResult<Validity> {
55 array.sliced_validity()
56 }
57}
58
59pub struct ValidityVTableFromChild;
62
63pub trait ValidityChild<V: VTable> {
64 fn validity_child(array: &V::Array) -> &ArrayRef;
65}
66
67impl<V: VTable> ValidityVTable<V> for ValidityVTableFromChild
68where
69 V: ValidityChild<V>,
70{
71 fn validity(array: &V::Array) -> VortexResult<Validity> {
72 V::validity_child(array).validity()
73 }
74}
75
76pub struct ValidityVTableFromChildSliceHelper;
79
80pub trait ValidityChildSliceHelper {
81 fn unsliced_child_and_slice(&self) -> (&ArrayRef, usize, usize);
82
83 fn sliced_child_array(&self) -> VortexResult<ArrayRef> {
84 let (unsliced_validity, start, stop) = self.unsliced_child_and_slice();
85 unsliced_validity.slice(start..stop)
86 }
87}
88
89impl<V: VTable> ValidityVTable<V> for ValidityVTableFromChildSliceHelper
90where
91 V::Array: ValidityChildSliceHelper,
92{
93 fn validity(array: &V::Array) -> VortexResult<Validity> {
94 array.sliced_child_array()?.validity()
95 }
96}