1use vortex_array::serde::ArrayChildren;
5use vortex_array::validity::Validity;
6use vortex_array::vtable::{SerdeVTable, ValidityHelper, VisitorVTable};
7use vortex_array::{ArrayBufferVisitor, ArrayChildVisitor, DeserializeMetadata, EmptyMetadata};
8use vortex_buffer::ByteBuffer;
9use vortex_dtype::DType;
10use vortex_error::{VortexResult, vortex_bail};
11
12use crate::{ByteBoolArray, ByteBoolEncoding, ByteBoolVTable};
13
14impl SerdeVTable<ByteBoolVTable> for ByteBoolVTable {
15 type Metadata = EmptyMetadata;
16
17 fn metadata(_array: &ByteBoolArray) -> VortexResult<Option<Self::Metadata>> {
18 Ok(Some(EmptyMetadata))
19 }
20
21 fn build(
22 _encoding: &ByteBoolEncoding,
23 dtype: &DType,
24 len: usize,
25 _metadata: &<Self::Metadata as DeserializeMetadata>::Output,
26 buffers: &[ByteBuffer],
27 children: &dyn ArrayChildren,
28 ) -> VortexResult<ByteBoolArray> {
29 let validity = if children.is_empty() {
30 Validity::from(dtype.nullability())
31 } else if children.len() == 1 {
32 let validity = children.get(0, &Validity::DTYPE, len)?;
33 Validity::Array(validity)
34 } else {
35 vortex_bail!("Expected 0 or 1 child, got {}", children.len());
36 };
37
38 if buffers.len() != 1 {
39 vortex_bail!("Expected 1 buffer, got {}", buffers.len());
40 }
41 let buffer = buffers[0].clone();
42
43 Ok(ByteBoolArray::new(buffer, validity))
44 }
45}
46
47impl VisitorVTable<ByteBoolVTable> for ByteBoolVTable {
48 fn visit_buffers(array: &ByteBoolArray, visitor: &mut dyn ArrayBufferVisitor) {
49 visitor.visit_buffer(array.buffer());
50 }
51
52 fn visit_children(array: &ByteBoolArray, visitor: &mut dyn ArrayChildVisitor) {
53 visitor.visit_validity(array.validity(), array.len());
54 }
55}