use vortex_error::VortexResult;
use crate::ArrayRef;
use crate::array::ArrayView;
use crate::array::VTable;
use crate::validity::Validity;
pub trait ValidityVTable<V: VTable> {
fn validity(array: ArrayView<'_, V>) -> VortexResult<Validity>;
}
pub struct ValidityVTableFromChild;
pub trait ValidityChild<V: VTable> {
fn validity_child(array: ArrayView<'_, V>) -> ArrayRef;
}
impl<V: VTable> ValidityVTable<V> for ValidityVTableFromChild
where
V: ValidityChild<V>,
{
fn validity(array: ArrayView<'_, V>) -> VortexResult<Validity> {
V::validity_child(array).validity()
}
}
pub struct ValidityVTableFromChildSliceHelper;
pub trait ValidityChildSliceHelper {
fn unsliced_child_and_slice(&self) -> (&ArrayRef, usize, usize);
fn sliced_child_array(&self) -> VortexResult<ArrayRef> {
let (unsliced_validity, start, stop) = self.unsliced_child_and_slice();
unsliced_validity.slice(start..stop)
}
}
impl<V: VTable> ValidityVTable<V> for ValidityVTableFromChildSliceHelper
where
V::ArrayData: ValidityChildSliceHelper,
{
fn validity(array: ArrayView<'_, V>) -> VortexResult<Validity> {
array.data().sliced_child_array()?.validity()
}
}