diff --git a/glib/src/object.rs b/glib/src/object.rs index c10fefe2bd8b..b48b9a95445c 100644 --- a/glib/src/object.rs +++ b/glib/src/object.rs @@ -3429,6 +3429,35 @@ impl<T: ObjectType> WeakRef<T> { } } } + + // rustdoc-stripper-ignore-next + /// Try to upgrade this weak reference to a strong reference. + /// + /// If the stored object was already destroyed or no object was set, the + /// reference is updated to `value`, which is then returned + #[inline] + pub fn upgrade_or_insert(&self, value: T) -> T { + self.upgrade_or_insert_with(|| value) + } + + // rustdoc-stripper-ignore-next + /// Try to upgrade this weak reference to a strong reference. + /// + /// If the stored object was already destroyed or no object was set, the + /// reference is updated to the result of `f`, which is then returned + #[inline] + pub fn upgrade_or_insert_with<F>(&self, f: F) -> T + where + F: FnOnce() -> T, + { + if let Some(object) = self.upgrade() { + object + } else { + let object = f(); + self.set(Some(&object)); + object + } + } } impl<T: ObjectType> Drop for WeakRef<T> {