pub trait StringInternerTrait {
type Symbol: Clone + Eq + std::hash::Hash + std::fmt::Debug;
fn intern(&mut self, s: &str) -> Self::Symbol;
fn resolve(&self, symbol: &Self::Symbol) -> String;
}
use crate::drains::simple::INTERNER as SHARED_INTERNER; use parking_lot::RwLock;
use std::collections::hash_map::RandomState;
use std::sync::Arc;
use string_interner::backend::{BucketBackend, BufferBackend, StringBackend}; use string_interner::DefaultSymbol;
use string_interner::StringInterner;
use interned_string::{IString, Intern};
use lasso::{Rodeo, Spur};
use intern_string::{Intern as InternStringIntern, InternId as InternStringInternId};
use arc_string_interner::StringInterner as ArcStringInternerImpl;
use arc_string_interner::Sym as ArcSym;
pub struct SharedStringInterner {
interner_arc: Arc<RwLock<StringInterner<string_interner::backend::BucketBackend>>>,
}
impl SharedStringInterner {
pub fn new() -> Self {
Self {
interner_arc: SHARED_INTERNER.clone(),
}
}
}
impl StringInternerTrait for SharedStringInterner {
type Symbol = DefaultSymbol;
fn intern(&mut self, s: &str) -> Self::Symbol {
self.interner_arc.write().get_or_intern(s)
}
fn resolve(&self, symbol: &Self::Symbol) -> String {
let guard = self.interner_arc.read();
guard
.resolve(*symbol)
.expect("Symbol should exist in interner")
.to_owned()
}
}
pub struct LassoInterner {
interner: Rodeo,
}
impl LassoInterner {
pub fn new() -> Self {
Self {
interner: Rodeo::new(),
}
}
}
impl Default for LassoInterner {
fn default() -> Self {
Self::new()
}
}
impl StringInternerTrait for LassoInterner {
type Symbol = Spur;
fn intern(&mut self, s: &str) -> Self::Symbol {
self.interner.get_or_intern(s)
}
fn resolve(&self, symbol: &Self::Symbol) -> String {
self.interner.resolve(symbol).to_string()
}
}
pub struct InternedStringInterner;
impl InternedStringInterner {
pub fn new() -> Self {
Self
}
}
impl Default for InternedStringInterner {
fn default() -> Self {
Self::new()
}
}
impl StringInternerTrait for InternedStringInterner {
type Symbol = IString;
fn intern(&mut self, s: &str) -> Self::Symbol {
s.intern()
}
fn resolve(&self, symbol: &Self::Symbol) -> String {
symbol.as_ref().to_string()
}
}
pub struct InternStringImplInterner {
interner: InternStringIntern<'static>,
}
impl InternStringImplInterner {
pub fn new() -> Self {
Self {
interner: InternStringIntern::new(),
}
}
}
impl Default for InternStringImplInterner {
fn default() -> Self {
Self::new()
}
}
impl StringInternerTrait for InternStringImplInterner {
type Symbol = InternStringInternId;
fn intern(&mut self, s: &str) -> Self::Symbol {
self.interner.intern(s)
}
fn resolve(&self, symbol: &Self::Symbol) -> String {
self.interner.lookup(*symbol).to_string()
}
}
pub struct ArcStringInternerImplInterner {
interner: ArcStringInternerImpl<ArcSym, std::collections::hash_map::RandomState, 10>,
}
impl ArcStringInternerImplInterner {
pub fn new() -> Self {
Self {
interner: ArcStringInternerImpl::with_capacity(1024),
}
}
}
impl Default for ArcStringInternerImplInterner {
fn default() -> Self {
Self::new()
}
}
impl StringInternerTrait for ArcStringInternerImplInterner {
type Symbol = ArcSym;
fn intern(&mut self, s: &str) -> Self::Symbol {
self.interner.get_or_intern(s.to_string())
}
fn resolve(&self, symbol: &Self::Symbol) -> String {
let arc_str_val: Arc<str> = self
.interner
.resolve(*symbol)
.expect("Symbol should exist in interner");
arc_str_val.to_string()
}
}
impl Default for SharedStringInterner {
fn default() -> Self {
Self::new()
}
}
#[derive(Default)]
pub struct NoInterningBaseline {
}
impl NoInterningBaseline {
pub fn new() -> Self {
Self {}
}
}
impl StringInternerTrait for NoInterningBaseline {
type Symbol = String;
fn intern(&mut self, s: &str) -> Self::Symbol {
s.to_string()
}
fn resolve(&self, symbol: &Self::Symbol) -> String {
symbol.clone()
}
}
pub struct StringBackendInterner {
interner: StringInterner<StringBackend, RandomState>,
}
impl StringBackendInterner {
pub fn new() -> Self {
Self {
interner: StringInterner::<StringBackend, RandomState>::new(),
}
}
}
impl Default for StringBackendInterner {
fn default() -> Self {
Self::new()
}
}
impl StringInternerTrait for StringBackendInterner {
type Symbol = DefaultSymbol;
fn intern(&mut self, s: &str) -> Self::Symbol {
self.interner.get_or_intern(s)
}
fn resolve(&self, symbol: &Self::Symbol) -> String {
self.interner
.resolve(*symbol)
.expect("Symbol should exist in interner")
.to_owned()
}
}
pub struct BucketBackendInterner {
interner: StringInterner<BucketBackend, RandomState>,
}
impl BucketBackendInterner {
pub fn new() -> Self {
Self {
interner: StringInterner::<BucketBackend, RandomState>::new(),
}
}
}
impl Default for BucketBackendInterner {
fn default() -> Self {
Self::new()
}
}
impl StringInternerTrait for BucketBackendInterner {
type Symbol = DefaultSymbol;
fn intern(&mut self, s: &str) -> Self::Symbol {
self.interner.get_or_intern(s)
}
fn resolve(&self, symbol: &Self::Symbol) -> String {
self.interner
.resolve(*symbol)
.expect("Symbol should exist in interner")
.to_owned()
}
}
pub struct BufferBackendInterner {
interner: StringInterner<BufferBackend, RandomState>,
}
impl BufferBackendInterner {
pub fn new() -> Self {
Self {
interner: StringInterner::<BufferBackend, RandomState>::new(),
}
}
}
impl Default for BufferBackendInterner {
fn default() -> Self {
Self::new()
}
}
impl StringInternerTrait for BufferBackendInterner {
type Symbol = DefaultSymbol;
fn intern(&mut self, s: &str) -> Self::Symbol {
self.interner.get_or_intern(s)
}
fn resolve(&self, symbol: &Self::Symbol) -> String {
self.interner
.resolve(*symbol)
.expect("Symbol should exist in interner")
.to_owned()
}
}