Expand description
§Fast general-purpose interners for every use case
Symtern provides a high-performance interner implementation applicable to most use cases, and a small set of adaptors that add additional functionality on top of this base implementation.
§Trait-guided implementation
Symtern’s types are implemented around a core set of traits that define the ways you can interact with an interner; these traits are carefully designed to avoid restricting the kinds of adaptors possible.
§Interners and adaptors
The base interner, Pool
, is generic over the type of interned values,
and can be configured to use any of Rust’s numeric primitives for symbol
IDs. It is the recommended interner for most purposes.
// Import Symtern's traits, which allow us to use each interner the same way
// regardless of the underlying implementation.
use symtern::prelude::*;
// Create a new pool that accepts `&str` arguments to `intern`, and uses
// `u8` as the backing representation for its symbol type.
let mut pool = symtern::Pool::<str,u8>::new();
if let (Ok(hello), Ok(world)) = (pool.intern("Hello"), pool.intern("World")) {
assert!(hello != world);
assert_eq!(hello, hello);
assert_eq!(Ok(hello), pool.intern("Hello"));
assert_eq!(Ok("Hello"), pool.resolve(hello));
assert_eq!(world, world);
assert_eq!(Ok(world), pool.intern("World"));
assert_eq!(Ok("World"), pool.resolve(world));
}
§Adaptors
For an overview of the available adaptors, see the adaptors
module.
§More examples
Symbol types are Copy
: they can be passed by
value without resulting in a move.
use symtern::prelude::*;
use symtern::Pool;
/// Take ownership of a value, consuming it.
fn consume<T>(_: T) {}
let mut pool = Pool::<str, u32>::new();
let sym = pool.intern("xyz").unwrap();
consume(sym);
println!("The symbol is still valid: {:?}", pool.resolve(sym));
§Caveat Emptor
Because of the way symbol types in this crate are represented, a symbol
obtained by calling intern
on one Pool
instance can easily be identical
to a symbol obtained from a different instance of the same Pool
type
— and will resolve without error (albeit incorrectly) on that
other pool!
Present-day Rust affords us no easy way to fix this without incurring additional runtime costs; see the discussion here for more information.
When the crate is compiled in debug mode, an additional field is added to all symbol instances to allow run-time detection of attempts to resolve a symbol on the wrong resolver, and any such attempt will trigger a panic.
Modules§
- adaptors
- Interner Adaptors
- prelude
- Items intended for glob-import.
- traits
- Traits that define the interface for all string-interning implementations.
Structs§
- Error
- Error type used by this crate.
- Pool
- Simple hash-based interner generic over both the type of interned values and the type used to represent symbol IDs.
- Sym
- Symbol type used by
Pool
’sIntern
andResolve
implementations.
Enums§
- Error
Kind - Kinds of errors representable by the Error type.
Type Aliases§
- Result
- Result type used by fallible operations in symtern.