use std::{
convert::Infallible,
marker::PhantomData,
ops::{Deref, DerefMut},
};
use crate::{cell::Cell, MemoryError};
#[cfg(unix)]
pub struct NoAccess;
pub struct ReadOnly;
pub struct ReadWrite;
#[cfg(unix)]
pub struct MemSafe<T, State = NoAccess> {
cell: Cell<T>,
_state: PhantomData<State>,
}
#[cfg(windows)]
pub struct MemSafe<T, State = ReadOnly> {
cell: Cell<T>,
_state: PhantomData<State>,
}
#[cfg(unix)]
unsafe impl<T> Sync for MemSafe<T, NoAccess> where T: Sync {}
unsafe impl<T> Sync for MemSafe<T, ReadOnly> where T: Sync {}
#[cfg(unix)]
unsafe impl<T> Send for MemSafe<T, NoAccess> where T: Send {}
unsafe impl<T> Send for MemSafe<T, ReadOnly> where T: Send {}
unsafe impl<T> Send for MemSafe<T, ReadWrite> where T: Send {}
#[cfg(unix)]
impl<T> MemSafe<T, NoAccess> {
pub fn new(value: T) -> Result<Self, MemoryError> {
Ok(MemSafe {
cell: Cell::new(value)?,
_state: Default::default(),
})
}
pub fn no_access(self) -> Result<Self, Infallible> {
Ok(self)
}
pub fn read_only(mut self) -> Result<MemSafe<T, ReadOnly>, MemoryError> {
self.cell.read_only()?;
let new_self = MemSafe {
cell: self.cell,
_state: Default::default(),
};
Ok(new_self)
}
pub fn read_write(mut self) -> Result<MemSafe<T, ReadWrite>, MemoryError> {
self.cell.read_write()?;
let new_self = MemSafe {
cell: self.cell,
_state: Default::default(),
};
Ok(new_self)
}
}
impl<T> MemSafe<T, ReadOnly> {
#[cfg(windows)]
pub fn new(value: T) -> Result<Self, MemoryError> {
Ok(MemSafe {
cell: Cell::new(value)?,
_state: Default::default(),
})
}
#[cfg(unix)]
pub fn no_access(mut self) -> Result<MemSafe<T, NoAccess>, MemoryError> {
self.cell.no_access()?;
let new_self = MemSafe {
cell: self.cell,
_state: Default::default(),
};
Ok(new_self)
}
pub fn read_only(self) -> Result<Self, Infallible> {
Ok(self)
}
pub fn read_write(mut self) -> Result<MemSafe<T, ReadWrite>, MemoryError> {
self.cell.read_write()?;
let new_self = MemSafe {
cell: self.cell,
_state: Default::default(),
};
Ok(new_self)
}
}
impl<T> MemSafe<T, ReadWrite> {
#[cfg(unix)]
pub fn no_access(mut self) -> Result<MemSafe<T, NoAccess>, MemoryError> {
self.cell.no_access()?;
let new_self = MemSafe {
cell: self.cell,
_state: Default::default(),
};
Ok(new_self)
}
pub fn read_only(mut self) -> Result<MemSafe<T, ReadOnly>, MemoryError> {
self.cell.read_only()?;
let new_self = MemSafe {
cell: self.cell,
_state: Default::default(),
};
Ok(new_self)
}
pub fn read_write(self) -> Result<Self, Infallible> {
Ok(self)
}
}
impl<T> Deref for MemSafe<T, ReadOnly> {
type Target = T;
fn deref(&self) -> &Self::Target {
self.cell.deref()
}
}
impl<T> AsRef<T> for MemSafe<T, ReadOnly> {
fn as_ref(&self) -> &T {
self.cell.deref()
}
}
impl<T> Deref for MemSafe<T, ReadWrite> {
type Target = T;
fn deref(&self) -> &Self::Target {
self.cell.deref()
}
}
impl<T> AsRef<T> for MemSafe<T, ReadWrite> {
fn as_ref(&self) -> &T {
self.cell.deref()
}
}
impl<T> DerefMut for MemSafe<T, ReadWrite> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.cell.deref_mut()
}
}
impl<T> AsMut<T> for MemSafe<T, ReadWrite> {
fn as_mut(&mut self) -> &mut T {
self.cell.deref_mut()
}
}