use core::{marker::PhantomData, ptr::NonNull};
use std_alloc::boxed::Box;
#[repr(transparent)]
pub(crate) struct OwnedPtr<T>
where
T: ?Sized,
{
ptr: NonNull<T>,
}
impl<T> OwnedPtr<T> {
pub(crate) fn new(ptr: NonNull<T>) -> Self {
OwnedPtr { ptr }
}
pub(crate) fn cast<U>(self) -> OwnedPtr<U> {
OwnedPtr::new(self.ptr.cast())
}
pub(crate) fn raw_copy(&self) -> Self {
Self::new(self.ptr)
}
pub(crate) fn into_non_null(self) -> NonNull<T> {
self.ptr
}
pub(crate) unsafe fn as_ref(&self) -> &T {
unsafe { self.ptr.as_ref() }
}
pub(crate) unsafe fn into_box(self) -> Box<T> {
unsafe { Box::from_raw(self.ptr.as_ptr()) }
}
}
#[repr(transparent)]
pub(crate) struct SharedPtr<'a, T>
where
T: ?Sized,
{
ptr: NonNull<T>,
_lifetime: PhantomData<&'a T>,
}
impl<'a, T> core::fmt::Debug for SharedPtr<'a, T>
where
T: ?Sized,
{
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("SharedPtr").field("ptr", &self.ptr).finish()
}
}
impl<T> Clone for SharedPtr<'_, T>
where
T: ?Sized,
{
fn clone(&self) -> Self {
*self
}
}
impl<'a, T> SharedPtr<'a, T>
where
T: ?Sized,
{
pub(crate) fn new(ptr: NonNull<T>) -> Self {
SharedPtr {
ptr,
_lifetime: PhantomData,
}
}
pub(crate) fn cast<U>(self) -> SharedPtr<'a, U> {
SharedPtr::new(self.ptr.cast())
}
pub(crate) unsafe fn as_ref(self) -> &'a T {
unsafe { self.ptr.as_ref() }
}
}
impl<T> Copy for SharedPtr<'_, T> where T: ?Sized {}
#[repr(transparent)]
pub(crate) struct MutPtr<'a, T>
where
T: ?Sized,
{
ptr: NonNull<T>,
_lifetime: PhantomData<&'a mut T>,
}
impl<'a, T> MutPtr<'a, T>
where
T: ?Sized,
{
pub(crate) fn new(ptr: NonNull<T>) -> Self {
MutPtr {
ptr,
_lifetime: PhantomData,
}
}
pub(crate) fn raw_copy(&self) -> Self {
Self::new(self.ptr)
}
pub(crate) fn cast<U>(self) -> MutPtr<'a, U> {
MutPtr::new(self.ptr.cast())
}
pub(crate) fn as_shared_ptr(&self) -> SharedPtr<'_, T> {
SharedPtr::new(self.ptr)
}
pub(crate) unsafe fn as_ref(&self) -> &'a T {
unsafe { self.ptr.as_ref() }
}
pub(crate) unsafe fn as_mut(&mut self) -> &'a mut T {
unsafe { self.ptr.as_mut() }
}
}