use vortex_error::VortexResult;
use crate::ArrayRef;
use crate::DynArray;
use crate::validity::Validity;
use crate::vtable::VTable;
pub trait ValidityVTable<V: VTable> {
fn validity(array: &V::Array) -> VortexResult<Validity>;
}
pub struct ValidityVTableFromValidityHelper;
pub trait ValidityHelper {
fn validity(&self) -> &Validity;
}
impl<V: VTable> ValidityVTable<V> for ValidityVTableFromValidityHelper
where
V::Array: ValidityHelper,
{
fn validity(array: &V::Array) -> VortexResult<Validity> {
Ok(array.validity().clone())
}
}
pub struct ValidityVTableFromValiditySliceHelper;
pub trait ValiditySliceHelper {
fn unsliced_validity_and_slice(&self) -> (&Validity, usize, usize);
fn sliced_validity(&self) -> VortexResult<Validity> {
let (unsliced_validity, start, stop) = self.unsliced_validity_and_slice();
unsliced_validity.slice(start..stop)
}
}
impl<V: VTable> ValidityVTable<V> for ValidityVTableFromValiditySliceHelper
where
V::Array: ValiditySliceHelper,
{
fn validity(array: &V::Array) -> VortexResult<Validity> {
array.sliced_validity()
}
}
pub struct ValidityVTableFromChild;
pub trait ValidityChild<V: VTable> {
fn validity_child(array: &V::Array) -> &ArrayRef;
}
impl<V: VTable> ValidityVTable<V> for ValidityVTableFromChild
where
V: ValidityChild<V>,
{
fn validity(array: &V::Array) -> 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::Array: ValidityChildSliceHelper,
{
fn validity(array: &V::Array) -> VortexResult<Validity> {
array.sliced_child_array()?.validity()
}
}