Interner

Struct Interner 

Source
pub struct Interner<T, B = <T as DefaultBackendBuilder>::Backend, H = RandomState>
where T: Hash + Eq + PartialEq + ?Sized, H: BuildHasher, B: Backend<T>,
{ /* 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>
where T: Hash + Eq + PartialEq + ?Sized, H: BuildHasher, B: Backend<T>,

Source

pub fn new() -> Self
where B: Default, H: Default,

Create a new Interner with a default backend and hasher

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}
Source

pub fn with_hasher(hasher: H) -> Self
where B: Default,

Create a new Interner with a default backend and the given hasher

Source

pub fn with_backend(backend: B) -> Self
where H: Default,

Create a new Interner with a default hasher and the given backend

Source

pub const fn with_backend_and_hasher(backend: B, hasher: H) -> Self

Create a new Interner with the given backend and hasher

Source

pub fn get_or_intern<Ref>(&mut self, src: &Ref) -> B::Symbol
where Ref: Internable<T, B> + ?Sized + Hash + Eq, T: Borrow<Ref>,

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}
Source

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§

Source§

impl<T, B> Default for Interner<T, B>
where T: Hash + Eq + PartialEq + ?Sized, B: Backend<T> + Default,

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<T, B, H> Freeze for Interner<T, B, H>
where B: Freeze, H: Freeze, T: ?Sized,

§

impl<T, B, H> RefUnwindSafe for Interner<T, B, H>

§

impl<T, B, H> Send for Interner<T, B, H>
where B: Send, H: Send, <B as Backend<T>>::Symbol: Send, T: ?Sized,

§

impl<T, B, H> Sync for Interner<T, B, H>
where B: Sync, H: Sync, <B as Backend<T>>::Symbol: Sync, T: ?Sized,

§

impl<T, B, H> Unpin for Interner<T, B, H>
where B: Unpin, H: Unpin, <B as Backend<T>>::Symbol: Unpin, T: ?Sized,

§

impl<T, B, H> UnwindSafe for Interner<T, B, H>
where B: UnwindSafe, H: UnwindSafe, <B as Backend<T>>::Symbol: UnwindSafe, T: ?Sized,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.