use std::sync::{PoisonError, RwLock, RwLockReadGuard, RwLockWriteGuard};
use crate::{Handle, Region};
pub struct SyncRegion<T> {
inner: RwLock<Region<T>>,
}
impl<T> SyncRegion<T> {
#[must_use]
pub fn new() -> Self {
Self {
inner: RwLock::new(Region::new()),
}
}
#[must_use]
pub fn with_capacity(capacity: usize) -> Self {
Self {
inner: RwLock::new(Region::with_capacity(capacity)),
}
}
pub fn read(&self) -> RwLockReadGuard<'_, Region<T>> {
self.inner.read().unwrap_or_else(PoisonError::into_inner)
}
pub fn write(&self) -> RwLockWriteGuard<'_, Region<T>> {
self.inner.write().unwrap_or_else(PoisonError::into_inner)
}
pub fn insert(&self, value: T) -> Handle<T> {
self.write().insert(value)
}
pub fn remove(&self, handle: Handle<T>) -> Option<T> {
self.write().remove(handle)
}
#[must_use]
pub fn contains(&self, handle: Handle<T>) -> bool {
self.read().contains(handle)
}
#[must_use]
pub fn len(&self) -> usize {
self.read().len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.read().is_empty()
}
pub fn clear(&self) {
self.write().clear();
}
pub fn get_cloned(&self, handle: Handle<T>) -> Option<T>
where
T: Clone,
{
self.read().get(handle).cloned()
}
}
impl<T> Default for SyncRegion<T> {
fn default() -> Self {
Self::new()
}
}