yog_event/wire/
address.rs1use yog_sync::atomic::{AtomicU32, Ordering};
7
8pub type Address = u32;
10
11pub const NO_ADDRESS: Address = u32::MAX;
13
14pub fn resolve(name: &str) -> Address {
16 if name.is_empty() {
17 NO_ADDRESS
18 } else {
19 yog_data::Atom::new(name).number()
20 }
21}
22
23pub struct Cached(AtomicU32);
25
26impl Cached {
27 const UNSET: u32 = NO_ADDRESS;
29
30 pub const fn new() -> Self {
31 Cached(AtomicU32::new(Self::UNSET))
32 }
33
34 pub fn get(&self, name: &str) -> Address {
36 let n = self.0.load(Ordering::Relaxed);
37 if n != Self::UNSET {
38 return n;
39 }
40 let n = resolve(name);
41 self.0.store(n, Ordering::Relaxed);
42 n
43 }
44}
45
46impl Default for Cached {
47 fn default() -> Self {
48 Self::new()
49 }
50}
51
52pub(crate) fn of(cached: &Cached, address: &'static str, key: Option<&str>) -> Address {
55 match key {
56 None => cached.get(address),
57 Some(key) => resolve(&crate::keyed(address, key)),
58 }
59}