use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::{Arc, OnceLock};
use super::Id;
static NAMED: AtomicUsize = AtomicUsize::new(0);
fn table() -> &'static kovan_map::HashMap<u64, Arc<str>> {
static TABLE: OnceLock<kovan_map::HashMap<u64, Arc<str>>> = OnceLock::new();
TABLE.get_or_init(|| kovan_map::HashMap::with_capacity(64))
}
pub(crate) fn set(id: Id, name: &str) {
NAMED.fetch_add(1, Ordering::Relaxed);
if table().insert(id.0.get(), Arc::from(name)).is_some() {
NAMED.fetch_sub(1, Ordering::Relaxed);
}
}
pub(crate) fn get(id: Id) -> Option<Arc<str>> {
if NAMED.load(Ordering::Relaxed) == 0 {
return None;
}
table().get(&id.0.get())
}
#[inline]
pub(super) fn forget(id: Id) {
if NAMED.load(Ordering::Relaxed) != 0 {
forget_named(id);
}
}
#[inline(never)]
fn forget_named(id: Id) {
if table().remove(&id.0.get()).is_some() {
NAMED.fetch_sub(1, Ordering::Relaxed);
}
}
#[cfg(test)]
pub(crate) fn count() -> usize {
NAMED.load(Ordering::Relaxed)
}