use std::{hash::Hash, sync::Arc};
use rustc_hash::FxBuildHasher;
#[derive(Debug)]
pub(crate) struct ConcurrentReadMap<K: Hash + Eq, V>(Arc<papaya::HashMap<K, V, FxBuildHasher>>);
impl<K: Hash + Eq, V> Default for ConcurrentReadMap<K, V> {
fn default() -> Self {
Self(Default::default())
}
}
impl<K: Hash + Eq, V> ConcurrentReadMap<K, V> {
pub(crate) fn get_or_insert_with<F>(&mut self, key: K, f: F) -> V
where
F: FnOnce() -> V,
V: Clone,
{
self.0.get_or_insert_with(key, f, &self.0.guard()).clone()
}
pub(crate) fn insert(&mut self, key: K, value: V) {
self.0.insert(key, value, &self.0.guard());
}
pub(crate) fn remove(&mut self, key: &K) {
self.0.remove(key, &self.0.guard());
}
pub(crate) fn get(&self, key: &K) -> Option<V>
where
V: Clone,
{
self.0.get(key, &self.0.guard()).cloned()
}
pub(crate) fn read_only(&self) -> ReadOnlyMap<K, V> {
ReadOnlyMap(self.0.clone())
}
}
#[derive(Clone, Debug)]
pub(crate) struct ReadOnlyMap<K: Hash + Eq, V>(Arc<papaya::HashMap<K, V, FxBuildHasher>>);
impl<K: Hash + Eq, V> ReadOnlyMap<K, V> {
pub(crate) fn get(&self, key: &K) -> Option<V>
where
V: Clone,
{
self.0.get(key, &self.0.guard()).cloned()
}
pub(crate) fn guard(&self) -> papaya::LocalGuard<'_> {
self.0.guard()
}
pub(crate) fn values<'g, G: papaya::Guard>(&self, guard: &'g G) -> papaya::Values<'g, K, V, G> {
self.0.values(guard)
}
}