use std::ops::Deref;
#[allow(clippy::missing_safety_doc)]
pub unsafe trait RefTarget {
unsafe fn add_ref(value: *const Self);
unsafe fn release(value: *const Self);
}
unsafe impl RefTarget for joltc_sys::JPC_Shape {
unsafe fn add_ref(value: *const Self) {
joltc_sys::JPC_Shape_AddRef(value);
}
unsafe fn release(value: *const Self) {
joltc_sys::JPC_Shape_Release(value);
}
}
pub struct Ref<T: RefTarget> {
ptr: *const T,
}
impl<T: RefTarget> Ref<T> {
pub unsafe fn from_active(ptr: *const T) -> Self {
Self { ptr }
}
}
impl<T: RefTarget> Deref for Ref<T> {
type Target = *const T;
fn deref(&self) -> &Self::Target {
&self.ptr
}
}
impl<T: RefTarget> Clone for Ref<T> {
fn clone(&self) -> Self {
unsafe {
T::add_ref(self.ptr);
}
Self { ptr: self.ptr }
}
}
impl<T: RefTarget> Drop for Ref<T> {
fn drop(&mut self) {
unsafe {
T::release(self.ptr);
}
}
}