yog_data/model/atom/
local.rs1use super::{HashMap, OnceLock, RwLock};
3
4#[derive(Default)]
5struct Names {
6 numbers: HashMap<&'static str, u32>,
7 names: Vec<&'static str>,
8}
9
10static NAMES: OnceLock<RwLock<Names>> = OnceLock::new();
11
12fn names() -> &'static RwLock<Names> {
13 NAMES.get_or_init(Default::default)
14}
15
16pub fn intern(name: &str) -> u32 {
18 if let Some(&n) = names().read().numbers.get(name) {
19 return n;
20 }
21 let mut t = names().write();
22 if let Some(&n) = t.numbers.get(name) {
23 return n;
24 }
25 let kept: &'static str = Box::leak(name.into());
26 let n = u32::try_from(t.names.len()).unwrap_or(u32::MAX);
27 t.names.push(kept);
28 t.numbers.insert(kept, n);
29 n
30}
31
32pub fn name(n: u32) -> Option<&'static str> {
33 names().read().names.get(n as usize).copied()
34}