pub use lasso::{Rodeo, RodeoReader, RodeoResolver, Spur};
#[cfg(feature = "multi-threaded")]
pub use lasso::ThreadedRodeo;
pub type InternedId = Spur;
pub type Interner = Rodeo;
#[cfg(feature = "multi-threaded")]
pub type ThreadSafeInterner = ThreadedRodeo;
pub trait InternerExt {
fn intern_str(&mut self, s: &str) -> InternedId;
fn intern_option(&mut self, s: Option<&String>) -> Option<InternedId>;
fn intern_option_owned(&mut self, s: Option<String>) -> Option<InternedId>;
}
impl InternerExt for Rodeo {
#[inline]
fn intern_str(&mut self, s: &str) -> InternedId {
self.get_or_intern(s)
}
#[inline]
fn intern_option(&mut self, s: Option<&String>) -> Option<InternedId> {
match s {
Some(s) if !s.is_empty() => Some(self.get_or_intern(s)),
_ => None,
}
}
#[inline]
fn intern_option_owned(&mut self, s: Option<String>) -> Option<InternedId> {
match s {
Some(s) if !s.is_empty() => Some(self.get_or_intern(s)),
_ => None,
}
}
}
#[cfg(feature = "multi-threaded")]
impl InternerExt for ThreadedRodeo {
#[inline]
fn intern_str(&mut self, s: &str) -> InternedId {
self.get_or_intern(s)
}
#[inline]
fn intern_option(&mut self, s: Option<&String>) -> Option<InternedId> {
match s {
Some(s) if !s.is_empty() => Some(self.get_or_intern(s)),
_ => None,
}
}
#[inline]
fn intern_option_owned(&mut self, s: Option<String>) -> Option<InternedId> {
match s {
Some(s) if !s.is_empty() => Some(self.get_or_intern(s)),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_intern_basic() {
let mut interner = Rodeo::default();
let id1 = interner.get_or_intern("hello");
let id2 = interner.get_or_intern("world");
let id3 = interner.get_or_intern("hello");
assert_eq!(id1, id3);
assert_ne!(id1, id2);
}
#[test]
fn test_resolve() {
let mut interner = Rodeo::default();
let id = interner.get_or_intern("test-uuid-1234");
assert_eq!(interner.resolve(&id), "test-uuid-1234");
}
#[test]
fn test_intern_option() {
let mut interner = Rodeo::default();
let some_str = Some(String::from("hello"));
let none_str: Option<&String> = None;
let empty_str = Some(String::from(""));
assert!(interner.intern_option(some_str.as_ref()).is_some());
assert!(interner.intern_option(none_str).is_none());
assert!(interner.intern_option(empty_str.as_ref()).is_none());
}
}