This crate defines several kinds of weak hash maps and sets. See the full API documentation for details.
This crate supports Rust version 1.32 and later.
Here we create a weak hash map and demonstrate that it forgets mappings whose keys expire:
```rust use weak_table::WeakKeyHashMap; use std::sync::{Arc, Weak};
let mut table =
table.insert(one.clone(), 1);
asserteq!( table.get("one"), Some(&1) ); asserteq!( table.get("two"), None );
table.insert(two.clone(), 2); *table.get_mut(&one).unwrap() += 10;
asserteq!( table.get("one"), Some(&11) ); asserteq!( table.get("two"), Some(&2) );
drop(one);
asserteq!( table.get("one"), None ); asserteq!( table.get("two"), Some(&2) ); ```
Here we use a weak hash set to implement a simple string interning facility:
```rust use weak_table::WeakHashSet; use std::ops::Deref; use std::rc::{Rc, Weak};
pub struct Symbol(Rc
impl PartialEq for Symbol { fn eq(&self, other: &Symbol) -> bool { Rc::ptr_eq(&self.0, &other.0) } }
impl Eq for Symbol {}
impl Deref for Symbol { type Target = str; fn deref(&self) -> &str { &self.0 } }
pub struct SymbolTable(WeakHashSet
impl SymbolTable { pub fn new() -> Self { Self::default() }
pub fn intern(&mut self, name: &str) -> Symbol {
if let Some(rc) = self.0.get(name) {
Symbol(rc)
} else {
let rc = Rc::<str>::from(name);
self.0.insert(Rc::clone(&rc));
Symbol(rc)
}
}
}
fn interning() { let mut tab = SymbolTable::new();
let a0 = tab.intern("a");
let a1 = tab.intern("a");
let b = tab.intern("b");
assert_eq!(a0, a1);
assert_ne!(a0, b);
} ```