use crate::{ types::{FuncSig, Map, SigIndex, MapIndex}, vm, }; use hashbrown::HashMap; pub struct SigRegistry { func_table: HashMap, sig_assoc: Map, } impl SigRegistry { pub fn new() -> Self { Self { func_table: HashMap::new(), sig_assoc: Map::new(), } } pub fn register(&mut self, func_sig: FuncSig) -> SigIndex { let func_table = &mut self.func_table; let sig_assoc = &mut self.sig_assoc; *func_table.entry(func_sig.clone()).or_insert_with(|| { sig_assoc.push(func_sig) }) } pub fn lookup_func_sig(&self, sig_index: SigIndex) -> &FuncSig { &self.sig_assoc[sig_index] } pub(crate) fn into_vm_sigid(&self) -> Box<[vm::SigId]> { let v: Vec<_> = self.sig_assoc.iter().map(|(sig_index, _)| vm::SigId(sig_index.index() as u32)).collect(); v.into_boxed_slice() } }