vortex_array/arrays/listview/compute/
cast.rs1use vortex_dtype::DType;
5use vortex_error::VortexResult;
6
7use crate::arrays::{ListViewArray, ListViewVTable};
8use crate::compute::{self, CastKernel, CastKernelAdapter};
9use crate::vtable::ValidityHelper;
10use crate::{ArrayRef, IntoArray, register_kernel};
11
12impl CastKernel for ListViewVTable {
13 fn cast(&self, array: &ListViewArray, dtype: &DType) -> VortexResult<Option<ArrayRef>> {
14 let Some(target_element_type) = dtype.as_list_element_opt() else {
16 return Ok(None);
17 };
18
19 let new_elements = compute::cast(array.elements(), target_element_type)?;
21 let validity = array
22 .validity()
23 .clone()
24 .cast_nullability(dtype.nullability(), array.len())?;
25
26 Ok(Some(
28 unsafe {
29 ListViewArray::new_unchecked(
30 new_elements,
31 array.offsets().clone(),
32 array.sizes().clone(),
33 validity,
34 )
35 .with_zero_copy_to_list(array.is_zero_copy_to_list())
36 }
37 .into_array(),
38 ))
39 }
40}
41
42register_kernel!(CastKernelAdapter(ListViewVTable).lift());