use super::*; use std::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 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: &crate::imp::IWeakReferenceSource) -> Result { let reference = unsafe { source.GetWeakReference().ok() }; Ok(Self(reference, PhantomData)) } }