use std::sync::{Arc, RwLock};
#[derive(Clone)]
pub struct ConcurrentBloomFilter<F> {
inner: Arc<RwLock<F>>,
}
impl<F> ConcurrentBloomFilter<F> {
pub fn new(filter: F) -> Self {
Self {
inner: Arc::new(RwLock::new(filter)),
}
}
pub fn ref_count(&self) -> usize {
Arc::strong_count(&self.inner)
}
pub fn into_inner(self) -> Option<F> {
Arc::try_unwrap(self.inner)
.ok()
.map(|rw| rw.into_inner().unwrap())
}
}
impl<F> ConcurrentBloomFilter<F> {
pub fn read<R, OP: FnOnce(&F) -> R>(&self, op: OP) -> R {
let guard = self.inner.read().expect("RwLock poisoned");
op(&*guard)
}
pub fn write<R, OP: FnOnce(&mut F) -> R>(&self, op: OP) -> R {
let mut guard = self.inner.write().expect("RwLock poisoned");
op(&mut *guard)
}
}