use super::*; use core::marker::PhantomData; /// `Weak` holds a non-owning reference to an object. #[derive(Clone, PartialEq, Eq, Default)] pub struct Weak(Option, PhantomData); impl Weak { /// Creates a new `Weak` object without any backing object. pub const fn new() -> Self { Self(None, PhantomData) } /// Attempts to upgrade the weak reference to a strong reference. pub fn upgrade(&self) -> Option { self.0 .as_ref() .and_then(|inner| unsafe { inner.Resolve().ok() }) } pub(crate) fn downgrade(source: &imp::IWeakReferenceSource) -> Result { let reference = unsafe { source.GetWeakReference().ok() }; Ok(Self(reference, PhantomData)) } } unsafe impl Send for Weak {} unsafe impl Sync for Weak {}