vortex_array/arrays/struct_/vtable/
visitor.rs1use itertools::Itertools;
5
6use crate::ArrayBufferVisitor;
7use crate::ArrayChildVisitor;
8use crate::ArrayChildVisitorUnnamed;
9use crate::ArrayRef;
10use crate::arrays::struct_::StructArray;
11use crate::arrays::struct_::StructVTable;
12use crate::vtable::ValidityHelper;
13use crate::vtable::VisitorVTable;
14use crate::vtable::validity_nchildren;
15use crate::vtable::validity_to_child;
16
17impl VisitorVTable<StructVTable> for StructVTable {
18 fn visit_buffers(_array: &StructArray, _visitor: &mut dyn ArrayBufferVisitor) {}
19
20 fn nbuffers(_array: &StructArray) -> usize {
21 0
22 }
23
24 fn visit_children(array: &StructArray, visitor: &mut dyn ArrayChildVisitor) {
25 visitor.visit_validity(array.validity(), array.len());
26 for (name, field) in array.names().iter().zip_eq(array.unmasked_fields().iter()) {
27 visitor.visit_child(name.as_ref(), field);
28 }
29 }
30
31 fn visit_children_unnamed(array: &StructArray, visitor: &mut dyn ArrayChildVisitorUnnamed) {
32 visitor.visit_validity(array.validity(), array.len());
33 for field in array.unmasked_fields().iter() {
34 visitor.visit_child(field);
35 }
36 }
37
38 fn nchildren(array: &StructArray) -> usize {
39 validity_nchildren(array.validity()) + array.unmasked_fields().len()
40 }
41
42 fn nth_child(array: &StructArray, idx: usize) -> Option<ArrayRef> {
43 let validity_children = validity_nchildren(array.validity());
44 if idx < validity_children {
45 validity_to_child(array.validity(), array.len())
46 } else {
47 array
48 .unmasked_fields()
49 .get(idx - validity_children)
50 .cloned()
51 }
52 }
53}