use crate::ir;
use std::collections::{HashMap, HashSet};
#[derive(Clone, Debug)]
pub struct NameGenerator {
name_hash: HashMap<String, i64>,
generated_names: HashSet<String>,
}
impl NameGenerator {
pub fn with_prev_defined_names(names: HashSet<String>) -> Self {
NameGenerator {
generated_names: names,
name_hash: HashMap::default(),
}
}
pub fn gen_name<S>(&mut self, prefix: S) -> ir::Id
where
S: Into<ir::Id> + ToString + Clone,
{
let mut cur_prefix: ir::Id = prefix.into();
loop {
let count = self
.name_hash
.entry(cur_prefix.to_string())
.and_modify(|v| *v += 1)
.or_insert(-1);
let name = if *count == -1 {
cur_prefix
} else {
ir::Id::from(cur_prefix.to_string() + &count.to_string())
};
if !self.generated_names.contains(&name.id) {
self.generated_names.insert(name.to_string());
return name;
}
cur_prefix = name;
}
}
}