mlt_core/decoder/
analyze.rs1use crate::decoder::{
2 Geometry, GeometryType, GeometryValues, Id, Layer01, Property, RawFloats, RawFloatsEncoding,
3 RawFsstData, RawGeometry, RawId, RawIdValue, RawPlainData, RawPresence, RawProperty, RawScalar,
4 RawSharedDict, RawSharedDictEncoding, RawSharedDictItem, RawStrings, RawStringsEncoding,
5 StreamMeta,
6};
7use crate::{Analyze, DecodeState, StatType};
8
9impl<'a, S: DecodeState> Analyze for Layer01<'a, S>
10where
11 Option<Id<'a, S>>: Analyze,
12 Geometry<'a, S>: Analyze,
13 Vec<Property<'a, S>>: Analyze,
14{
15 fn collect_statistic(&self, stat: StatType) -> usize {
16 match stat {
17 StatType::DecodedMetaSize => self.name().len() + size_of::<u32>(),
18 StatType::DecodedDataSize => {
19 self.id.collect_statistic(stat)
20 + self.geometry.collect_statistic(stat)
21 + self.properties.collect_statistic(stat)
22 }
23 StatType::FeatureCount => self.geometry.collect_statistic(stat),
24 }
25 }
26
27 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
28 self.id.for_each_stream(cb);
29 self.geometry.for_each_stream(cb);
30 self.properties.for_each_stream(cb);
31 }
32}
33
34impl Analyze for RawGeometry<'_> {
35 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
36 self.meta.for_each_stream(cb);
37 self.items.for_each_stream(cb);
38 }
39}
40
41impl Analyze for GeometryValues {
42 fn collect_statistic(&self, stat: StatType) -> usize {
43 match stat {
44 StatType::DecodedDataSize => {
45 self.vector_types.collect_statistic(stat)
46 + self.geometry_offsets.collect_statistic(stat)
47 + self.part_offsets.collect_statistic(stat)
48 + self.ring_offsets.collect_statistic(stat)
49 + self.index_buffer.collect_statistic(stat)
50 + self.triangles.collect_statistic(stat)
51 + self.vertices.collect_statistic(stat)
52 }
53 StatType::DecodedMetaSize => 0,
54 StatType::FeatureCount => self.vector_types.len(),
55 }
56 }
57}
58
59impl Analyze for GeometryType {
60 fn collect_statistic(&self, _stat: StatType) -> usize {
61 size_of::<Self>()
62 }
63}
64
65impl Analyze for RawId<'_> {
66 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
67 self.presence.for_each_stream(cb);
68 self.value.for_each_stream(cb);
69 }
70}
71
72impl Analyze for RawIdValue<'_> {
73 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
74 match self {
75 Self::Id32(v) | Self::Id64(v) => v.for_each_stream(cb),
76 }
77 }
78}
79
80impl Analyze for RawPresence<'_> {
81 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
82 match self {
83 Self::AllPresent => {}
84 #[cfg(feature = "unstable-v2")]
86 Self::Bitfield(_) => {}
87 Self::Stream(s) => s.for_each_stream(cb),
88 }
89 }
90}
91
92impl Analyze for RawPlainData<'_> {
93 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
94 self.lengths.for_each_stream(cb);
95 self.data.for_each_stream(cb);
96 }
97}
98
99impl Analyze for RawFsstData<'_> {
100 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
101 self.symbol_lengths.for_each_stream(cb);
102 self.symbol_table.for_each_stream(cb);
103 self.lengths.for_each_stream(cb);
104 self.corpus.for_each_stream(cb);
105 }
106}
107
108impl Analyze for RawStringsEncoding<'_> {
109 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
110 match self {
111 Self::Plain(plain_data) => plain_data.for_each_stream(cb),
112 Self::Dictionary {
113 plain_data,
114 offsets,
115 dict: _,
116 } => {
117 plain_data.for_each_stream(cb);
118 offsets.for_each_stream(cb);
119 }
120 Self::FsstPlain(fsst_data) => fsst_data.for_each_stream(cb),
121 Self::FsstDictionary {
122 fsst_data,
123 offsets,
124 dict: _,
125 } => {
126 fsst_data.for_each_stream(cb);
127 offsets.for_each_stream(cb);
128 }
129 }
130 }
131}
132
133impl Analyze for RawScalar<'_> {
134 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
135 self.presence.for_each_stream(cb);
136 self.data.for_each_stream(cb);
137 }
138}
139
140impl Analyze for RawFloats<'_> {
141 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
142 self.presence.for_each_stream(cb);
143 self.encoding.for_each_stream(cb);
144 }
145}
146
147impl Analyze for RawFloatsEncoding<'_> {
148 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
149 match self {
150 Self::Single(data) => data.for_each_stream(cb),
151 #[cfg(feature = "unstable-v2")]
152 Self::Dictionary { codes, dictionary } => {
153 codes.for_each_stream(cb);
154 dictionary.for_each_stream(cb);
155 }
156 #[cfg(feature = "unstable-v2")]
157 Self::Alp { data, .. } => data.for_each_stream(cb),
158 }
159 }
160}
161
162impl Analyze for RawStrings<'_> {
163 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
164 self.presence.for_each_stream(cb);
165 self.encoding.for_each_stream(cb);
166 }
167}
168
169impl Analyze for RawSharedDictItem<'_> {
170 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
171 self.presence.for_each_stream(cb);
172 self.data.for_each_stream(cb);
173 }
174}
175
176impl Analyze for RawSharedDictEncoding<'_> {
177 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
178 match self {
179 Self::Plain(plain_data) => plain_data.for_each_stream(cb),
180 Self::FsstPlain(fsst_data) => fsst_data.for_each_stream(cb),
181 }
182 }
183}
184
185impl Analyze for RawSharedDict<'_> {
186 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
187 self.encoding.for_each_stream(cb);
188 self.children.for_each_stream(cb);
189 }
190}
191
192impl Analyze for RawProperty<'_> {
193 fn for_each_stream(&self, cb: &mut dyn FnMut(StreamMeta)) {
194 match self {
195 Self::Bool(s)
196 | Self::I8(s)
197 | Self::U8(s)
198 | Self::I32(s)
199 | Self::U32(s)
200 | Self::I64(s)
201 | Self::U64(s) => s.for_each_stream(cb),
202 Self::F32(s) | Self::F64(s) => s.for_each_stream(cb),
203 Self::Str(s) => s.for_each_stream(cb),
204 Self::SharedDict(s) => s.for_each_stream(cb),
205 }
206 }
207}