use vortex_error::VortexResult;
use crate::ExecutionCtx;
use crate::arrays::FixedSizeListArray;
use crate::arrays::PrimitiveArray;
use crate::arrays::fixed_size_list::FixedSizeListArrayExt;
use crate::arrays::fixed_size_list::FixedSizeListArraySlotsExt;
use crate::dtype::DType;
use crate::dtype::Nullability;
use crate::dtype::PType;
pub(crate) fn is_fixed_size_bytes(dtype: &DType) -> bool {
matches!(
dtype,
DType::FixedSizeList(element_dtype, ..)
if matches!(element_dtype.as_ref(), DType::Primitive(PType::U8, Nullability::NonNullable))
)
}
pub(crate) struct FixedSizeBytes {
elements: PrimitiveArray,
size: usize,
len: usize,
}
impl FixedSizeBytes {
pub(crate) fn try_new(
array: &FixedSizeListArray,
ctx: &mut ExecutionCtx,
) -> VortexResult<Self> {
Ok(Self {
elements: array.elements().clone().execute::<PrimitiveArray>(ctx)?,
size: array.list_size() as usize,
len: array.len(),
})
}
pub(crate) fn values(&self) -> impl Iterator<Item = &[u8]> {
let bytes = self.elements.as_slice::<u8>();
(0..self.len).map(move |index| &bytes[index * self.size..(index + 1) * self.size])
}
}