use rustc_hash::FxHashMap;
use crate::base::node::SymbolId;
pub struct SymbolTable {
names: Vec<String>,
assumptions: Vec<crate::base::assumptions::Assumptions>,
lookup: FxHashMap<String, SymbolId>,
}
impl Default for SymbolTable {
fn default() -> Self {
Self::new()
}
}
impl SymbolTable {
pub fn new() -> Self {
Self {
names: Vec::new(),
assumptions: Vec::new(),
lookup: FxHashMap::default(),
}
}
pub fn intern(&mut self, name: &str) -> SymbolId {
if let Some(&id) = self.lookup.get(name) {
return id;
}
let id = SymbolId(
u32::try_from(self.names.len())
.expect("symbol table overflow: more than 4 billion symbols"),
);
self.names.push(name.to_owned());
self.assumptions
.push(crate::base::assumptions::Assumptions {
known_true: crate::base::assumptions::Props::empty(),
known_false: crate::base::assumptions::Props::empty(),
});
self.lookup.insert(name.to_owned(), id);
id
}
pub fn name(&self, id: SymbolId) -> &str {
&self.names[id.0 as usize]
}
pub fn len(&self) -> usize {
self.names.len()
}
pub fn set_assumptions(&mut self, id: SymbolId, a: crate::base::assumptions::Assumptions) {
self.assumptions[id.0 as usize] = a;
}
pub fn get_assumptions(&self, id: SymbolId) -> crate::base::assumptions::Assumptions {
self.assumptions[id.0 as usize]
}
}