X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=vendor%2Fwindows%2Fsrc%2Fcore%2Fweak.rs;fp=vendor%2Fwindows%2Fsrc%2Fcore%2Fweak.rs;h=4301f8ed1959151083cccb3b8299f45c18ef483b;hb=26c9e740979f0063790cbc37e8c490da76ec0743;hp=0000000000000000000000000000000000000000;hpb=e1ed88c81f28226936b0f9d0358d45bb02563e4f;p=rustc.git diff --git a/vendor/windows/src/core/weak.rs b/vendor/windows/src/core/weak.rs new file mode 100644 index 0000000000..4301f8ed19 --- /dev/null +++ b/vendor/windows/src/core/weak.rs @@ -0,0 +1,24 @@ +use super::*; +use imp::*; +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: &IWeakReferenceSource) -> Result { + let reference = unsafe { source.GetWeakReference().ok() }; + Ok(Self(reference, PhantomData)) + } +}