use std::{marker, mem::ManuallyDrop, ptr};
use crate::mem::rc;
mod sealed;
pub(super) use sealed::Sealed;
#[derive(Debug)]
#[repr(transparent)]
pub struct Owner<T: crate::mem::raw::Target<W>, W: crate::mem::raw::Counter = u32> {
pointer: ptr::NonNull<T>,
ownership: marker::PhantomData<(T, W)>,
}
impl<T: crate::mem::raw::Target<W>, W: crate::mem::raw::Counter> Unpin for Owner<T, W> {}
impl<T: crate::mem::raw::Target<W>, W: crate::mem::raw::Counter> Owner<T, W> {
pub const unsafe fn from_raw(pointer: ptr::NonNull<T>) -> Self {
Self {
pointer,
ownership: marker::PhantomData,
}
}
pub const fn get(&self) -> &T {
unsafe { self.pointer.as_ref() }
}
pub const fn as_ptr(&self) -> ptr::NonNull<T> {
self.pointer
}
pub fn into_raw(self) -> ptr::NonNull<T> {
ManuallyDrop::new(self).pointer
}
pub unsafe fn release_raw(pointer: ptr::NonNull<T>) {
if let rc::Release::Last = unsafe { crate::mem::raw::Edge::<W>::release(pointer.as_ref()) }
{
unsafe { T::destroy(pointer) };
}
}
pub fn try_clone(&self) -> Result<Self, rc::Error> {
let pointer = self.pointer;
unsafe { crate::mem::raw::Edge::<W>::try_retain(self.get()) }?;
Ok(unsafe { Self::from_raw(pointer) })
}
}
impl<T: crate::mem::raw::Target<W>, W: crate::mem::raw::Counter> Drop for Owner<T, W> {
fn drop(&mut self) {
unsafe { Self::release_raw(self.pointer) };
}
}