mod boxed;
mod rodeo;
mod rodeo_reader;
mod rodeo_resolver;
mod tests;
mod threaded_ref;
mod threaded_rodeo;
use crate::{Key, LassoResult, Spur};
#[cfg(feature = "no-std")]
use alloc::boxed::Box;
pub trait Interner<K = Spur>: Reader<K> + Resolver<K> {
fn get_or_intern(&mut self, val: &str) -> K;
fn try_get_or_intern(&mut self, val: &str) -> LassoResult<K>;
fn get_or_intern_static(&mut self, val: &'static str) -> K;
fn try_get_or_intern_static(&mut self, val: &'static str) -> LassoResult<K>;
}
impl<T, K> Interner<K> for &mut T
where
T: Interner<K>,
{
#[inline]
fn get_or_intern(&mut self, val: &str) -> K {
<T as Interner<K>>::get_or_intern(self, val)
}
#[inline]
fn try_get_or_intern(&mut self, val: &str) -> LassoResult<K> {
<T as Interner<K>>::try_get_or_intern(self, val)
}
#[inline]
fn get_or_intern_static(&mut self, val: &'static str) -> K {
<T as Interner<K>>::get_or_intern_static(self, val)
}
#[inline]
fn try_get_or_intern_static(&mut self, val: &'static str) -> LassoResult<K> {
<T as Interner<K>>::try_get_or_intern_static(self, val)
}
}
pub trait IntoReaderAndResolver<K = Spur>: IntoReader<K> + IntoResolver<K>
where
K: Key,
{
}
pub trait IntoReader<K = Spur>: Interner<K>
where
K: Key,
{
type Reader: Reader<K>;
#[must_use]
fn into_reader(self) -> Self::Reader
where
Self: 'static;
#[doc(hidden)]
#[must_use]
fn into_reader_boxed(self: Box<Self>) -> Self::Reader
where
Self: 'static;
}
pub trait Reader<K = Spur>: Resolver<K> {
fn get(&self, val: &str) -> Option<K>;
fn contains(&self, val: &str) -> bool;
}
impl<T, K> Reader<K> for &T
where
T: Reader<K>,
{
#[inline]
fn get(&self, val: &str) -> Option<K> {
<T as Reader<K>>::get(self, val)
}
#[inline]
fn contains(&self, val: &str) -> bool {
<T as Reader<K>>::contains(self, val)
}
}
impl<T, K> Reader<K> for &mut T
where
T: Reader<K>,
{
#[inline]
fn get(&self, val: &str) -> Option<K> {
<T as Reader<K>>::get(self, val)
}
#[inline]
fn contains(&self, val: &str) -> bool {
<T as Reader<K>>::contains(self, val)
}
}
pub trait IntoResolver<K = Spur>: Reader<K>
where
K: Key,
{
type Resolver: Resolver<K>;
#[must_use]
fn into_resolver(self) -> Self::Resolver
where
Self: 'static;
#[doc(hidden)]
#[must_use]
fn into_resolver_boxed(self: Box<Self>) -> Self::Resolver
where
Self: 'static;
}
pub trait Resolver<K = Spur> {
fn resolve<'a>(&'a self, key: &K) -> &'a str;
fn try_resolve<'a>(&'a self, key: &K) -> Option<&'a str>;
unsafe fn resolve_unchecked<'a>(&'a self, key: &K) -> &'a str;
fn contains_key(&self, key: &K) -> bool;
fn len(&self) -> usize;
#[cfg_attr(feature = "inline-more", inline)]
fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<T, K> Resolver<K> for &T
where
T: Resolver<K>,
{
#[inline]
fn resolve<'a>(&'a self, key: &K) -> &'a str {
<T as Resolver<K>>::resolve(self, key)
}
#[inline]
fn try_resolve<'a>(&'a self, key: &K) -> Option<&'a str> {
<T as Resolver<K>>::try_resolve(self, key)
}
#[inline]
unsafe fn resolve_unchecked<'a>(&'a self, key: &K) -> &'a str {
unsafe { <T as Resolver<K>>::resolve_unchecked(self, key) }
}
#[inline]
fn contains_key(&self, key: &K) -> bool {
<T as Resolver<K>>::contains_key(self, key)
}
#[inline]
fn len(&self) -> usize {
<T as Resolver<K>>::len(self)
}
}
impl<T, K> Resolver<K> for &mut T
where
T: Resolver<K>,
{
#[inline]
fn resolve<'a>(&'a self, key: &K) -> &'a str {
<T as Resolver<K>>::resolve(self, key)
}
#[inline]
fn try_resolve<'a>(&'a self, key: &K) -> Option<&'a str> {
<T as Resolver<K>>::try_resolve(self, key)
}
#[inline]
unsafe fn resolve_unchecked<'a>(&'a self, key: &K) -> &'a str {
unsafe { <T as Resolver<K>>::resolve_unchecked(self, key) }
}
#[inline]
fn contains_key(&self, key: &K) -> bool {
<T as Resolver<K>>::contains_key(self, key)
}
#[inline]
fn len(&self) -> usize {
<T as Resolver<K>>::len(self)
}
}