]> git.proxmox.com Git - rustc.git/blobdiff - vendor/windows/src/core/weak.rs
Update upstream source from tag 'upstream/1.70.0+dfsg1'
[rustc.git] / vendor / windows / src / core / weak.rs
diff --git a/vendor/windows/src/core/weak.rs b/vendor/windows/src/core/weak.rs
new file mode 100644 (file)
index 0000000..4301f8e
--- /dev/null
@@ -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<I: ComInterface>(Option<IWeakReference>, PhantomData<I>);
+
+impl<I: ComInterface> Weak<I> {
+    /// 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<I> {
+        self.0.as_ref().and_then(|inner| unsafe { inner.Resolve().ok() })
+    }
+
+    pub(crate) fn downgrade(source: &IWeakReferenceSource) -> Result<Self> {
+        let reference = unsafe { source.GetWeakReference().ok() };
+        Ok(Self(reference, PhantomData))
+    }
+}