use std::ops::Deref;
use stable_deref_trait::StableDeref;
use super::*;
pub(crate) struct OwnedCell<O, D> {
dep: D,
_owner: O,
}
impl<O, D> OwnedCell<O, D>
where
O: StableDeref + DerefMut,
{
pub(crate) fn try_make<'a, E>(
mut owner: O,
make_dependent: impl FnOnce(&'a mut O::Target) -> Result<D, E>,
) -> Result<Self, E>
where
O::Target: 'a,
{
let stable_deref: *mut O::Target = owner.deref_mut();
Ok(Self {
_owner: owner,
dep: make_dependent(unsafe { &mut *stable_deref })?,
})
}
pub(crate) fn move_dependent<R>(self, f: impl FnOnce(D) -> R) -> R {
f(self.dep)
}
}
impl<O, D> Deref for OwnedCell<O, D> {
type Target = D;
fn deref(&self) -> &Self::Target {
&self.dep
}
}
impl<O, D> DerefMut for OwnedCell<O, D> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.dep
}
}