Skip to main content

mlt_core/decoder/
analyze.rs

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