mlt_core/decoder/
analyze.rs1use 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}