Skip to main content

mlt_core/decoder/
analyze.rs

1use 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            // Bitfield presence is headerless raw bytes, not a stream.
85            #[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}