Improve identifier cache

This commit is contained in:
Jeff 2024-08-08 14:58:12 -04:00
parent d5d51e9849
commit 1c24286696

View File

@ -1,5 +1,5 @@
use std::{ use std::{
collections::HashMap, collections::HashSet,
fmt::{self, Display, Formatter}, fmt::{self, Display, Formatter},
hash::Hash, hash::Hash,
sync::{Arc, OnceLock, RwLock}, sync::{Arc, OnceLock, RwLock},
@ -7,26 +7,26 @@ use std::{
use serde::{de::Visitor, Deserialize, Serialize}; use serde::{de::Visitor, Deserialize, Serialize};
static IDENTIFIER_CACHE: OnceLock<RwLock<HashMap<String, Identifier>>> = OnceLock::new(); static IDENTIFIER_CACHE: OnceLock<RwLock<HashSet<Identifier>>> = OnceLock::new();
fn identifier_cache<'a>() -> &'a RwLock<HashMap<String, Identifier>> { fn identifier_cache<'a>() -> &'a RwLock<HashSet<Identifier>> {
IDENTIFIER_CACHE.get_or_init(|| RwLock::new(HashMap::new())) IDENTIFIER_CACHE.get_or_init(|| RwLock::new(HashSet::new()))
} }
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)] #[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Hash)]
pub struct Identifier(Arc<String>); pub struct Identifier(Arc<String>);
impl Identifier { impl Identifier {
pub fn new(text: &str) -> Self { pub fn new<T: ToString>(text: T) -> Self {
let cache = identifier_cache(); let cache = identifier_cache();
if let Some(identifier) = cache.read().unwrap().get(text).cloned() {
return identifier;
}
let new = Identifier(Arc::new(text.to_string())); let new = Identifier(Arc::new(text.to_string()));
cache.write().unwrap().insert(text.to_string(), new.clone()); if let Some(identifier) = cache.read().unwrap().get(&new).cloned() {
return identifier;
}
cache.write().unwrap().insert(new.clone());
new new
} }