use std::{cell, marker, pin};
use crate::base::cell::{Sealed, brand, region};
#[repr(transparent)]
pub(in crate::base::cell) struct Token<B: Sealed> {
proof: marker::PhantomData<B>,
}
#[derive(Debug)]
#[repr(transparent)]
pub(in crate::base::cell) struct Value<B: Sealed, T> {
value: cell::UnsafeCell<T>,
brand: marker::PhantomData<B>,
}
impl<B: Sealed> Token<B> {
pub(in crate::base::cell) const fn new() -> Self {
Self {
proof: marker::PhantomData,
}
}
pub(in crate::base::cell) fn borrow<'a, T>(&'a self, value: &'a Value<B, T>) -> &'a T {
unsafe { &*value.value.get() }
}
pub(in crate::base::cell) fn borrow_mut<'a, T: Unpin>(
&'a mut self,
value: &'a Value<B, T>,
) -> &'a mut T {
unsafe { &mut *value.value.get() }
}
}
impl<B: brand::Brand> brand::Token<B> {
pub fn pin_mut<'a, T>(
&'a mut self,
value: pin::Pin<&'a brand::Value<B, T>>,
) -> pin::Pin<&'a mut T> {
unsafe { pin::Pin::new_unchecked(&mut *value.value.value.get()) }
}
pub fn borrow_pin<'a, T>(&'a self, value: pin::Pin<&'a brand::Value<B, T>>) -> pin::Pin<&'a T> {
unsafe { pin::Pin::new_unchecked(self.token.borrow(&value.get_ref().value)) }
}
}
impl<B: Sealed, T> Value<B, T> {
pub(in crate::base::cell) const fn new(value: T) -> Self {
Self {
value: cell::UnsafeCell::new(value),
brand: marker::PhantomData,
}
}
}
impl<B: region::Brand, T> region::Value<B, T> {
pub fn get_mut(&mut self) -> &mut T {
self.value.value.get_mut()
}
pub fn into_inner(self) -> T {
self.value.value.into_inner()
}
}