1use super::{TableRows, TablesStreamReader, ValueSize};
2use crate::{dotnet::md::MDStreamFlags, error::Result, io::ReadData};
3
4pub trait TableOffsetSize {
5 fn table_offset_size(rows: &TableRows) -> ValueSize;
6}
7
8pub trait StreamsOffsetSize {
9 fn streams_offset_size(rows: MDStreamFlags) -> ValueSize;
10}
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq)]
13#[repr(transparent)]
14pub struct StringsStreamOffset(pub u32);
15
16impl StreamsOffsetSize for StringsStreamOffset {
17 fn streams_offset_size(flags: MDStreamFlags) -> ValueSize {
18 if flags.contains(MDStreamFlags::BigStrings) {
19 ValueSize::Big
20 } else {
21 ValueSize::Small
22 }
23 }
24}
25
26impl<'a> ReadData<StringsStreamOffset> for TablesStreamReader<'a> {
27 fn read(&mut self) -> Result<StringsStreamOffset> {
28 if StringsStreamOffset::streams_offset_size(self.header.flags) == ValueSize::Big {
29 Ok(StringsStreamOffset(self.read()?))
30 } else {
31 let small_str: u16 = self.read()?;
32 Ok(StringsStreamOffset(small_str as u32))
33 }
34 }
35}
36
37#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38#[repr(transparent)]
39pub struct BlobStreamOffset(pub u32);
40
41impl StreamsOffsetSize for BlobStreamOffset {
42 fn streams_offset_size(flags: MDStreamFlags) -> ValueSize {
43 if flags.contains(MDStreamFlags::BigBlob) {
44 ValueSize::Big
45 } else {
46 ValueSize::Small
47 }
48 }
49}
50
51impl<'a> ReadData<BlobStreamOffset> for TablesStreamReader<'a> {
52 fn read(&mut self) -> Result<BlobStreamOffset> {
53 if BlobStreamOffset::streams_offset_size(self.header.flags) == ValueSize::Big {
54 Ok(BlobStreamOffset(self.read()?))
55 } else {
56 let small_str: u16 = self.read()?;
57 Ok(BlobStreamOffset(small_str as u32))
58 }
59 }
60}
61
62#[derive(Debug, Clone, Copy, PartialEq, Eq)]
63#[repr(transparent)]
64pub struct BlobStreamOffsetTypeSpec(pub u32);
65
66impl StreamsOffsetSize for BlobStreamOffsetTypeSpec {
67 fn streams_offset_size(flags: MDStreamFlags) -> ValueSize {
68 if flags.contains(MDStreamFlags::BigBlob) {
69 ValueSize::Big
70 } else {
71 ValueSize::Small
72 }
73 }
74}
75
76impl<'a> ReadData<BlobStreamOffsetTypeSpec> for TablesStreamReader<'a> {
77 fn read(&mut self) -> Result<BlobStreamOffsetTypeSpec> {
78 if BlobStreamOffsetTypeSpec::streams_offset_size(self.header.flags) == ValueSize::Big {
79 Ok(BlobStreamOffsetTypeSpec(self.read()?))
80 } else {
81 let small_str: u16 = self.read()?;
82 Ok(BlobStreamOffsetTypeSpec(small_str as u32))
83 }
84 }
85}
86
87#[derive(Debug, Clone, Copy, PartialEq, Eq)]
88#[repr(transparent)]
89pub struct GuidStreamOffset(pub u32);
90
91impl StreamsOffsetSize for GuidStreamOffset {
92 fn streams_offset_size(flags: MDStreamFlags) -> ValueSize {
93 if flags.contains(MDStreamFlags::BigGUID) {
94 ValueSize::Big
95 } else {
96 ValueSize::Small
97 }
98 }
99}
100
101impl<'a> ReadData<GuidStreamOffset> for TablesStreamReader<'a> {
102 fn read(&mut self) -> Result<GuidStreamOffset> {
103 if GuidStreamOffset::streams_offset_size(self.header.flags) == ValueSize::Big {
104 Ok(GuidStreamOffset(self.read()?))
105 } else {
106 let small_str: u16 = self.read()?;
107 Ok(GuidStreamOffset(small_str as u32))
108 }
109 }
110}
111
112#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
113#[repr(transparent)]
114pub struct ModuleTableOffset(pub u32);
115
116impl<'a> ReadData<ModuleTableOffset> for TablesStreamReader<'a> {
117 fn read(&mut self) -> Result<ModuleTableOffset> {
118 self.read_table_offset(self.header.table_locations.module)
119 .map(ModuleTableOffset)
120 }
121}
122
123impl TableOffsetSize for ModuleTableOffset {
124 fn table_offset_size(rows: &TableRows) -> ValueSize {
125 rows.module.row_size()
126 }
127}
128
129#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
130#[repr(transparent)]
131pub struct TypeRefTableOffset(pub u32);
132
133impl<'a> ReadData<TypeRefTableOffset> for TablesStreamReader<'a> {
134 fn read(&mut self) -> Result<TypeRefTableOffset> {
135 self.read_table_offset(self.header.table_locations.type_ref)
136 .map(TypeRefTableOffset)
137 }
138}
139
140impl TableOffsetSize for TypeRefTableOffset {
141 fn table_offset_size(rows: &TableRows) -> ValueSize {
142 rows.type_ref.row_size()
143 }
144}
145
146#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
147#[repr(transparent)]
148pub struct TypeDefTableOffset(pub u32);
149
150impl<'a> ReadData<TypeDefTableOffset> for TablesStreamReader<'a> {
151 fn read(&mut self) -> Result<TypeDefTableOffset> {
152 self.read_table_offset(self.header.table_locations.type_def)
153 .map(TypeDefTableOffset)
154 }
155}
156
157impl TableOffsetSize for TypeDefTableOffset {
158 fn table_offset_size(rows: &TableRows) -> ValueSize {
159 rows.type_def.row_size()
160 }
161}
162
163#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
164#[repr(transparent)]
165pub struct FieldPtrTableOffset(pub u32);
166
167impl<'a> ReadData<FieldPtrTableOffset> for TablesStreamReader<'a> {
168 fn read(&mut self) -> Result<FieldPtrTableOffset> {
169 self.read_table_offset(self.header.table_locations.field_ptr)
170 .map(FieldPtrTableOffset)
171 }
172}
173
174impl TableOffsetSize for FieldPtrTableOffset {
175 fn table_offset_size(rows: &TableRows) -> ValueSize {
176 rows.field_ptr.row_size()
177 }
178}
179
180#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
181#[repr(transparent)]
182pub struct FieldTableOffset(pub u32);
183
184impl<'a> ReadData<FieldTableOffset> for TablesStreamReader<'a> {
185 fn read(&mut self) -> Result<FieldTableOffset> {
186 self.read_table_offset(self.header.table_locations.field)
187 .map(FieldTableOffset)
188 }
189}
190
191impl TableOffsetSize for FieldTableOffset {
192 fn table_offset_size(rows: &TableRows) -> ValueSize {
193 rows.field.row_size()
194 }
195}
196
197#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
198#[repr(transparent)]
199pub struct MethodPtrTableOffset(pub u32);
200
201impl<'a> ReadData<MethodPtrTableOffset> for TablesStreamReader<'a> {
202 fn read(&mut self) -> Result<MethodPtrTableOffset> {
203 self.read_table_offset(self.header.table_locations.method_ptr)
204 .map(MethodPtrTableOffset)
205 }
206}
207
208impl TableOffsetSize for MethodPtrTableOffset {
209 fn table_offset_size(rows: &TableRows) -> ValueSize {
210 rows.method_ptr.row_size()
211 }
212}
213
214#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
215#[repr(transparent)]
216pub struct MethodTableOffset(pub u32);
217
218impl<'a> ReadData<MethodTableOffset> for TablesStreamReader<'a> {
219 fn read(&mut self) -> Result<MethodTableOffset> {
220 self.read_table_offset(self.header.table_locations.method)
221 .map(MethodTableOffset)
222 }
223}
224
225impl TableOffsetSize for MethodTableOffset {
226 fn table_offset_size(rows: &TableRows) -> ValueSize {
227 rows.method.row_size()
228 }
229}
230
231#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
232#[repr(transparent)]
233pub struct ParamPtrTableOffset(pub u32);
234
235impl<'a> ReadData<ParamPtrTableOffset> for TablesStreamReader<'a> {
236 fn read(&mut self) -> Result<ParamPtrTableOffset> {
237 self.read_table_offset(self.header.table_locations.param_ptr)
238 .map(ParamPtrTableOffset)
239 }
240}
241
242impl TableOffsetSize for ParamPtrTableOffset {
243 fn table_offset_size(rows: &TableRows) -> ValueSize {
244 rows.param_ptr.row_size()
245 }
246}
247
248#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
249#[repr(transparent)]
250pub struct ParamTableOffset(pub u32);
251
252impl<'a> ReadData<ParamTableOffset> for TablesStreamReader<'a> {
253 fn read(&mut self) -> Result<ParamTableOffset> {
254 self.read_table_offset(self.header.table_locations.param)
255 .map(ParamTableOffset)
256 }
257}
258
259impl TableOffsetSize for ParamTableOffset {
260 fn table_offset_size(rows: &TableRows) -> ValueSize {
261 rows.param.row_size()
262 }
263}
264
265#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
266#[repr(transparent)]
267pub struct InterfaceImplTableOffset(pub u32);
268
269impl<'a> ReadData<InterfaceImplTableOffset> for TablesStreamReader<'a> {
270 fn read(&mut self) -> Result<InterfaceImplTableOffset> {
271 self.read_table_offset(self.header.table_locations.interface_impl)
272 .map(InterfaceImplTableOffset)
273 }
274}
275
276impl TableOffsetSize for InterfaceImplTableOffset {
277 fn table_offset_size(rows: &TableRows) -> ValueSize {
278 rows.interface_impl.row_size()
279 }
280}
281
282#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
283#[repr(transparent)]
284pub struct MemberRefTableOffset(pub u32);
285
286impl<'a> ReadData<MemberRefTableOffset> for TablesStreamReader<'a> {
287 fn read(&mut self) -> Result<MemberRefTableOffset> {
288 self.read_table_offset(self.header.table_locations.member_ref)
289 .map(MemberRefTableOffset)
290 }
291}
292
293impl TableOffsetSize for MemberRefTableOffset {
294 fn table_offset_size(rows: &TableRows) -> ValueSize {
295 rows.member_ref.row_size()
296 }
297}
298
299#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
300#[repr(transparent)]
301pub struct ConstantTableOffset(pub u32);
302
303impl<'a> ReadData<ConstantTableOffset> for TablesStreamReader<'a> {
304 fn read(&mut self) -> Result<ConstantTableOffset> {
305 self.read_table_offset(self.header.table_locations.constant)
306 .map(ConstantTableOffset)
307 }
308}
309
310impl TableOffsetSize for ConstantTableOffset {
311 fn table_offset_size(rows: &TableRows) -> ValueSize {
312 rows.constant.row_size()
313 }
314}
315
316#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
317#[repr(transparent)]
318pub struct CustomAttributeTableOffset(pub u32);
319
320impl<'a> ReadData<CustomAttributeTableOffset> for TablesStreamReader<'a> {
321 fn read(&mut self) -> Result<CustomAttributeTableOffset> {
322 self.read_table_offset(self.header.table_locations.custom_attribute)
323 .map(CustomAttributeTableOffset)
324 }
325}
326
327impl TableOffsetSize for CustomAttributeTableOffset {
328 fn table_offset_size(rows: &TableRows) -> ValueSize {
329 rows.custom_attribute.row_size()
330 }
331}
332
333#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
334#[repr(transparent)]
335pub struct FieldMarshalTableOffset(pub u32);
336
337impl<'a> ReadData<FieldMarshalTableOffset> for TablesStreamReader<'a> {
338 fn read(&mut self) -> Result<FieldMarshalTableOffset> {
339 self.read_table_offset(self.header.table_locations.field_marshal)
340 .map(FieldMarshalTableOffset)
341 }
342}
343
344impl TableOffsetSize for FieldMarshalTableOffset {
345 fn table_offset_size(rows: &TableRows) -> ValueSize {
346 rows.field_marshal.row_size()
347 }
348}
349
350#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
351#[repr(transparent)]
352pub struct DeclSecurityTableOffset(pub u32);
353
354impl<'a> ReadData<DeclSecurityTableOffset> for TablesStreamReader<'a> {
355 fn read(&mut self) -> Result<DeclSecurityTableOffset> {
356 self.read_table_offset(self.header.table_locations.decl_security)
357 .map(DeclSecurityTableOffset)
358 }
359}
360
361impl TableOffsetSize for DeclSecurityTableOffset {
362 fn table_offset_size(rows: &TableRows) -> ValueSize {
363 rows.decl_security.row_size()
364 }
365}
366
367#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
368#[repr(transparent)]
369pub struct ClassLayoutTableOffset(pub u32);
370
371impl<'a> ReadData<ClassLayoutTableOffset> for TablesStreamReader<'a> {
372 fn read(&mut self) -> Result<ClassLayoutTableOffset> {
373 self.read_table_offset(self.header.table_locations.class_layout)
374 .map(ClassLayoutTableOffset)
375 }
376}
377
378impl TableOffsetSize for ClassLayoutTableOffset {
379 fn table_offset_size(rows: &TableRows) -> ValueSize {
380 rows.class_layout.row_size()
381 }
382}
383
384#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
385#[repr(transparent)]
386pub struct FieldLayoutTableOffset(pub u32);
387
388impl<'a> ReadData<FieldLayoutTableOffset> for TablesStreamReader<'a> {
389 fn read(&mut self) -> Result<FieldLayoutTableOffset> {
390 self.read_table_offset(self.header.table_locations.field_layout)
391 .map(FieldLayoutTableOffset)
392 }
393}
394
395impl TableOffsetSize for FieldLayoutTableOffset {
396 fn table_offset_size(rows: &TableRows) -> ValueSize {
397 rows.field_layout.row_size()
398 }
399}
400
401#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
402#[repr(transparent)]
403pub struct StandAloneSigTableOffset(pub u32);
404
405impl<'a> ReadData<StandAloneSigTableOffset> for TablesStreamReader<'a> {
406 fn read(&mut self) -> Result<StandAloneSigTableOffset> {
407 self.read_table_offset(self.header.table_locations.stand_alone_sig)
408 .map(StandAloneSigTableOffset)
409 }
410}
411
412impl TableOffsetSize for StandAloneSigTableOffset {
413 fn table_offset_size(rows: &TableRows) -> ValueSize {
414 rows.stand_alone_sig.row_size()
415 }
416}
417
418#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
419#[repr(transparent)]
420pub struct EventMapTableOffset(pub u32);
421
422impl<'a> ReadData<EventMapTableOffset> for TablesStreamReader<'a> {
423 fn read(&mut self) -> Result<EventMapTableOffset> {
424 self.read_table_offset(self.header.table_locations.event_map)
425 .map(EventMapTableOffset)
426 }
427}
428
429impl TableOffsetSize for EventMapTableOffset {
430 fn table_offset_size(rows: &TableRows) -> ValueSize {
431 rows.event_map.row_size()
432 }
433}
434
435#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
436#[repr(transparent)]
437pub struct EventPtrTableOffset(pub u32);
438
439impl<'a> ReadData<EventPtrTableOffset> for TablesStreamReader<'a> {
440 fn read(&mut self) -> Result<EventPtrTableOffset> {
441 self.read_table_offset(self.header.table_locations.event_ptr)
442 .map(EventPtrTableOffset)
443 }
444}
445
446impl TableOffsetSize for EventPtrTableOffset {
447 fn table_offset_size(rows: &TableRows) -> ValueSize {
448 rows.event_ptr.row_size()
449 }
450}
451
452#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
453#[repr(transparent)]
454pub struct EventTableOffset(pub u32);
455
456impl<'a> ReadData<EventTableOffset> for TablesStreamReader<'a> {
457 fn read(&mut self) -> Result<EventTableOffset> {
458 self.read_table_offset(self.header.table_locations.event)
459 .map(EventTableOffset)
460 }
461}
462
463impl TableOffsetSize for EventTableOffset {
464 fn table_offset_size(rows: &TableRows) -> ValueSize {
465 rows.event.row_size()
466 }
467}
468
469#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
470#[repr(transparent)]
471pub struct PropertyMapTableOffset(pub u32);
472
473impl<'a> ReadData<PropertyMapTableOffset> for TablesStreamReader<'a> {
474 fn read(&mut self) -> Result<PropertyMapTableOffset> {
475 self.read_table_offset(self.header.table_locations.property_map)
476 .map(PropertyMapTableOffset)
477 }
478}
479
480impl TableOffsetSize for PropertyMapTableOffset {
481 fn table_offset_size(rows: &TableRows) -> ValueSize {
482 rows.property_map.row_size()
483 }
484}
485
486#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
487#[repr(transparent)]
488pub struct PropertyPtrTableOffset(pub u32);
489
490impl<'a> ReadData<PropertyPtrTableOffset> for TablesStreamReader<'a> {
491 fn read(&mut self) -> Result<PropertyPtrTableOffset> {
492 self.read_table_offset(self.header.table_locations.property_ptr)
493 .map(PropertyPtrTableOffset)
494 }
495}
496
497impl TableOffsetSize for PropertyPtrTableOffset {
498 fn table_offset_size(rows: &TableRows) -> ValueSize {
499 rows.property_ptr.row_size()
500 }
501}
502
503#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
504#[repr(transparent)]
505pub struct PropertyTableOffset(pub u32);
506
507impl<'a> ReadData<PropertyTableOffset> for TablesStreamReader<'a> {
508 fn read(&mut self) -> Result<PropertyTableOffset> {
509 self.read_table_offset(self.header.table_locations.property)
510 .map(PropertyTableOffset)
511 }
512}
513
514impl TableOffsetSize for PropertyTableOffset {
515 fn table_offset_size(rows: &TableRows) -> ValueSize {
516 rows.property.row_size()
517 }
518}
519
520#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
521#[repr(transparent)]
522pub struct MethodSemanticsTableOffset(pub u32);
523
524impl<'a> ReadData<MethodSemanticsTableOffset> for TablesStreamReader<'a> {
525 fn read(&mut self) -> Result<MethodSemanticsTableOffset> {
526 self.read_table_offset(self.header.table_locations.method_semantics)
527 .map(MethodSemanticsTableOffset)
528 }
529}
530
531impl TableOffsetSize for MethodSemanticsTableOffset {
532 fn table_offset_size(rows: &TableRows) -> ValueSize {
533 rows.method_semantics.row_size()
534 }
535}
536
537#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
538#[repr(transparent)]
539pub struct MethodImplTableOffset(pub u32);
540
541impl<'a> ReadData<MethodImplTableOffset> for TablesStreamReader<'a> {
542 fn read(&mut self) -> Result<MethodImplTableOffset> {
543 self.read_table_offset(self.header.table_locations.method_impl)
544 .map(MethodImplTableOffset)
545 }
546}
547
548impl TableOffsetSize for MethodImplTableOffset {
549 fn table_offset_size(rows: &TableRows) -> ValueSize {
550 rows.method_impl.row_size()
551 }
552}
553
554#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
555#[repr(transparent)]
556pub struct ModuleRefTableOffset(pub u32);
557
558impl<'a> ReadData<ModuleRefTableOffset> for TablesStreamReader<'a> {
559 fn read(&mut self) -> Result<ModuleRefTableOffset> {
560 self.read_table_offset(self.header.table_locations.module_ref)
561 .map(ModuleRefTableOffset)
562 }
563}
564
565impl TableOffsetSize for ModuleRefTableOffset {
566 fn table_offset_size(rows: &TableRows) -> ValueSize {
567 rows.module_ref.row_size()
568 }
569}
570
571#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
572#[repr(transparent)]
573pub struct TypeSpecTableOffset(pub u32);
574
575impl<'a> ReadData<TypeSpecTableOffset> for TablesStreamReader<'a> {
576 fn read(&mut self) -> Result<TypeSpecTableOffset> {
577 self.read_table_offset(self.header.table_locations.type_spec)
578 .map(TypeSpecTableOffset)
579 }
580}
581
582impl TableOffsetSize for TypeSpecTableOffset {
583 fn table_offset_size(rows: &TableRows) -> ValueSize {
584 rows.type_spec.row_size()
585 }
586}
587
588#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
589#[repr(transparent)]
590pub struct ImplMapTableOffset(pub u32);
591
592impl<'a> ReadData<ImplMapTableOffset> for TablesStreamReader<'a> {
593 fn read(&mut self) -> Result<ImplMapTableOffset> {
594 self.read_table_offset(self.header.table_locations.impl_map)
595 .map(ImplMapTableOffset)
596 }
597}
598
599impl TableOffsetSize for ImplMapTableOffset {
600 fn table_offset_size(rows: &TableRows) -> ValueSize {
601 rows.impl_map.row_size()
602 }
603}
604
605#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
606#[repr(transparent)]
607pub struct FieldRVATableOffset(pub u32);
608
609impl<'a> ReadData<FieldRVATableOffset> for TablesStreamReader<'a> {
610 fn read(&mut self) -> Result<FieldRVATableOffset> {
611 self.read_table_offset(self.header.table_locations.field_rva)
612 .map(FieldRVATableOffset)
613 }
614}
615
616impl TableOffsetSize for FieldRVATableOffset {
617 fn table_offset_size(rows: &TableRows) -> ValueSize {
618 rows.field_rva.row_size()
619 }
620}
621
622#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
623#[repr(transparent)]
624pub struct ENCLogTableOffset(pub u32);
625
626impl<'a> ReadData<ENCLogTableOffset> for TablesStreamReader<'a> {
627 fn read(&mut self) -> Result<ENCLogTableOffset> {
628 self.read_table_offset(self.header.table_locations.enc_log)
629 .map(ENCLogTableOffset)
630 }
631}
632
633impl TableOffsetSize for ENCLogTableOffset {
634 fn table_offset_size(rows: &TableRows) -> ValueSize {
635 rows.enc_log.row_size()
636 }
637}
638
639#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
640#[repr(transparent)]
641pub struct ENCMapTableOffset(pub u32);
642
643impl<'a> ReadData<ENCMapTableOffset> for TablesStreamReader<'a> {
644 fn read(&mut self) -> Result<ENCMapTableOffset> {
645 self.read_table_offset(self.header.table_locations.enc_map)
646 .map(ENCMapTableOffset)
647 }
648}
649
650impl TableOffsetSize for ENCMapTableOffset {
651 fn table_offset_size(rows: &TableRows) -> ValueSize {
652 rows.enc_map.row_size()
653 }
654}
655
656#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
657#[repr(transparent)]
658pub struct AssemblyTableOffset(pub u32);
659
660impl<'a> ReadData<AssemblyTableOffset> for TablesStreamReader<'a> {
661 fn read(&mut self) -> Result<AssemblyTableOffset> {
662 self.read_table_offset(self.header.table_locations.assembly)
663 .map(AssemblyTableOffset)
664 }
665}
666
667impl TableOffsetSize for AssemblyTableOffset {
668 fn table_offset_size(rows: &TableRows) -> ValueSize {
669 rows.assembly.row_size()
670 }
671}
672
673#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
674#[repr(transparent)]
675pub struct AssemblyProcessorTableOffset(pub u32);
676
677impl<'a> ReadData<AssemblyProcessorTableOffset> for TablesStreamReader<'a> {
678 fn read(&mut self) -> Result<AssemblyProcessorTableOffset> {
679 self.read_table_offset(self.header.table_locations.assembly_processor)
680 .map(AssemblyProcessorTableOffset)
681 }
682}
683
684impl TableOffsetSize for AssemblyProcessorTableOffset {
685 fn table_offset_size(rows: &TableRows) -> ValueSize {
686 rows.assembly_processor.row_size()
687 }
688}
689
690#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
691#[repr(transparent)]
692pub struct AssemblyOSTableOffset(pub u32);
693
694impl<'a> ReadData<AssemblyOSTableOffset> for TablesStreamReader<'a> {
695 fn read(&mut self) -> Result<AssemblyOSTableOffset> {
696 self.read_table_offset(self.header.table_locations.assembly_os)
697 .map(AssemblyOSTableOffset)
698 }
699}
700
701impl TableOffsetSize for AssemblyOSTableOffset {
702 fn table_offset_size(rows: &TableRows) -> ValueSize {
703 rows.assembly_os.row_size()
704 }
705}
706
707#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
708#[repr(transparent)]
709pub struct AssemblyRefTableOffset(pub u32);
710
711impl<'a> ReadData<AssemblyRefTableOffset> for TablesStreamReader<'a> {
712 fn read(&mut self) -> Result<AssemblyRefTableOffset> {
713 self.read_table_offset(self.header.table_locations.assembly_ref)
714 .map(AssemblyRefTableOffset)
715 }
716}
717
718impl TableOffsetSize for AssemblyRefTableOffset {
719 fn table_offset_size(rows: &TableRows) -> ValueSize {
720 rows.assembly_ref.row_size()
721 }
722}
723
724#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
725#[repr(transparent)]
726pub struct AssemblyRefProcessorTableOffset(pub u32);
727
728impl<'a> ReadData<AssemblyRefProcessorTableOffset> for TablesStreamReader<'a> {
729 fn read(&mut self) -> Result<AssemblyRefProcessorTableOffset> {
730 self.read_table_offset(self.header.table_locations.assembly_ref_processor)
731 .map(AssemblyRefProcessorTableOffset)
732 }
733}
734
735impl TableOffsetSize for AssemblyRefProcessorTableOffset {
736 fn table_offset_size(rows: &TableRows) -> ValueSize {
737 rows.assembly_ref_processor.row_size()
738 }
739}
740
741#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
742#[repr(transparent)]
743pub struct AssemblyRefOSTableOffset(pub u32);
744
745impl<'a> ReadData<AssemblyRefOSTableOffset> for TablesStreamReader<'a> {
746 fn read(&mut self) -> Result<AssemblyRefOSTableOffset> {
747 self.read_table_offset(self.header.table_locations.assembly_ref_os)
748 .map(AssemblyRefOSTableOffset)
749 }
750}
751
752impl TableOffsetSize for AssemblyRefOSTableOffset {
753 fn table_offset_size(rows: &TableRows) -> ValueSize {
754 rows.assembly_ref_os.row_size()
755 }
756}
757
758#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
759#[repr(transparent)]
760pub struct FileTableOffset(pub u32);
761
762impl<'a> ReadData<FileTableOffset> for TablesStreamReader<'a> {
763 fn read(&mut self) -> Result<FileTableOffset> {
764 self.read_table_offset(self.header.table_locations.file)
765 .map(FileTableOffset)
766 }
767}
768
769impl TableOffsetSize for FileTableOffset {
770 fn table_offset_size(rows: &TableRows) -> ValueSize {
771 rows.file.row_size()
772 }
773}
774
775#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
776#[repr(transparent)]
777pub struct ExportedTypeTableOffset(pub u32);
778
779impl<'a> ReadData<ExportedTypeTableOffset> for TablesStreamReader<'a> {
780 fn read(&mut self) -> Result<ExportedTypeTableOffset> {
781 self.read_table_offset(self.header.table_locations.exported_type)
782 .map(ExportedTypeTableOffset)
783 }
784}
785
786impl TableOffsetSize for ExportedTypeTableOffset {
787 fn table_offset_size(rows: &TableRows) -> ValueSize {
788 rows.exported_type.row_size()
789 }
790}
791
792#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
793#[repr(transparent)]
794pub struct ManifestResourceTableOffset(pub u32);
795
796impl<'a> ReadData<ManifestResourceTableOffset> for TablesStreamReader<'a> {
797 fn read(&mut self) -> Result<ManifestResourceTableOffset> {
798 self.read_table_offset(self.header.table_locations.manifest_resource)
799 .map(ManifestResourceTableOffset)
800 }
801}
802
803impl TableOffsetSize for ManifestResourceTableOffset {
804 fn table_offset_size(rows: &TableRows) -> ValueSize {
805 rows.manifest_resource.row_size()
806 }
807}
808
809#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
810#[repr(transparent)]
811pub struct NestedClassTableOffset(pub u32);
812
813impl<'a> ReadData<NestedClassTableOffset> for TablesStreamReader<'a> {
814 fn read(&mut self) -> Result<NestedClassTableOffset> {
815 self.read_table_offset(self.header.table_locations.nested_class)
816 .map(NestedClassTableOffset)
817 }
818}
819
820impl TableOffsetSize for NestedClassTableOffset {
821 fn table_offset_size(rows: &TableRows) -> ValueSize {
822 rows.nested_class.row_size()
823 }
824}
825
826#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
827#[repr(transparent)]
828pub struct GenericParamTableOffset(pub u32);
829
830impl<'a> ReadData<GenericParamTableOffset> for TablesStreamReader<'a> {
831 fn read(&mut self) -> Result<GenericParamTableOffset> {
832 self.read_table_offset(self.header.table_locations.generic_param)
833 .map(GenericParamTableOffset)
834 }
835}
836
837impl TableOffsetSize for GenericParamTableOffset {
838 fn table_offset_size(rows: &TableRows) -> ValueSize {
839 rows.generic_param.row_size()
840 }
841}
842
843#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
844#[repr(transparent)]
845pub struct MethodSpecTableOffset(pub u32);
846
847impl<'a> ReadData<MethodSpecTableOffset> for TablesStreamReader<'a> {
848 fn read(&mut self) -> Result<MethodSpecTableOffset> {
849 self.read_table_offset(self.header.table_locations.method_spec)
850 .map(MethodSpecTableOffset)
851 }
852}
853
854impl TableOffsetSize for MethodSpecTableOffset {
855 fn table_offset_size(rows: &TableRows) -> ValueSize {
856 rows.method_spec.row_size()
857 }
858}
859
860#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
861#[repr(transparent)]
862pub struct GenericParamConstraintTableOffset(pub u32);
863
864impl<'a> ReadData<GenericParamConstraintTableOffset> for TablesStreamReader<'a> {
865 fn read(&mut self) -> Result<GenericParamConstraintTableOffset> {
866 self.read_table_offset(self.header.table_locations.generic_param_constraint)
867 .map(GenericParamConstraintTableOffset)
868 }
869}
870
871impl TableOffsetSize for GenericParamConstraintTableOffset {
872 fn table_offset_size(rows: &TableRows) -> ValueSize {
873 rows.generic_param_constraint.row_size()
874 }
875}
876
877#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
878#[repr(transparent)]
879pub struct DocumentTableRowOffset(pub u32);
880
881impl<'a> ReadData<DocumentTableRowOffset> for TablesStreamReader<'a> {
882 fn read(&mut self) -> Result<DocumentTableRowOffset> {
883 self.read_table_offset(self.header.table_locations.generic_param)
884 .map(DocumentTableRowOffset)
885 }
886}
887
888impl TableOffsetSize for DocumentTableRowOffset {
889 fn table_offset_size(rows: &TableRows) -> ValueSize {
890 rows.document.row_size()
891 }
892}
893
894#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
895#[repr(transparent)]
896pub struct MethodDebugInformationTableOffset(pub u32);
897
898impl<'a> ReadData<MethodDebugInformationTableOffset> for TablesStreamReader<'a> {
899 fn read(&mut self) -> Result<MethodDebugInformationTableOffset> {
900 self.read_table_offset(self.header.table_locations.method_debug_information)
901 .map(MethodDebugInformationTableOffset)
902 }
903}
904
905impl TableOffsetSize for MethodDebugInformationTableOffset {
906 fn table_offset_size(rows: &TableRows) -> ValueSize {
907 rows.method_debug_information.row_size()
908 }
909}
910
911#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
912#[repr(transparent)]
913pub struct LocalScopeTableOffset(pub u32);
914
915impl<'a> ReadData<LocalScopeTableOffset> for TablesStreamReader<'a> {
916 fn read(&mut self) -> Result<LocalScopeTableOffset> {
917 self.read_table_offset(self.header.table_locations.local_scope)
918 .map(LocalScopeTableOffset)
919 }
920}
921
922impl TableOffsetSize for LocalScopeTableOffset {
923 fn table_offset_size(rows: &TableRows) -> ValueSize {
924 rows.local_scope.row_size()
925 }
926}
927
928#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
929#[repr(transparent)]
930pub struct LocalVariableTableOffset(pub u32);
931
932impl<'a> ReadData<LocalVariableTableOffset> for TablesStreamReader<'a> {
933 fn read(&mut self) -> Result<LocalVariableTableOffset> {
934 self.read_table_offset(self.header.table_locations.local_variable)
935 .map(LocalVariableTableOffset)
936 }
937}
938
939impl TableOffsetSize for LocalVariableTableOffset {
940 fn table_offset_size(rows: &TableRows) -> ValueSize {
941 rows.local_variable.row_size()
942 }
943}
944
945#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
946#[repr(transparent)]
947pub struct LocalConstantTableOffset(pub u32);
948
949impl<'a> ReadData<LocalConstantTableOffset> for TablesStreamReader<'a> {
950 fn read(&mut self) -> Result<LocalConstantTableOffset> {
951 self.read_table_offset(self.header.table_locations.local_constant)
952 .map(LocalConstantTableOffset)
953 }
954}
955
956impl TableOffsetSize for LocalConstantTableOffset {
957 fn table_offset_size(rows: &TableRows) -> ValueSize {
958 rows.local_constant.row_size()
959 }
960}
961
962#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
963#[repr(transparent)]
964pub struct ImportScopeTableOffset(pub u32);
965
966impl<'a> ReadData<ImportScopeTableOffset> for TablesStreamReader<'a> {
967 fn read(&mut self) -> Result<ImportScopeTableOffset> {
968 self.read_table_offset(self.header.table_locations.import_scope)
969 .map(ImportScopeTableOffset)
970 }
971}
972
973impl TableOffsetSize for ImportScopeTableOffset {
974 fn table_offset_size(rows: &TableRows) -> ValueSize {
975 rows.import_scope.row_size()
976 }
977}
978
979#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
980#[repr(transparent)]
981pub struct StateMachineMethodTableOffset(pub u32);
982
983impl<'a> ReadData<StateMachineMethodTableOffset> for TablesStreamReader<'a> {
984 fn read(&mut self) -> Result<StateMachineMethodTableOffset> {
985 self.read_table_offset(self.header.table_locations.state_machine_method)
986 .map(StateMachineMethodTableOffset)
987 }
988}
989
990impl TableOffsetSize for StateMachineMethodTableOffset {
991 fn table_offset_size(rows: &TableRows) -> ValueSize {
992 rows.state_machine_method.row_size()
993 }
994}
995
996#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
997#[repr(transparent)]
998pub struct CustomDebugInformationTableOffset(pub u32);
999
1000impl<'a> ReadData<CustomDebugInformationTableOffset> for TablesStreamReader<'a> {
1001 fn read(&mut self) -> Result<CustomDebugInformationTableOffset> {
1002 self.read_table_offset(self.header.table_locations.custom_debug_information)
1003 .map(CustomDebugInformationTableOffset)
1004 }
1005}
1006
1007impl TableOffsetSize for CustomDebugInformationTableOffset {
1008 fn table_offset_size(rows: &TableRows) -> ValueSize {
1009 rows.custom_debug_information.row_size()
1010 }
1011}