use vortex_buffer::ByteBuffer;
use vortex_error::VortexResult;
use vortex_error::vortex_ensure_eq;
use vortex_error::vortex_err;
use crate::array::Array;
use crate::array::ArrayView;
use crate::array::VTable;
use crate::validity::Validity;
pub(crate) trait FixedWidthArray: VTable {
fn byte_width(array: ArrayView<'_, Self>) -> usize;
fn values(array: ArrayView<'_, Self>) -> ByteBuffer;
fn with_values(
array: ArrayView<'_, Self>,
values: ByteBuffer,
len: usize,
validity: Validity,
) -> VortexResult<Array<Self>>;
}
pub(crate) fn with_values<V: FixedWidthArray>(
array: ArrayView<'_, V>,
values: ByteBuffer,
len: usize,
validity: Validity,
) -> VortexResult<Array<V>> {
let expected_len = len
.checked_mul(V::byte_width(array))
.ok_or_else(|| vortex_err!("Fixed-width values buffer length overflows usize"))?;
vortex_ensure_eq!(
values.len(),
expected_len,
"Fixed-width values buffer length {} does not match expected length {expected_len}",
values.len(),
);
V::with_values(array, values, len, validity)
}