diff options
Diffstat (limited to 'vendor/windows-metadata/src/writer/imp/references.rs')
-rw-r--r-- | vendor/windows-metadata/src/writer/imp/references.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/vendor/windows-metadata/src/writer/imp/references.rs b/vendor/windows-metadata/src/writer/imp/references.rs new file mode 100644 index 000000000..b35a8a275 --- /dev/null +++ b/vendor/windows-metadata/src/writer/imp/references.rs @@ -0,0 +1,36 @@ +use super::*; + +#[derive(Default)] +pub struct References<'a> { + map: BTreeMap<(&'a str, &'a str), Reference>, +} + +pub struct Reference { + pub index: u32, + pub value_type: bool, +} + +pub struct StagedReferences<'a>(References<'a>); + +impl<'a> References<'a> { + pub fn insert(&mut self, namespace: &'a str, name: &'a str, assemblies: &reader::Reader) { + self.map.entry((namespace, name)).or_insert_with(|| { + let type_def = assemblies.get(reader::TypeName::new(namespace, name)).next().expect("Type not found"); + let value_type = matches!(assemblies.type_def_kind(type_def), reader::TypeKind::Struct | reader::TypeKind::Enum); + Reference { value_type, index: 0 } + }); + } + + pub fn stage(mut self) -> StagedReferences<'a> { + for (index, value) in self.map.values_mut().enumerate() { + value.index = index as _; + } + StagedReferences(self) + } +} + +impl<'a> StagedReferences<'a> { + pub fn get(&'a self, namespace: &'a str, name: &'a str) -> Option<&'a Reference> { + self.0.map.get(&(namespace, name)) + } +} |