use core::{cell::UnsafeCell, marker::PhantomPinned};

#[derive(Debug, Default)]
pub struct UnsafePinned<T: ?Sized> {
    _phantom: PhantomPinned,
    value: UnsafeCell<T>,
}

unsafe impl<T: ?Sized + Sync> Sync for UnsafePinned<T> {}

impl<T> UnsafePinned<T> {
    pub const fn new(inner: T) -> Self {
        Self {
            _phantom: PhantomPinned,
            value: UnsafeCell::new(inner),
        }
    }

    #[allow(dead_code)]
    pub fn into_inner(self) -> T {
        self.value.into_inner()
    }
}
impl<T: ?Sized> UnsafePinned<T> {
    #[inline(always)]
    pub const fn get(&self) -> *mut T {
        self.value.get()
    }

    #[allow(dead_code)]
    #[inline(always)]
    pub const fn raw_get(this: *const Self) -> *mut T {
        UnsafeCell::raw_get(this as _)
    }
}
