use vortex_dtype::DType;
use vortex_error::VortexResult;
use crate::ArrayRef;
use crate::IntoArray;
use crate::arrays::ListViewArray;
use crate::arrays::ListViewVTable;
use crate::builtins::ArrayBuiltins;
use crate::compute::CastReduce;
use crate::vtable::ValidityHelper;
impl CastReduce for ListViewVTable {
fn cast(array: &ListViewArray, dtype: &DType) -> VortexResult<Option<ArrayRef>> {
let Some(target_element_type) = dtype.as_list_element_opt() else {
return Ok(None);
};
let new_elements = array
.elements()
.cast((**target_element_type).clone())?
.to_canonical()?
.into_array();
let validity = array
.validity()
.clone()
.cast_nullability(dtype.nullability(), array.len())?;
Ok(Some(
unsafe {
ListViewArray::new_unchecked(
new_elements,
array.offsets().clone(),
array.sizes().clone(),
validity,
)
.with_zero_copy_to_list(array.is_zero_copy_to_list())
}
.into_array(),
))
}
}