3 use std
::marker
::PhantomData
;
5 /// `Weak` holds a non-owning reference to an object.
6 #[derive(Clone, PartialEq, Eq, Default)]
7 pub struct Weak
<I
: ComInterface
>(Option
<IWeakReference
>, PhantomData
<I
>);
9 impl<I
: ComInterface
> Weak
<I
> {
10 /// Creates a new `Weak` object without any backing object.
11 pub fn new() -> Self {
12 Self(None
, PhantomData
)
15 /// Attempts to upgrade the weak reference to a strong reference.
16 pub fn upgrade(&self) -> Option
<I
> {
17 self.0.as_ref().and_then(|inner
| unsafe { inner.Resolve().ok() }
)
20 pub(crate) fn downgrade(source
: &IWeakReferenceSource
) -> Result
<Self> {
21 let reference
= unsafe { source.GetWeakReference().ok() }
;
22 Ok(Self(reference
, PhantomData
))