use std::marker::PhantomData;
use std::ops::Deref;
use std::pin::Pin;
use std::ptr::NonNull;
pub struct Holding<'d, T> {
ptr: NonNull<T>,
_brand: PhantomData<&'d T>,
}
impl<T> Copy for Holding<'_, T> {}
impl<T> Clone for Holding<'_, T> {
#[inline(always)]
fn clone(&self) -> Self {
*self
}
}
impl<'d, T> Holding<'d, T> {
#[inline(always)]
pub fn of(target: Pin<&'d mut T>) -> Self {
let raw = unsafe { target.get_unchecked_mut() };
Self {
ptr: NonNull::from(raw),
_brand: PhantomData,
}
}
#[inline(always)]
pub unsafe fn from_raw(ptr: NonNull<T>) -> Self {
Self {
ptr,
_brand: PhantomData,
}
}
#[inline(always)]
pub fn hold(self) -> Pin<&'d mut T> {
unsafe { Pin::new_unchecked(&mut *self.ptr.as_ptr()) }
}
}
impl<'d, T> Deref for Holding<'d, T> {
type Target = T;
#[inline(always)]
fn deref(&self) -> &T {
unsafe { self.ptr.as_ref() }
}
}