use yog_sync::atomic::{AtomicU32, Ordering};
pub type Address = u32;
pub const NO_ADDRESS: Address = u32::MAX;
pub fn resolve(name: &str) -> Address {
if name.is_empty() {
NO_ADDRESS
} else {
yog_data::Atom::new(name).number()
}
}
pub struct Cached(AtomicU32);
impl Cached {
const UNSET: u32 = NO_ADDRESS;
pub const fn new() -> Self {
Cached(AtomicU32::new(Self::UNSET))
}
pub fn get(&self, name: &str) -> Address {
let n = self.0.load(Ordering::Relaxed);
if n != Self::UNSET {
return n;
}
let n = resolve(name);
self.0.store(n, Ordering::Relaxed);
n
}
}
impl Default for Cached {
fn default() -> Self {
Self::new()
}
}
pub(crate) fn of(cached: &Cached, address: &'static str, key: Option<&str>) -> Address {
match key {
None => cached.get(address),
Some(key) => resolve(&crate::keyed(address, key)),
}
}