remove hashmap

This commit is contained in:
Folkert 2022-03-22 21:58:49 +01:00
parent 8d15e21ba6
commit a67bb29a36
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
5 changed files with 24 additions and 40 deletions

View file

@ -117,7 +117,7 @@ impl<'a> Env<'a> {
if module_id == self.home {
match self.ident_ids.get_id(&ident) {
Some(ident_id) => {
let symbol = Symbol::new(module_id, *ident_id);
let symbol = Symbol::new(module_id, ident_id);
self.qualified_lookups.insert(symbol);
@ -138,7 +138,7 @@ impl<'a> Env<'a> {
match self.dep_idents.get(&module_id) {
Some(exposed_ids) => match exposed_ids.get_id(&ident) {
Some(ident_id) => {
let symbol = Symbol::new(module_id, *ident_id);
let symbol = Symbol::new(module_id, ident_id);
self.qualified_lookups.insert(symbol);

View file

@ -244,7 +244,7 @@ impl Scope {
// when the value was exposed in the module header,
// use that existing IdentId. Otherwise, create a fresh one.
let ident_id = match exposed_ident_ids.get_id(&ident) {
Some(ident_id) => *ident_id,
Some(ident_id) => ident_id,
None => all_ident_ids.add(ident.clone().into()),
};

View file

@ -87,7 +87,7 @@ impl<'a> Env<'a> {
if module_id == self.home {
match self.ident_ids.get_id(&ident) {
Some(ident_id) => {
let symbol = Symbol::new(module_id, *ident_id);
let symbol = Symbol::new(module_id, ident_id);
if is_type_name {
self.qualified_type_lookups.insert(symbol);
@ -112,7 +112,7 @@ impl<'a> Env<'a> {
match self.dep_idents.get(&module_id) {
Some(exposed_ids) => match exposed_ids.get_id(&ident) {
Some(ident_id) => {
let symbol = Symbol::new(module_id, *ident_id);
let symbol = Symbol::new(module_id, ident_id);
if is_type_name {
self.qualified_type_lookups.insert(symbol);

View file

@ -203,7 +203,7 @@ impl Scope {
// when the value was exposed in the module header,
// use that existing IdentId. Otherwise, create a fresh one.
let ident_id = match exposed_ident_ids.get_id(&ident) {
Some(ident_id) => *ident_id,
Some(ident_id) => ident_id,
None => all_ident_ids.add(ident.clone()),
};

View file

@ -236,7 +236,7 @@ impl Interns {
match self.all_ident_ids.get(&module_id) {
Some(ident_ids) => match ident_ids.get_id(&ident) {
Some(ident_id) => Symbol::new(module_id, *ident_id),
Some(ident_id) => Symbol::new(module_id, ident_id),
None => {
panic!("Interns::symbol could not find ident entry for {:?} for module {:?} in Interns {:?}", ident, module_id, self);
}
@ -535,8 +535,6 @@ pub struct IdentId(u32);
/// Since these are interned strings, this shouldn't result in many total allocations in practice.
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct IdentIds {
by_ident: MutMap<Ident, IdentId>,
/// Each IdentId is an index into this Vec
by_id: Vec<Ident>,
@ -555,24 +553,18 @@ impl IdentIds {
let by_id = &mut self.by_id;
let ident_id = IdentId(by_id.len() as u32);
self.by_ident.insert(ident_name.clone(), ident_id);
by_id.push(ident_name);
ident_id
}
pub fn get_or_insert(&mut self, name: &Ident) -> IdentId {
use std::collections::hash_map::Entry;
match self.get_id(name) {
Some(id) => id,
None => {
let ident_id = IdentId(self.by_id.len() as u32);
match self.by_ident.entry(name.clone()) {
Entry::Occupied(occupied) => *occupied.get(),
Entry::Vacant(vacant) => {
let by_id = &mut self.by_id;
let ident_id = IdentId(by_id.len() as u32);
by_id.push(name.clone());
vacant.insert(ident_id);
self.by_id.push(name.clone());
ident_id
}
@ -588,14 +580,11 @@ impl IdentIds {
) -> Result<IdentId, String> {
let old_ident: Ident = old_ident_name.into();
let ident_id_ref_opt = self.by_ident.get(&old_ident);
let ident_id_ref_opt = self.get_id(&old_ident);
match ident_id_ref_opt {
Some(ident_id_ref) => {
let ident_id = *ident_id_ref;
self.by_ident.remove(&old_ident);
self.by_ident.insert(new_ident_name.into(), ident_id);
let ident_id = ident_id_ref;
let by_id = &mut self.by_id;
let key_index_opt = by_id.iter().position(|x| *x == old_ident);
@ -621,7 +610,7 @@ impl IdentIds {
}
None => Err(format!(
"Tried to update key in IdentIds ({:?}) but I could not find the key ({}).",
self.by_ident, old_ident_name
self.by_id, old_ident_name
)),
}
}
@ -648,8 +637,15 @@ impl IdentIds {
self.add(ident)
}
pub fn get_id(&self, ident_name: &Ident) -> Option<&IdentId> {
self.by_ident.get(ident_name)
#[inline(always)]
pub fn get_id(&self, ident_name: &Ident) -> Option<IdentId> {
for (id, ident) in self.idents() {
if ident_name == ident {
return Some(id);
}
}
None
}
pub fn get_name(&self, id: IdentId) -> Option<&Ident> {
@ -694,20 +690,8 @@ macro_rules! define_builtins {
$ident_name.into(),
)+
];
let mut by_ident = MutMap::with_capacity_and_hasher(by_id.len(), default_hasher());
$(
debug_assert!(by_ident.len() == $ident_id, "Error setting up Builtins: when inserting {} …: {:?} into module {} …: {:?} - this entry was assigned an ID of {}, but based on insertion order, it should have had an ID of {} instead! To fix this, change it from {} …: {:?} to {} …: {:?} instead.", $ident_id, $ident_name, $module_id, $module_name, $ident_id, by_ident.len(), $ident_id, $ident_name, by_ident.len(), $ident_name);
let exists = by_ident.insert($ident_name.into(), IdentId($ident_id));
if let Some(_) = exists {
debug_assert!(false, "Error setting up Builtins: when inserting {} …: {:?} into module {} …: {:?} - the Ident name {:?} is already present in the map. Check the map for duplicate ident names within the {:?} module!", $ident_id, $ident_name, $module_id, $module_name, $ident_name, $module_name);
}
)+
IdentIds {
by_ident,
by_id,
next_generated_name: 0,
}