pub struct SymbolTable<S = RandomState> { /* private fields */ }
bytes
only.Expand description
Byte string interner.
This symbol table is implemented by storing byte strings with a fast path for
&[u8]
that are already 'static
.
See module documentation for more.
§Usage
let mut table = SymbolTable::new();
let sym = table.intern(&b"abc"[..])?;
assert_eq!(sym, table.intern(b"abc".to_vec())?);
assert!(table.contains(sym));
assert!(table.is_interned(b"abc"));
Implementations§
Source§impl SymbolTable<RandomState>
impl SymbolTable<RandomState>
Sourcepub fn new() -> Self
pub fn new() -> Self
Constructs a new, empty SymbolTable
with default capacity.
This function will always allocate. To construct a symbol table without
allocating, call SymbolTable::with_capacity(0)
.
§Examples
let table = SymbolTable::new();
assert_eq!(0, table.len());
assert!(table.capacity() >= 4096);
Sourcepub fn with_capacity(capacity: usize) -> Self
pub fn with_capacity(capacity: usize) -> Self
Constructs a new, empty SymbolTable
with the specified capacity.
The symbol table will be able to hold at least capacity
byte strings
without reallocating. If capacity
is 0, the symbol table will not
allocate.
§Examples
let table = SymbolTable::with_capacity(10);
assert_eq!(0, table.len());
assert!(table.capacity() >= 10);
Source§impl<S> SymbolTable<S>
impl<S> SymbolTable<S>
Sourcepub fn with_hasher(hash_builder: S) -> Self
pub fn with_hasher(hash_builder: S) -> Self
Constructs a new, empty SymbolTable
with
default capacity and the given hash
builder.
§Examples
let hash_builder = RandomState::new();
let table = SymbolTable::with_hasher(hash_builder);
assert_eq!(0, table.len());
assert!(table.capacity() >= 4096);
Sourcepub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self
pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self
Constructs a new, empty SymbolTable
with the specified capacity and
the given hash builder.
§Examples
let hash_builder = RandomState::new();
let table = SymbolTable::with_capacity_and_hasher(10, hash_builder);
assert_eq!(0, table.len());
assert!(table.capacity() >= 10);
Sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
Returns the number of byte strings the table can hold without reallocating.
§Examples
let table = SymbolTable::with_capacity(10);
assert!(table.capacity() >= 10);
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the number of interned byte strings in the table.
§Examples
let mut table = SymbolTable::new();
assert_eq!(0, table.len());
table.intern(b"abc".to_vec())?;
// only uniquely interned byte strings grow the symbol table.
table.intern(b"abc".to_vec())?;
table.intern(b"xyz".to_vec())?;
assert_eq!(2, table.len());
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if the symbol table contains no interned byte strings.
§Examples
let mut table = SymbolTable::new();
assert!(table.is_empty());
table.intern(b"abc".to_vec())?;
assert!(!table.is_empty());
Sourcepub fn contains(&self, id: Symbol) -> bool
pub fn contains(&self, id: Symbol) -> bool
Returns true
if the symbol table contains the given symbol.
§Examples
let mut table = SymbolTable::new();
assert!(!table.contains(Symbol::new(0)));
let sym = table.intern(b"abc".to_vec())?;
assert!(table.contains(Symbol::new(0)));
assert!(table.contains(sym));
Sourcepub fn get(&self, id: Symbol) -> Option<&[u8]>
pub fn get(&self, id: Symbol) -> Option<&[u8]>
Returns a reference to the byte string associated with the given symbol.
If the given symbol does not exist in the underlying symbol table,
None
is returned.
The lifetime of the returned reference is bound to the symbol table.
§Examples
let mut table = SymbolTable::new();
assert!(table.get(Symbol::new(0)).is_none());
let sym = table.intern(b"abc".to_vec())?;
assert_eq!(Some(&b"abc"[..]), table.get(Symbol::new(0)));
assert_eq!(Some(&b"abc"[..]), table.get(sym));
Sourcepub fn iter(&self) -> Iter<'_> ⓘ
pub fn iter(&self) -> Iter<'_> ⓘ
Returns an iterator over all Symbol
s and byte strings in the
SymbolTable
.
§Examples
let mut table = SymbolTable::new();
table.intern(b"abc".to_vec())?;
table.intern(b"xyz".to_vec())?;
table.intern(b"123".to_vec())?;
table.intern(b"789".to_vec())?;
let iter = table.iter();
let mut map = HashMap::new();
map.insert(Symbol::new(0), &b"abc"[..]);
map.insert(Symbol::new(1), &b"xyz"[..]);
map.insert(Symbol::new(2), &b"123"[..]);
map.insert(Symbol::new(3), &b"789"[..]);
assert_eq!(map, iter.collect::<HashMap<_, _>>());
let mut table = SymbolTable::new();
table.intern(b"abc".to_vec())?;
table.intern(b"xyz".to_vec())?;
table.intern(b"123".to_vec())?;
table.intern(b"789".to_vec())?;
let iter = table.iter();
assert_eq!(table.len(), iter.count());
Sourcepub fn all_symbols(&self) -> AllSymbols<'_> ⓘ
pub fn all_symbols(&self) -> AllSymbols<'_> ⓘ
Returns an iterator over all Symbol
s in the SymbolTable
.
§Examples
let mut table = SymbolTable::new();
table.intern(b"abc".to_vec())?;
table.intern(b"xyz".to_vec())?;
table.intern(b"123".to_vec())?;
table.intern(b"789".to_vec())?;
let mut all_symbols = table.all_symbols();
assert_eq!(Some(Symbol::new(0)), all_symbols.next());
assert_eq!(Some(Symbol::new(1)), all_symbols.nth_back(2));
assert_eq!(None, all_symbols.next());
let mut table = SymbolTable::new();
table.intern(b"abc".to_vec())?;
table.intern(b"xyz".to_vec())?;
table.intern(b"123".to_vec())?;
table.intern(b"789".to_vec())?;
let all_symbols = table.all_symbols();
assert_eq!(table.len(), all_symbols.count());
Sourcepub fn bytestrings(&self) -> Bytestrings<'_> ⓘ
pub fn bytestrings(&self) -> Bytestrings<'_> ⓘ
Returns an iterator over all byte strings in the SymbolTable
.
§Examples
let mut table = SymbolTable::new();
table.intern(b"abc".to_vec())?;
table.intern(b"xyz".to_vec())?;
table.intern(b"123".to_vec())?;
table.intern(b"789".to_vec())?;
let mut bytestrings = table.bytestrings();
assert_eq!(Some(&b"abc"[..]), bytestrings.next());
assert_eq!(Some(&b"xyz"[..]), bytestrings.nth_back(2));
assert_eq!(None, bytestrings.next());
let mut table = SymbolTable::new();
table.intern(b"abc".to_vec())?;
table.intern(b"xyz".to_vec())?;
table.intern(b"123".to_vec())?;
table.intern(b"789".to_vec())?;
let bytestrings = table.bytestrings();
assert_eq!(table.len(), bytestrings.count());
Source§impl<S> SymbolTable<S>where
S: BuildHasher,
impl<S> SymbolTable<S>where
S: BuildHasher,
Sourcepub fn intern<T>(&mut self, contents: T) -> Result<Symbol, SymbolOverflowError>
pub fn intern<T>(&mut self, contents: T) -> Result<Symbol, SymbolOverflowError>
Intern a byte string for the lifetime of the symbol table.
The returned Symbol
allows retrieving of the underlying bytes.
Equal byte strings will be inserted into the symbol table exactly once.
This function only allocates if the underlying symbol table has no remaining capacity.
§Errors
If the symbol table would grow larger than u32::MAX
interned
byte strings, the Symbol
counter would overflow and a
SymbolOverflowError
is returned.
§Examples
let mut table = SymbolTable::new();
let sym = table.intern(b"abc".to_vec())?;
table.intern(b"xyz".to_vec())?;
table.intern(&b"123"[..])?;
table.intern(&b"789"[..])?;
assert_eq!(4, table.len());
assert_eq!(Some(&b"abc"[..]), table.get(sym));
Sourcepub fn check_interned(&self, contents: &[u8]) -> Option<Symbol>
pub fn check_interned(&self, contents: &[u8]) -> Option<Symbol>
Returns the Symbol
identifier for contents
if it has been interned
before, None
otherwise.
This method does not modify the symbol table.
§Examples
let mut table = SymbolTable::new();
assert!(!table.is_interned(b"abc"));
assert_eq!(None, table.check_interned(b"abc"));
table.intern(b"abc".to_vec())?;
assert!(table.is_interned(b"abc"));
assert_eq!(Some(Symbol::new(0)), table.check_interned(b"abc"));
Sourcepub fn is_interned(&self, contents: &[u8]) -> bool
pub fn is_interned(&self, contents: &[u8]) -> bool
Returns true
if the given byte string has been interned before.
This method does not modify the symbol table.
§Examples
let mut table = SymbolTable::new();
assert!(!table.is_interned(b"abc"));
assert_eq!(None, table.check_interned(b"abc"));
table.intern(b"abc".to_vec())?;
assert!(table.is_interned(b"abc"));
assert_eq!(Some(Symbol::new(0)), table.check_interned(b"abc"));
Sourcepub fn reserve(&mut self, additional: usize)
pub fn reserve(&mut self, additional: usize)
Reserves capacity for at least additional more elements to be inserted
in the given SymbolTable
. The collection may reserve more space to
avoid frequent reallocations. After calling reserve, capacity will be
greater than or equal to self.len() + additional
. Does nothing if
capacity is already sufficient.
§Panics
Panics if the new capacity overflows usize
.
§Examples
let mut table = SymbolTable::with_capacity(1);
table.intern(b"abc".to_vec())?;
table.reserve(10);
assert!(table.capacity() >= 11);
Sourcepub fn shrink_to_fit(&mut self)
pub fn shrink_to_fit(&mut self)
Shrinks the capacity of the symbol table as much as possible.
It will drop down as close as possible to the length but the allocator may still inform the symbol table that there is space for a few more elements.
§Examples
let mut table = SymbolTable::with_capacity(10);
table.intern(b"abc".to_vec());
table.intern(b"xyz".to_vec());
table.intern(b"123".to_vec());
table.shrink_to_fit();
assert!(table.capacity() >= 3);
Sourcepub fn shrink_to(&mut self, min_capacity: usize)
pub fn shrink_to(&mut self, min_capacity: usize)
Shrinks the capacity of the symbol table with a lower bound.
The capacity will remain at least as large as both the length and the supplied value.
If the current capacity is less than the lower limit, this is a no-op.
§Examples
let mut table = SymbolTable::with_capacity(10);
table.intern(b"abc".to_vec())?;
table.intern(b"xyz".to_vec())?;
table.intern(b"123".to_vec())?;
table.shrink_to(5);
assert!(table.capacity() >= 5);