use super::*; use std::marker::PhantomData; /// A type representing an agile reference to a COM/WinRT object. #[repr(transparent)] #[derive(Clone, PartialEq, Eq)] pub struct AgileReference(crate::imp::IAgileReference, PhantomData); impl AgileReference { /// Creates an agile reference to the object. pub fn new(object: &T) -> Result { unsafe { crate::imp::RoGetAgileReference(crate::imp::AGILEREFERENCE_DEFAULT, &T::IID, object.as_unknown()).map(|reference| Self(reference, Default::default())) } } /// Retrieves a proxy to the target of the `AgileReference` object that may safely be used within any thread context in which get is called. pub fn resolve(&self) -> Result { unsafe { self.0.Resolve() } } } unsafe impl Send for AgileReference {} unsafe impl Sync for AgileReference {} impl std::fmt::Debug for AgileReference { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "AgileReference({:?})", &self.0) } }