pub struct Rodeo<K = Spur, S = RandomState> { /* private fields */ }Expand description
A string interner that caches strings quickly with a minimal memory footprint,
returning a unique key to re-access it with O(1) times.
By default Rodeo uses the Spur type for keys and RandomState as its hasher
Implementations§
source§impl<K> Rodeo<K, RandomState>where
K: Key,
impl<K> Rodeo<K, RandomState>where
K: Key,
sourcepub fn new() -> Self
pub fn new() -> Self
Create a new Rodeo
Example
use lasso::{Rodeo, Spur};
let mut rodeo: Rodeo<Spur> = Rodeo::new();
let hello = rodeo.get_or_intern("Hello, ");
let world = rodeo.get_or_intern("World!");
assert_eq!("Hello, ", rodeo.resolve(&hello));
assert_eq!("World!", rodeo.resolve(&world));sourcepub fn with_capacity(capacity: Capacity) -> Self
pub fn with_capacity(capacity: Capacity) -> Self
sourcepub fn with_memory_limits(memory_limits: MemoryLimits) -> Self
pub fn with_memory_limits(memory_limits: MemoryLimits) -> Self
Create a new Rodeo with the specified memory limits. The interner will be able to hold max_memory_usage
bytes of interned strings until it will start returning None from try_get_or_intern or panicking from
get_or_intern.
Note: If the capacity of the interner is greater than the memory limit, then that will be the effective maximum for allocated memory
See MemoryLimits for more information
Example
use lasso::{Rodeo, MemoryLimits, Spur};
let rodeo: Rodeo<Spur> = Rodeo::with_memory_limits(MemoryLimits::for_memory_usage(4096));sourcepub fn with_capacity_and_memory_limits(
capacity: Capacity,
memory_limits: MemoryLimits
) -> Self
pub fn with_capacity_and_memory_limits(
capacity: Capacity,
memory_limits: MemoryLimits
) -> Self
Create a new Rodeo with the specified capacity and memory limits. The interner will be able to hold max_memory_usage
bytes of interned strings until it will start returning None from try_get_or_intern or panicking from
get_or_intern.
Note: If the capacity of the interner is greater than the memory limit, then that will be the effective maximum for allocated memory
See Capacity MemoryLimits for more information
Example
use lasso::{Rodeo, MemoryLimits, Spur};
let rodeo: Rodeo<Spur> = Rodeo::with_memory_limits(MemoryLimits::for_memory_usage(4096));source§impl<K, S> Rodeo<K, S>where
K: Key,
S: BuildHasher,
impl<K, S> Rodeo<K, S>where
K: Key,
S: BuildHasher,
sourcepub fn with_hasher(hash_builder: S) -> Self
pub fn with_hasher(hash_builder: S) -> Self
Creates an empty Rodeo which will use the given hasher for its internal hashmap
Example
use lasso::{Spur, Rodeo};
use std::collections::hash_map::RandomState;
let rodeo: Rodeo<Spur, RandomState> = Rodeo::with_hasher(RandomState::new());sourcepub fn with_capacity_and_hasher(capacity: Capacity, hash_builder: S) -> Self
pub fn with_capacity_and_hasher(capacity: Capacity, hash_builder: S) -> Self
Creates a new Rodeo with the specified capacity that will use the given hasher for its internal hashmap
See Capacity for more information
Example
use lasso::{Spur, Capacity, Rodeo};
use std::collections::hash_map::RandomState;
let rodeo: Rodeo<Spur, RandomState> = Rodeo::with_capacity_and_hasher(Capacity::for_strings(10), RandomState::new());sourcepub fn with_capacity_memory_limits_and_hasher(
capacity: Capacity,
memory_limits: MemoryLimits,
hash_builder: S
) -> Self
pub fn with_capacity_memory_limits_and_hasher(
capacity: Capacity,
memory_limits: MemoryLimits,
hash_builder: S
) -> Self
Creates a new Rodeo with the specified capacity and memory limits that will use the given hasher for its internal hashmap
See Capacity and MemoryLimits for more information
Example
use lasso::{Spur, Capacity, MemoryLimits, Rodeo};
use std::collections::hash_map::RandomState;
let rodeo: Rodeo<Spur, RandomState> = Rodeo::with_capacity_memory_limits_and_hasher(
Capacity::for_strings(10),
MemoryLimits::for_memory_usage(4096),
RandomState::new(),
);sourcepub fn get_or_intern<T>(&mut self, val: T) -> Kwhere
T: AsRef<str>,
pub fn get_or_intern<T>(&mut self, val: T) -> Kwhere
T: AsRef<str>,
Get the key for a string, interning it if it does not yet exist
Panics
Panics if the key’s try_from_usize function fails. With the default keys, this means that
you’ve interned more strings than it can handle. (For Spur this means that u32::MAX - 1
unique strings were interned)
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
// Interned the string
let key = rodeo.get_or_intern("Strings of things with wings and dings");
assert_eq!("Strings of things with wings and dings", rodeo.resolve(&key));
// No string was interned, as it was already contained
let key = rodeo.get_or_intern("Strings of things with wings and dings");
assert_eq!("Strings of things with wings and dings", rodeo.resolve(&key));sourcepub fn try_get_or_intern<T>(&mut self, val: T) -> LassoResult<K>where
T: AsRef<str>,
pub fn try_get_or_intern<T>(&mut self, val: T) -> LassoResult<K>where
T: AsRef<str>,
Get the key for a string, interning it if it does not yet exist
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
// Interned the string
let key = rodeo.try_get_or_intern("Strings of things with wings and dings").unwrap();
assert_eq!("Strings of things with wings and dings", rodeo.resolve(&key));
// No string was interned, as it was already contained
let key = rodeo.try_get_or_intern("Strings of things with wings and dings").unwrap();
assert_eq!("Strings of things with wings and dings", rodeo.resolve(&key));sourcepub fn get_or_intern_static(&mut self, string: &'static str) -> K
pub fn get_or_intern_static(&mut self, string: &'static str) -> K
Get the key for a static string, interning it if it does not yet exist
This will not reallocate or copy the given string
Panics
Panics if the key’s try_from_usize function fails. With the default keys, this means that
you’ve interned more strings than it can handle. (For Spur this means that u32::MAX - 1
unique strings were interned)
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
// Interned the string
let key = rodeo.get_or_intern_static("Strings of things with wings and dings");
assert_eq!("Strings of things with wings and dings", rodeo.resolve(&key));
// No string was interned, as it was already contained
let key = rodeo.get_or_intern_static("Strings of things with wings and dings");
assert_eq!("Strings of things with wings and dings", rodeo.resolve(&key));sourcepub fn try_get_or_intern_static(
&mut self,
string: &'static str
) -> LassoResult<K>
pub fn try_get_or_intern_static(
&mut self,
string: &'static str
) -> LassoResult<K>
Get the key for a static string, interning it if it does not yet exist
This will not reallocate or copy the given string
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
// Interned the string
let key = rodeo.try_get_or_intern_static("Strings of things with wings and dings").unwrap();
assert_eq!("Strings of things with wings and dings", rodeo.resolve(&key));
// No string was interned, as it was already contained
let key = rodeo.try_get_or_intern_static("Strings of things with wings and dings").unwrap();
assert_eq!("Strings of things with wings and dings", rodeo.resolve(&key));sourcepub fn get<T>(&self, val: T) -> Option<K>where
T: AsRef<str>,
pub fn get<T>(&self, val: T) -> Option<K>where
T: AsRef<str>,
Get the key value of a string, returning None if it doesn’t exist
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
let key = rodeo.get_or_intern("Strings of things with wings and dings");
assert_eq!(Some(key), rodeo.get("Strings of things with wings and dings"));
assert_eq!(None, rodeo.get("This string isn't interned"));sourcepub fn contains<T>(&self, val: T) -> boolwhere
T: AsRef<str>,
pub fn contains<T>(&self, val: T) -> boolwhere
T: AsRef<str>,
Returns true if the given string has been interned
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
let key = rodeo.get_or_intern("Strings of things with wings and dings");
assert!(rodeo.contains("Strings of things with wings and dings"));
assert!(!rodeo.contains("This string isn't interned"));source§impl<K, S> Rodeo<K, S>where
K: Key,
impl<K, S> Rodeo<K, S>where
K: Key,
sourcepub fn contains_key(&self, key: &K) -> bool
pub fn contains_key(&self, key: &K) -> bool
Returns true if the given key exists in the current interner
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
let key = rodeo.get_or_intern("Strings of things with wings and dings");
assert!(rodeo.contains_key(&key));
assert!(!rodeo.contains_key(&key_that_doesnt_exist));sourcepub fn resolve<'a>(&'a self, key: &K) -> &'a str
pub fn resolve<'a>(&'a self, key: &K) -> &'a str
Resolves a string by its key. Only keys made by the current Rodeo may be used
Panics
Panics if the key is out of bounds
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
let key = rodeo.get_or_intern("Strings of things with wings and dings");
assert_eq!("Strings of things with wings and dings", rodeo.resolve(&key));sourcepub fn try_resolve<'a>(&'a self, key: &K) -> Option<&'a str>
pub fn try_resolve<'a>(&'a self, key: &K) -> Option<&'a str>
Resolves a string by its key, returning None if it’s out of bounds. Only keys made by the
current Rodeo may be used
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
let key = rodeo.get_or_intern("Strings of things with wings and dings");
assert_eq!(Some("Strings of things with wings and dings"), rodeo.try_resolve(&key));sourcepub unsafe fn resolve_unchecked<'a>(&'a self, key: &K) -> &'a str
pub unsafe fn resolve_unchecked<'a>(&'a self, key: &K) -> &'a str
Resolves a string by its key, without bounds checks
Safety
The key must be valid for the current interner
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
let key = rodeo.get_or_intern("Strings of things with wings and dings");
unsafe {
assert_eq!("Strings of things with wings and dings", rodeo.resolve_unchecked(&key));
}source§impl<K, S> Rodeo<K, S>
impl<K, S> Rodeo<K, S>
sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Gets the number of interned strings
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
rodeo.get_or_intern("Documentation often has little hidden bits in it");
assert_eq!(rodeo.len(), 1);sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if there are no currently interned strings
Example
use lasso::Rodeo;
let rodeo = Rodeo::default();
assert!(rodeo.is_empty());sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
Returns the number of strings that can be interned without a reallocation
Example
use lasso::{Spur, Capacity, Rodeo};
let rodeo: Rodeo<Spur> = Rodeo::with_capacity(Capacity::for_strings(10));
assert_eq!(rodeo.capacity(), 10);sourcepub fn iter(&self) -> Iter<'_, K> ⓘ
pub fn iter(&self) -> Iter<'_, K> ⓘ
Returns an iterator over the interned strings and their key values
sourcepub fn set_memory_limits(&mut self, memory_limits: MemoryLimits)
pub fn set_memory_limits(&mut self, memory_limits: MemoryLimits)
Set the Rodeo’s maximum memory usage while in-flight
Note that setting the maximum memory usage to below the currently allocated memory will do nothing
sourcepub fn current_memory_usage(&self) -> usize
pub fn current_memory_usage(&self) -> usize
Get the Rodeo’s currently allocated memory
sourcepub fn max_memory_usage(&self) -> usize
pub fn max_memory_usage(&self) -> usize
Get the Rodeo’s current maximum of allocated memory
source§impl<K, S> Rodeo<K, S>
impl<K, S> Rodeo<K, S>
sourcepub fn into_reader(self) -> RodeoReader<K, S>
pub fn into_reader(self) -> RodeoReader<K, S>
Consumes the current Rodeo, returning a RodeoReader to allow contention-free access of the interner
from multiple threads
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
let key = rodeo.get_or_intern("Appear weak when you are strong, and strong when you are weak.");
let read_only_rodeo = rodeo.into_reader();
assert_eq!(
"Appear weak when you are strong, and strong when you are weak.",
read_only_rodeo.resolve(&key),
);sourcepub fn into_resolver(self) -> RodeoResolver<K>
pub fn into_resolver(self) -> RodeoResolver<K>
Consumes the current Rodeo, returning a RodeoResolver to allow contention-free access of the interner
from multiple threads with the lowest possible memory consumption
Example
use lasso::Rodeo;
let mut rodeo = Rodeo::default();
let key = rodeo.get_or_intern("Appear weak when you are strong, and strong when you are weak.");
let resolver_rodeo = rodeo.into_resolver();
assert_eq!(
"Appear weak when you are strong, and strong when you are weak.",
resolver_rodeo.resolve(&key),
);Trait Implementations§
source§impl Default for Rodeo<Spur, RandomState>
impl Default for Rodeo<Spur, RandomState>
Creates a Rodeo using Spur as its key and RandomState as its hasher
source§impl<K, S, T> Extend<T> for Rodeo<K, S>where
K: Key,
S: BuildHasher,
T: AsRef<str>,
impl<K, S, T> Extend<T> for Rodeo<K, S>where
K: Key,
S: BuildHasher,
T: AsRef<str>,
source§fn extend<I>(&mut self, iter: I)where
I: IntoIterator<Item = T>,
fn extend<I>(&mut self, iter: I)where
I: IntoIterator<Item = T>,
source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)source§impl<Str, K, S> FromIterator<Str> for Rodeo<K, S>where
Str: AsRef<str>,
K: Key,
S: BuildHasher + Default,
impl<Str, K, S> FromIterator<Str> for Rodeo<K, S>where
Str: AsRef<str>,
K: Key,
S: BuildHasher + Default,
source§fn from_iter<T>(iter: T) -> Selfwhere
T: IntoIterator<Item = Str>,
fn from_iter<T>(iter: T) -> Selfwhere
T: IntoIterator<Item = Str>,
source§impl<K, S> Interner<K> for Rodeo<K, S>where
K: Key,
S: BuildHasher,
impl<K, S> Interner<K> for Rodeo<K, S>where
K: Key,
S: BuildHasher,
source§fn get_or_intern(&mut self, val: &str) -> K
fn get_or_intern(&mut self, val: &str) -> K
source§fn try_get_or_intern(&mut self, val: &str) -> LassoResult<K>
fn try_get_or_intern(&mut self, val: &str) -> LassoResult<K>
source§fn get_or_intern_static(&mut self, val: &'static str) -> K
fn get_or_intern_static(&mut self, val: &'static str) -> K
source§fn try_get_or_intern_static(&mut self, val: &'static str) -> LassoResult<K>
fn try_get_or_intern_static(&mut self, val: &'static str) -> LassoResult<K>
source§impl<'a, K: Key, S> IntoIterator for &'a Rodeo<K, S>
impl<'a, K: Key, S> IntoIterator for &'a Rodeo<K, S>
source§impl<K, S> IntoReader<K> for Rodeo<K, S>where
K: Key,
S: BuildHasher,
impl<K, S> IntoReader<K> for Rodeo<K, S>where
K: Key,
S: BuildHasher,
§type Reader = RodeoReader<K, S>
type Reader = RodeoReader<K, S>
Reader the interner will be converted intosource§impl<K, S> IntoResolver<K> for Rodeo<K, S>where
K: Key,
S: BuildHasher,
impl<K, S> IntoResolver<K> for Rodeo<K, S>where
K: Key,
S: BuildHasher,
§type Resolver = RodeoResolver<K>
type Resolver = RodeoResolver<K>
Resolver the reader will be converted intosource§impl<K, S> PartialEq<Rodeo<K, S>> for Rodeo<K, S>
impl<K, S> PartialEq<Rodeo<K, S>> for Rodeo<K, S>
source§impl<K, S> PartialEq<Rodeo<K, S>> for RodeoReader<K, S>
impl<K, S> PartialEq<Rodeo<K, S>> for RodeoReader<K, S>
source§impl<K, S> PartialEq<Rodeo<K, S>> for RodeoResolver<K>
impl<K, S> PartialEq<Rodeo<K, S>> for RodeoResolver<K>
source§impl<K, S> PartialEq<Rodeo<K, S>> for ThreadedRodeo<K, S>where
K: Eq + Hash + Key,
S: Clone + BuildHasher,
impl<K, S> PartialEq<Rodeo<K, S>> for ThreadedRodeo<K, S>where
K: Eq + Hash + Key,
S: Clone + BuildHasher,
source§impl<K, S> PartialEq<RodeoReader<K, S>> for Rodeo<K, S>
impl<K, S> PartialEq<RodeoReader<K, S>> for Rodeo<K, S>
source§fn eq(&self, other: &RodeoReader<K, S>) -> bool
fn eq(&self, other: &RodeoReader<K, S>) -> bool
self and other values to be equal, and is used
by ==.source§impl<K, S> PartialEq<RodeoResolver<K>> for Rodeo<K, S>
impl<K, S> PartialEq<RodeoResolver<K>> for Rodeo<K, S>
source§fn eq(&self, other: &RodeoResolver<K>) -> bool
fn eq(&self, other: &RodeoResolver<K>) -> bool
self and other values to be equal, and is used
by ==.source§impl<K, S> Resolver<K> for Rodeo<K, S>where
K: Key,
impl<K, S> Resolver<K> for Rodeo<K, S>where
K: Key,
source§fn try_resolve<'a>(&'a self, key: &K) -> Option<&'a str>
fn try_resolve<'a>(&'a self, key: &K) -> Option<&'a str>
None
if it cannot be foundsource§unsafe fn resolve_unchecked<'a>(&'a self, key: &K) -> &'a str
unsafe fn resolve_unchecked<'a>(&'a self, key: &K) -> &'a str
source§fn contains_key(&self, key: &K) -> bool
fn contains_key(&self, key: &K) -> bool
true if the current interner contains the given key