use rustc_hash::FxHashMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct TargetId(pub u32);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct TestNameId(pub u32);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ActionId(pub u32);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct TargetHandle(pub i64);
#[derive(Debug, Default)]
pub struct TestNameInterner {
names: Vec<String>,
index: FxHashMap<String, TestNameId>,
}
impl TestNameInterner {
pub fn new() -> Self {
Self::default()
}
pub fn intern(&mut self, name: &str) -> TestNameId {
if let Some(id) = self.index.get(name) {
return *id;
}
let id = TestNameId(self.names.len() as u32);
self.names.push(name.to_owned());
self.index.insert(name.to_owned(), id);
id
}
pub fn resolve(&self, id: TestNameId) -> &str {
&self.names[id.0 as usize]
}
pub fn len(&self) -> usize {
self.names.len()
}
pub fn is_empty(&self) -> bool {
self.names.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn interner_roundtrips_and_dedups() {
let mut interner = TestNameInterner::new();
let a = interner.intern("mod::test_a");
let b = interner.intern("mod::test_b");
let a2 = interner.intern("mod::test_a");
assert_eq!(a, a2);
assert_ne!(a, b);
assert_eq!(interner.resolve(a), "mod::test_a");
assert_eq!(interner.resolve(b), "mod::test_b");
assert_eq!(interner.len(), 2);
}
}