use super::*;
pub unsafe trait ComInterface: Interface + Clone {
const IID: GUID;
fn as_unknown(&self) -> &IUnknown {
unsafe { std::mem::transmute(self) }
}
fn cast<T: ComInterface>(&self) -> Result<T> {
let mut result = None;
unsafe { self.query(&T::IID, &mut result as *mut _ as _).and_some(result) }
}
fn downgrade(&self) -> Result<Weak<Self>> {
self.cast::<crate::imp::IWeakReferenceSource>().and_then(|source| Weak::downgrade(&source))
}
#[doc(hidden)]
unsafe fn query(&self, iid: &GUID, interface: *mut *const std::ffi::c_void) -> HRESULT {
(self.assume_vtable::<IUnknown>().QueryInterface)(self.as_raw(), iid, interface)
}
}