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