diff options
Diffstat (limited to 'src/bindgen/declarationtyperesolver.rs')
-rw-r--r-- | src/bindgen/declarationtyperesolver.rs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/bindgen/declarationtyperesolver.rs b/src/bindgen/declarationtyperesolver.rs new file mode 100644 index 0000000..e72761e --- /dev/null +++ b/src/bindgen/declarationtyperesolver.rs @@ -0,0 +1,57 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use crate::bindgen::ir::Path; +use std::collections::hash_map::Entry; +use std::collections::HashMap; + +impl DeclarationType { + pub fn to_str(self) -> &'static str { + match self { + DeclarationType::Struct => "struct", + DeclarationType::Enum => "enum", + DeclarationType::Union => "union", + } + } +} + +#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)] +pub enum DeclarationType { + Struct, + Enum, + Union, +} + +#[derive(Default)] +pub struct DeclarationTypeResolver { + types: HashMap<Path, Option<DeclarationType>>, +} + +impl DeclarationTypeResolver { + fn insert(&mut self, path: &Path, ty: Option<DeclarationType>) { + if let Entry::Vacant(vacant_entry) = self.types.entry(path.clone()) { + vacant_entry.insert(ty); + } + } + + pub fn add_enum(&mut self, path: &Path) { + self.insert(path, Some(DeclarationType::Enum)); + } + + pub fn add_struct(&mut self, path: &Path) { + self.insert(path, Some(DeclarationType::Struct)); + } + + pub fn add_union(&mut self, path: &Path) { + self.insert(path, Some(DeclarationType::Union)); + } + + pub fn add_none(&mut self, path: &Path) { + self.insert(path, None); + } + + pub fn type_for(&self, path: &Path) -> Option<DeclarationType> { + *self.types.get(path)? + } +} |