#![warn(missing_docs)]
use std::{
rc::Rc,
cell::RefCell,
ops::Deref,
alloc::{alloc, Layout}
};
#[derive(Clone, Debug)]
pub struct ProcessOwned<T> {
value: Rc<T>
}
impl<T> ProcessOwned<T> {
pub fn new(value: T) -> Self {
ProcessOwned {
value: Rc::new(value)
}
}
}
impl<T> Deref for ProcessOwned<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
#[derive(Clone, Debug)]
pub struct ProcessOwnedMut<T> {
value: Rc<RefCell<T>>
}
impl<T> ProcessOwnedMut<T> {
pub fn new(value: T) -> Self {
ProcessOwnedMut {
value: Rc::new(RefCell::new(value))
}
}
}
impl<T> Deref for ProcessOwnedMut<T> {
type Target = RefCell<T>;
fn deref(&self) -> &Self::Target {
&self.value
}
}
#[derive(Clone, Debug)]
pub struct Immortal<T> {
value: *const T
}
impl<T> Immortal<T> {
pub unsafe fn new(value: T) -> Self {
let layout = Layout::new::<T>();
let ptr = alloc(layout) as *mut T;
*ptr = value;
Immortal {
value: ptr
}
}
}
impl<T> From<Immortal<T>> for *const T {
fn from(immortal: Immortal<T>) -> Self {
immortal.value
}
}
impl<T> Deref for Immortal<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
unsafe { &*self.value }
}
}