vortex_array/vtable/
visitor.rs

1use vortex_buffer::ByteBuffer;
2
3use crate::vtable::VTable;
4use crate::{Array, ArrayBufferVisitor, ArrayChildVisitor};
5
6pub trait VisitorVTable<V: VTable> {
7    /// Visit the buffers of the array.
8    fn visit_buffers(array: &V::Array, visitor: &mut dyn ArrayBufferVisitor);
9
10    /// Count the number of buffers in the array.
11    fn nbuffers(array: &V::Array) -> usize {
12        struct NBuffers(usize);
13
14        impl ArrayBufferVisitor for NBuffers {
15            fn visit_buffer(&mut self, _buffer: &ByteBuffer) {
16                self.0 += 1;
17            }
18        }
19
20        let mut visitor = NBuffers(0);
21        <V::VisitorVTable as VisitorVTable<V>>::visit_buffers(array, &mut visitor);
22        visitor.0
23    }
24
25    /// Visit the children of the array.
26    fn visit_children(array: &V::Array, visitor: &mut dyn ArrayChildVisitor);
27
28    /// Count the number of children in the array.
29    fn nchildren(array: &V::Array) -> usize {
30        struct NChildren(usize);
31
32        impl ArrayChildVisitor for NChildren {
33            fn visit_child(&mut self, _name: &str, _array: &dyn Array) {
34                self.0 += 1;
35            }
36        }
37
38        let mut visitor = NChildren(0);
39        <V::VisitorVTable as VisitorVTable<V>>::visit_children(array, &mut visitor);
40        visitor.0
41    }
42}