Skip to main content

Interner

Struct Interner 

Source
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

Source

pub fn new() -> Self

An interner holding the reserved names and nothing else.

Source

pub fn with_capacity(cap: usize) -> Self

An interner with room for cap strings, to avoid regrowing on a large header set.

Source

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.

Source

pub fn join(&mut self, prefix: &'static str, name: &'static str) -> Symbol

Interns prefix followed by name, returning the existing symbol if it has been seen.

The same answer as interning the two written together, without writing them together after the first time. The back end asks this for each machine opcode it puts in each function, which is the target’s prefix in front of a name out of one of its tables, and both halves are the same few hundred static strings every time.

Source

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.

Source

pub fn find(&self, s: &str) -> Option<Symbol>

The symbol s was interned as, and None when nothing has interned it.

For a name the compiler knows and a program may or may not write: one it did not write was never interned, and asking this is how a table of such names is matched against the source without adding any of them to it.

Source

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.

Source

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.

Source

pub fn len(&self) -> usize

How many distinct strings have been interned, the reserved names included.

Source

pub fn is_empty(&self) -> bool

Whether anything but the reserved names has been interned.

Source

pub fn bytes(&self) -> usize

Total bytes of interned text, which is the number worth watching on a large build.

Trait Implementations§

Source§

impl Debug for Interner

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Interner

Source§

fn default() -> Self

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

Auto Trait Implementations§

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 = !

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

fn try_from(value: U) -> Result<T, !>

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.