use crate::{interfaces::IUnknown, ComInterface, ComPtr};
pub struct ComRc<T: ComInterface + ?Sized> {
ptr: ComPtr<T>,
}
impl<T: ComInterface + ?Sized> ComRc<T> {
pub fn new(ptr: ComPtr<T>) -> ComRc<T> {
ComRc { ptr }
}
pub unsafe fn from_raw(ptr: *mut *mut <T as ComInterface>::VTable) -> Self {
Self::new(ComPtr::new(ptr))
}
pub fn as_raw(&self) -> *mut *mut <T as ComInterface>::VTable {
self.ptr.as_raw()
}
pub fn get_interface<I: ComInterface + ?Sized>(&self) -> Option<ComRc<I>> {
self.ptr.get_interface().map(|ptr| ptr.upgrade())
}
}
impl<T: ComInterface + ?Sized> Drop for ComRc<T> {
fn drop(&mut self) {
unsafe {
self.release();
}
}
}
impl<T: ComInterface + ?Sized> Clone for ComRc<T> {
fn clone(&self) -> Self {
self.ptr.clone().upgrade()
}
}