pub struct Interner { /* private fields */ }Expand description
An append-only set of strings, each mapped to a Symbol.
Strings are never removed, which is what makes a Symbol valid for the lifetime of the
compilation and what lets the storage be a plain growing buffer.
Implementations§
Source§impl Interner
impl Interner
Sourcepub fn with_capacity(cap: usize) -> Self
pub fn with_capacity(cap: usize) -> Self
An interner with room for cap strings, to avoid regrowing on a large header set.
Sourcepub fn intern(&mut self, s: &str) -> Symbol
pub fn intern(&mut self, s: &str) -> Symbol
Interns s, returning the existing symbol if it has been seen.
§Panics
Panics if more than Idx::MAX distinct strings are interned.
Sourcepub fn intern_bytes(&mut self, bytes: &[u8]) -> Symbol
pub fn intern_bytes(&mut self, bytes: &[u8]) -> Symbol
Interns a spelling that may not be text, returning the existing symbol if it has been seen.
A spelling that is UTF-8 is interned as itself, so nothing changes for the common case and
a byte spelling equal to a name is the same symbol as that name. One that is not gets a
symbol of its own whose text is the lossy reading, which is what Interner::resolve
hands back, and whose bytes are kept beside it for Interner::resolve_bytes.
§Panics
Panics if more than Idx::MAX distinct spellings are interned.
Sourcepub fn resolve(&self, sym: Symbol) -> &str
pub fn resolve(&self, sym: Symbol) -> &str
The text behind a symbol.
§Panics
Panics if the symbol came from a different interner. There is one interner per compilation, so this is a bug rather than a condition to handle.
Sourcepub fn resolve_bytes(&self, sym: Symbol) -> &[u8] ⓘ
pub fn resolve_bytes(&self, sym: Symbol) -> &[u8] ⓘ
The bytes behind a symbol, which is the spelling exactly as it was written.
The same as resolve(sym).as_bytes() for every symbol that came from text, which is all
of them but the ones Interner::intern_bytes made from bytes that are not UTF-8.
§Panics
Panics if the symbol came from a different interner, as Interner::resolve does.