use super::{leptonica_destroy::LeptonicaDestroy, LeptonicaClone, RefCounted};
use std::ops::{Deref, DerefMut};
pub struct RefCountedExclusive<T: LeptonicaDestroy> {
inner: T,
}
impl<T: LeptonicaDestroy> RefCountedExclusive<T> {
pub unsafe fn new(inner: T) -> Self {
Self { inner }
}
}
impl<T: LeptonicaDestroy + LeptonicaClone> RefCountedExclusive<T> {
pub fn to_ref_counted(mut self) -> RefCounted<T> {
unsafe { RefCounted::new(self.inner.clone()) }
}
}
impl<T: LeptonicaDestroy> Drop for RefCountedExclusive<T> {
fn drop(&mut self) {
unsafe { self.inner.destroy() }
}
}
impl<T: LeptonicaDestroy> Deref for RefCountedExclusive<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<T: LeptonicaDestroy> DerefMut for RefCountedExclusive<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}