| #[repr(C)] |
| #[derive(Default)] |
| pub struct METADATA_HEADER { |
| pub signature: u32, |
| pub major_version: u16, |
| pub minor_version: u16, |
| pub reserved: u32, |
| pub length: u32, |
| pub version: [u8; 20], |
| pub flags: u16, |
| pub streams: u16, |
| } |
| |
| pub const METADATA_SIGNATURE: u32 = 0x424A_5342; |
| |
| /// A coded index (see codes.rs) is a table index that may refer to different tables. The size of the column in memory |
| /// must therefore be large enough to hold an index for a row in the largest possible table. This function determines |
| /// this size for the given winmd file. |
| pub fn coded_index_size(tables: &[usize]) -> usize { |
| fn small(row_count: usize, bits: u8) -> bool { |
| (row_count as u64) < (1u64 << (16 - bits)) |
| } |
| |
| fn bits_needed(value: usize) -> u8 { |
| let mut value = value - 1; |
| let mut bits: u8 = 1; |
| while { |
| value >>= 1; |
| value != 0 |
| } { |
| bits += 1; |
| } |
| bits |
| } |
| |
| let bits_needed = bits_needed(tables.len()); |
| |
| if tables.iter().all(|table| small(*table, bits_needed)) { |
| 2 |
| } else { |
| 4 |
| } |
| } |