Add a more generic implementation of intern-by-ref

This commit is contained in:
Nick Mathewson 2022-03-11 14:00:21 -05:00
parent b40e06c64a
commit 718a1ee340
2 changed files with 12 additions and 4 deletions

View File

@ -81,7 +81,7 @@ impl std::str::FromStr for Version {
}
}
Ok(Version::Other(OTHER_VERSION_CACHE.intern(s)))
Ok(Version::Other(OTHER_VERSION_CACHE.intern_ref(s)))
}
}

View File

@ -55,9 +55,17 @@ impl<T: Eq + Hash> InternCache<T> {
}
}
impl InternCache<str> {
/// Intern a string slice into this cache.
pub(crate) fn intern(&self, value: &str) -> Arc<str> {
impl<T: Hash + Eq + ?Sized> InternCache<T> {
/// Intern an object by reference.
///
/// Works with unsized types, but requires that the reference implements
/// `Into<Arc<T>>`.
pub(crate) fn intern_ref<'a, V>(&self, value: &'a V) -> Arc<T>
where
V: Hash + Eq + ?Sized,
&'a V: Into<Arc<T>>,
T: std::borrow::Borrow<V>,
{
let mut cache = self.cache();
if let Some(arc) = cache.get(value) {
arc