| 1 | use super::*; |
| 2 | use core::marker::PhantomData; |
| 3 | |
| 4 | /// `Weak` holds a non-owning reference to an object. |
| 5 | #[derive (Clone, PartialEq, Eq, Default)] |
| 6 | pub struct Weak<I: Interface>(Option<imp::IWeakReference>, PhantomData<I>); |
| 7 | |
| 8 | impl<I: Interface> Weak<I> { |
| 9 | /// Creates a new `Weak` object without any backing object. |
| 10 | pub const fn new() -> Self { |
| 11 | Self(None, PhantomData) |
| 12 | } |
| 13 | |
| 14 | /// Attempts to upgrade the weak reference to a strong reference. |
| 15 | pub fn upgrade(&self) -> Option<I> { |
| 16 | self.0 |
| 17 | .as_ref() |
| 18 | .and_then(|inner: &IWeakReference| unsafe { inner.Resolve().ok() }) |
| 19 | } |
| 20 | |
| 21 | pub(crate) fn downgrade(source: &imp::IWeakReferenceSource) -> Result<Self> { |
| 22 | let reference: Option = unsafe { source.GetWeakReference().ok() }; |
| 23 | Ok(Self(reference, PhantomData)) |
| 24 | } |
| 25 | } |
| 26 | |
| 27 | unsafe impl<I: Interface> Send for Weak<I> {} |
| 28 | unsafe impl<I: Interface> Sync for Weak<I> {} |
| 29 | |