vortex_array/array/
visitor.rs1use std::fmt::Formatter;
5use std::sync::Arc;
6
7use vortex_buffer::ByteBuffer;
8use vortex_error::VortexResult;
9
10use crate::Array;
11use crate::ArrayRef;
12use crate::buffer::BufferHandle;
13
14pub trait ArrayVisitor {
15 fn children(&self) -> Vec<ArrayRef>;
17
18 fn nchildren(&self) -> usize;
20
21 fn nth_child(&self, idx: usize) -> Option<ArrayRef>;
25
26 fn children_names(&self) -> Vec<String>;
28
29 fn named_children(&self) -> Vec<(String, ArrayRef)>;
31
32 fn buffers(&self) -> Vec<ByteBuffer>;
34
35 fn buffer_handles(&self) -> Vec<BufferHandle>;
37
38 fn buffer_names(&self) -> Vec<String>;
40
41 fn named_buffers(&self) -> Vec<(String, BufferHandle)>;
43
44 fn nbuffers(&self) -> usize;
46
47 fn metadata(&self) -> VortexResult<Option<Vec<u8>>>;
50
51 fn metadata_fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result;
53
54 fn is_host(&self) -> bool;
58}
59
60impl ArrayVisitor for Arc<dyn Array> {
61 fn children(&self) -> Vec<ArrayRef> {
62 self.as_ref().children()
63 }
64
65 fn nchildren(&self) -> usize {
66 self.as_ref().nchildren()
67 }
68
69 fn nth_child(&self, idx: usize) -> Option<ArrayRef> {
70 self.as_ref().nth_child(idx)
71 }
72
73 fn children_names(&self) -> Vec<String> {
74 self.as_ref().children_names()
75 }
76
77 fn named_children(&self) -> Vec<(String, ArrayRef)> {
78 self.as_ref().named_children()
79 }
80
81 fn buffers(&self) -> Vec<ByteBuffer> {
82 self.as_ref().buffers()
83 }
84
85 fn buffer_handles(&self) -> Vec<BufferHandle> {
86 self.as_ref().buffer_handles()
87 }
88
89 fn buffer_names(&self) -> Vec<String> {
90 self.as_ref().buffer_names()
91 }
92
93 fn named_buffers(&self) -> Vec<(String, BufferHandle)> {
94 self.as_ref().named_buffers()
95 }
96
97 fn nbuffers(&self) -> usize {
98 self.as_ref().nbuffers()
99 }
100
101 fn metadata(&self) -> VortexResult<Option<Vec<u8>>> {
102 self.as_ref().metadata()
103 }
104
105 fn metadata_fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
106 self.as_ref().metadata_fmt(f)
107 }
108
109 fn is_host(&self) -> bool {
110 self.as_ref().is_host()
111 }
112}
113
114pub trait ArrayVisitorExt: Array {
115 fn nbuffers_recursive(&self) -> usize {
117 self.children()
118 .iter()
119 .map(ArrayVisitorExt::nbuffers_recursive)
120 .sum::<usize>()
121 + self.nbuffers()
122 }
123
124 fn depth_first_traversal(&self) -> impl Iterator<Item = ArrayRef> {
126 struct ArrayChildrenIterator {
128 stack: Vec<ArrayRef>,
129 }
130
131 impl Iterator for ArrayChildrenIterator {
132 type Item = ArrayRef;
133
134 fn next(&mut self) -> Option<Self::Item> {
135 let next = self.stack.pop()?;
136 for child in next.children().into_iter().rev() {
137 self.stack.push(child);
138 }
139 Some(next)
140 }
141 }
142
143 ArrayChildrenIterator {
144 stack: vec![self.to_array()],
145 }
146 }
147}
148
149impl<A: Array + ?Sized> ArrayVisitorExt for A {}