tag | 168d1d52a032edf1dc04e67b6ec289ca57c69ba3 | |
---|---|---|
tagger | The Android Open Source Project <initial-contribution@android.com> | Wed Apr 12 14:25:09 2023 -0700 |
object | 9b7997db3597b129b0172f80ace31532da4cebab |
Android U Beta 1 GPL
commit | 9b7997db3597b129b0172f80ace31532da4cebab | [log] [tgz] |
---|---|---|
author | Matthew Maurer <mmaurer@google.com> | Thu Mar 09 15:13:08 2023 +0000 |
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | Thu Mar 09 15:13:08 2023 +0000 |
tree | b9732a1c26db90ebe03598eddae2c757483d6044 | |
parent | 98e40769d39769b0f1a9103bc60bf79d0e6deaf2 [diff] | |
parent | 1a1b0c2fea9e184bf99d90510055f7e46e540992 [diff] |
Make weak-table available to product and vendor am: 1a1b0c2fea Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/weak-table/+/2476532 Change-Id: I6b235a9afc2200ec10a2f2e7157da57e9e0f0e31 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This crate defines several kinds of weak hash maps and sets. See the full API documentation for details.
This crate supports Rust version 1.46 and later.
weak-table
is built with the std
feature, which enables functionality dependent on the std
library, enabled by default. Optionally, the following dependency may be enabled:
ahash
: use ahash
’s hasher rather than the std
hasherIf the std
feature is disabled (for no_std) then the ahash
dependency must be enabled.
Here we create a weak hash map and demonstrate that it forgets mappings whose keys expire:
use weak_table::WeakKeyHashMap; use std::sync::{Arc, Weak}; let mut table = <WeakKeyHashMap<Weak<str>, u32>>::new(); let one = Arc::<str>::from("one"); let two = Arc::<str>::from("two"); table.insert(one.clone(), 1); assert_eq!( table.get("one"), Some(&1) ); assert_eq!( table.get("two"), None ); table.insert(two.clone(), 2); *table.get_mut(&one).unwrap() += 10; assert_eq!( table.get("one"), Some(&11) ); assert_eq!( table.get("two"), Some(&2) ); drop(one); assert_eq!( table.get("one"), None ); assert_eq!( table.get("two"), Some(&2) );
Here we use a weak hash set to implement a simple string interning facility:
use weak_table::WeakHashSet; use std::ops::Deref; use std::rc::{Rc, Weak}; #[derive(Clone, Debug)] pub struct Symbol(Rc<str>); 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 } } #[derive(Debug, Default)] pub struct SymbolTable(WeakHashSet<Weak<str>>); 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) } } } #[test] 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); }