#![forbid(unconditional_recursion, future_incompatible)]
#![warn(unsafe_code, bad_style, missing_docs, missing_debug_implementations)]
#[cfg(feature = "parking_lot")]
mod parking_lot_shim;
mod interner;
pub use interner::Interner;
mod interned;
pub use interned::Interned;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn str_usage() {
let interner = Interner::new();
let a1 = interner.intern(Box::<str>::from("a"));
let b1 = interner.intern(String::from("b"));
let c1 = interner.intern("c");
let a2 = interner.intern("a");
let b2 = interner.intern("b");
let c2 = interner.intern("c");
let a3 = interner.get("a").unwrap();
let b3 = interner.get("b").unwrap();
let c3 = interner.get("c").unwrap();
assert_eq!(a1.as_ptr(), a2.as_ptr());
assert_eq!(a2.as_ptr(), a3.as_ptr());
assert_eq!(b1.as_ptr(), b2.as_ptr());
assert_eq!(b2.as_ptr(), b3.as_ptr());
assert_eq!(c1.as_ptr(), c2.as_ptr());
assert_eq!(c2.as_ptr(), c3.as_ptr());
}
#[test]
fn slice_usage() {
let interner = Interner::new();
let a1 = interner.intern(Box::<[u8]>::from([0]));
let b1 = interner.intern(Vec::from([1]));
let c1 = interner.intern::<[u8; 1]>([2]);
let d1 = interner.intern::<&[u8]>(&[3][..]);
let a2 = interner.intern([0]);
let b2 = interner.intern([1]);
let c2 = interner.intern([2]);
let d2 = interner.intern([3]);
let a3 = interner.get(&[0][..]).unwrap();
let b3 = interner.get(&[1]).unwrap();
let c3 = interner.get(&[2]).unwrap();
let d3 = interner.get(&[3]).unwrap();
assert_eq!(a1.as_ptr(), a2.as_ptr());
assert_eq!(a2.as_ptr(), a3.as_ptr());
assert_eq!(b1.as_ptr(), b2.as_ptr());
assert_eq!(b2.as_ptr(), b3.as_ptr());
assert_eq!(c1.as_ptr(), c2.as_ptr());
assert_eq!(c2.as_ptr(), c3.as_ptr());
assert_eq!(d1.as_ptr(), d2.as_ptr());
assert_eq!(d2.as_ptr(), d3.as_ptr());
}
#[cfg(feature = "hashbrown")]
#[test]
fn static_interner() {
use hash32::{BuildHasherDefault, FnvHasher};
static INTERNER: Interner<str, BuildHasherDefault<FnvHasher>> =
Interner::with_hasher(BuildHasherDefault::new());
let non_static_str = String::from("a");
let interned = INTERNER.intern(non_static_str);
let static_str: &'static str = Interned::get(&interned);
assert_eq!(static_str, "a");
}
}