use core::ops::Deref;
use crate::{ffi, Block};
pub struct RcBlock<A, R> {
pub(crate) ptr: *mut Block<A, R>,
}
impl<A, R> RcBlock<A, R> {
pub unsafe fn new(ptr: *mut Block<A, R>) -> Self {
RcBlock { ptr }
}
pub unsafe fn copy(ptr: *mut Block<A, R>) -> Self {
let ptr: *mut Block<A, R> = unsafe { ffi::_Block_copy(ptr.cast()) }.cast();
unsafe { Self::new(ptr) }
}
}
impl<A, R> Clone for RcBlock<A, R> {
fn clone(&self) -> RcBlock<A, R> {
unsafe { RcBlock::copy(self.ptr) }
}
}
impl<A, R> Deref for RcBlock<A, R> {
type Target = Block<A, R>;
fn deref(&self) -> &Block<A, R> {
unsafe { self.ptr.as_ref().unwrap_unchecked() }
}
}
impl<A, R> Drop for RcBlock<A, R> {
fn drop(&mut self) {
unsafe { ffi::_Block_release(self.ptr.cast()) };
}
}