1use vortex_array::serde::ArrayParts;
2use vortex_array::validity::Validity;
3use vortex_array::vtable::SerdeVTable;
4use vortex_array::{
5 Array, ArrayBufferVisitor, ArrayChildVisitor, ArrayContext, ArrayRef, ArrayVisitorImpl,
6 EmptyMetadata,
7};
8use vortex_dtype::DType;
9use vortex_error::{VortexResult, vortex_bail};
10
11use crate::{ByteBoolArray, ByteBoolEncoding};
12
13impl ArrayVisitorImpl<EmptyMetadata> for ByteBoolArray {
14 fn _buffers(&self, visitor: &mut dyn ArrayBufferVisitor) {
15 visitor.visit_buffer(self.buffer());
16 }
17
18 fn _children(&self, visitor: &mut dyn ArrayChildVisitor) {
19 visitor.visit_validity(self.validity(), self.len());
20 }
21
22 fn _metadata(&self) -> EmptyMetadata {
23 EmptyMetadata
24 }
25}
26
27impl SerdeVTable<&ByteBoolArray> for ByteBoolEncoding {
28 fn decode(
29 &self,
30 parts: &ArrayParts,
31 ctx: &ArrayContext,
32 dtype: DType,
33 len: usize,
34 ) -> VortexResult<ArrayRef> {
35 let validity = if parts.nchildren() == 0 {
36 Validity::from(dtype.nullability())
37 } else if parts.nchildren() == 1 {
38 let validity = parts.child(0).decode(ctx, Validity::DTYPE, len)?;
39 Validity::Array(validity)
40 } else {
41 vortex_bail!("Expected 0 or 1 child, got {}", parts.nchildren());
42 };
43
44 if parts.nbuffers() != 1 {
45 vortex_bail!("Expected 1 buffer, got {}", parts.nbuffers());
46 }
47 let buffer = parts.buffer(0)?;
48
49 Ok(ByteBoolArray::new(buffer, validity).into_array())
50 }
51}