use std::sync::Arc;
use crate::region_cache;
pub struct MemoryRegion<S> {
inner: Arc<Region<S>>,
}
struct Region<S> {
storage: Box<S>,
base: usize,
end: usize,
}
impl<S> MemoryRegion<S> {
pub(crate) fn new(storage: Box<S>, base: usize, end: usize) -> Self {
Self {
inner: Arc::new(Region { storage, base, end }),
}
}
pub fn storage(&self) -> &S {
&self.inner.storage
}
pub fn length(&self) -> usize {
self.inner.end - self.inner.base
}
}
impl<S> Clone for MemoryRegion<S> {
fn clone(&self) -> Self {
Self {
inner: Arc::clone(&self.inner),
}
}
}
impl<S> std::fmt::Debug for MemoryRegion<S> {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("MemoryRegion")
.field("base", &self.inner.base)
.field("length", &self.length())
.field("holders", &Arc::strong_count(&self.inner))
.finish()
}
}
impl<S> Drop for Region<S> {
fn drop(&mut self) {
region_cache::invalidate(self.base, self.end);
}
}