pub struct Interner<T, B = <T as DefaultBackendBuilder>::Backend, H = RandomState>{ /* private fields */ }Expand description
Interner
This struct is responsible for tracking objects and interning them.
§Example
use interns::*;
let mut interner = Interner::<str>::default();
let a = interner.get_or_intern("hello");
let b = interner.get_or_intern("world");
let c = interner.get_or_intern("hello");
let a_resolv = interner.resolve(a);
let b_resolv = interner.resolve(b);
let c_resolv = interner.resolve(c);
assert_eq!(a_resolv, Some("hello"));
assert_eq!(b_resolv, Some("world"));
assert_eq!(c_resolv, Some("hello"));
assert_eq!(a, c);
assert_ne!(a, b);
assert_ne!(b, c);Implementations§
Source§impl<T, B, H> Interner<T, B, H>
impl<T, B, H> Interner<T, B, H>
Sourcepub fn new() -> Self
pub fn new() -> Self
Examples found in repository?
examples/string.rs (line 7)
6pub fn main() -> io::Result<()> {
7 let mut interner: Interner<str> = Interner::new();
8
9 let mut words = HashSet::new();
10 let mut line = String::new();
11 loop {
12 line.clear();
13 print!("> ");
14 stdout().flush()?;
15
16 stdin().read_line(&mut line)?;
17 let linet = line.trim();
18 if linet.is_empty() { break }
19 let sym = interner.get_or_intern(linet);
20 if words.contains(&sym) {
21 println!("String '{linet}' already interned as {sym:?}");
22 } else {
23 words.insert(sym);
24 println!("'{linet}' = {sym:?}");
25 }
26 }
27
28 println!("\n== Interned symbols ==");
29 let mut syms = words.iter().collect::<Vec<_>>();
30 syms.sort();
31 for sym in syms {
32 let s = interner.resolve(*sym).unwrap();
33 println!("{sym:?} = '{s}'");
34 }
35
36 Ok(())
37}Sourcepub fn with_hasher(hasher: H) -> Selfwhere
B: Default,
pub fn with_hasher(hasher: H) -> Selfwhere
B: Default,
Sourcepub fn with_backend(backend: B) -> Selfwhere
H: Default,
pub fn with_backend(backend: B) -> Selfwhere
H: Default,
Sourcepub const fn with_backend_and_hasher(backend: B, hasher: H) -> Self
pub const fn with_backend_and_hasher(backend: B, hasher: H) -> Self
Sourcepub fn get_or_intern<Ref>(&mut self, src: &Ref) -> B::Symbol
pub fn get_or_intern<Ref>(&mut self, src: &Ref) -> B::Symbol
Gets the Symbol for src, interning it if it doesn’t exist.
§Example
use interns::Interner;
let mut interner = Interner::<str>::new();
let name = interner.get_or_intern("Abcd");
let name_again = interner.get_or_intern("Abcd");
assert_eq!(name, name_again);Examples found in repository?
examples/string.rs (line 19)
6pub fn main() -> io::Result<()> {
7 let mut interner: Interner<str> = Interner::new();
8
9 let mut words = HashSet::new();
10 let mut line = String::new();
11 loop {
12 line.clear();
13 print!("> ");
14 stdout().flush()?;
15
16 stdin().read_line(&mut line)?;
17 let linet = line.trim();
18 if linet.is_empty() { break }
19 let sym = interner.get_or_intern(linet);
20 if words.contains(&sym) {
21 println!("String '{linet}' already interned as {sym:?}");
22 } else {
23 words.insert(sym);
24 println!("'{linet}' = {sym:?}");
25 }
26 }
27
28 println!("\n== Interned symbols ==");
29 let mut syms = words.iter().collect::<Vec<_>>();
30 syms.sort();
31 for sym in syms {
32 let s = interner.resolve(*sym).unwrap();
33 println!("{sym:?} = '{s}'");
34 }
35
36 Ok(())
37}Sourcepub fn resolve(&self, sym: B::Symbol) -> Option<&T>
pub fn resolve(&self, sym: B::Symbol) -> Option<&T>
Resolves the symbol into a reference of T
§Example
use interns::Interner;
let mut interner = Interner::<str>::new();
let name = interner.get_or_intern("Abcd");
let resolved = interner.resolve(name);
assert_eq!(resolved, Some("Abcd"));Examples found in repository?
examples/string.rs (line 32)
6pub fn main() -> io::Result<()> {
7 let mut interner: Interner<str> = Interner::new();
8
9 let mut words = HashSet::new();
10 let mut line = String::new();
11 loop {
12 line.clear();
13 print!("> ");
14 stdout().flush()?;
15
16 stdin().read_line(&mut line)?;
17 let linet = line.trim();
18 if linet.is_empty() { break }
19 let sym = interner.get_or_intern(linet);
20 if words.contains(&sym) {
21 println!("String '{linet}' already interned as {sym:?}");
22 } else {
23 words.insert(sym);
24 println!("'{linet}' = {sym:?}");
25 }
26 }
27
28 println!("\n== Interned symbols ==");
29 let mut syms = words.iter().collect::<Vec<_>>();
30 syms.sort();
31 for sym in syms {
32 let s = interner.resolve(*sym).unwrap();
33 println!("{sym:?} = '{s}'");
34 }
35
36 Ok(())
37}Trait Implementations§
Auto Trait Implementations§
impl<T, B, H> Freeze for Interner<T, B, H>
impl<T, B, H> RefUnwindSafe for Interner<T, B, H>
impl<T, B, H> Send for Interner<T, B, H>
impl<T, B, H> Sync for Interner<T, B, H>
impl<T, B, H> Unpin for Interner<T, B, H>
impl<T, B, H> UnwindSafe for Interner<T, B, H>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more