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