Rollup merge of #55987 - Thomasdezeeuw:weak-ptr_eq, r=sfackler
Add Weak.ptr_eq I hope the doc tests alone are good enough. We also might want to discuss the dangling pointer case (from `Weak::new()`). Updates #55981.
This commit is contained in:
commit
1594a4245b
2 changed files with 95 additions and 1 deletions
|
@ -1187,8 +1187,9 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Weak<U>> for Weak<T> {}
|
|||
|
||||
impl<T> Weak<T> {
|
||||
/// Constructs a new `Weak<T>`, without allocating any memory.
|
||||
/// Calling [`upgrade`][Weak::upgrade] on the return value always gives [`None`].
|
||||
/// Calling [`upgrade`] on the return value always gives [`None`].
|
||||
///
|
||||
/// [`upgrade`]: #method.upgrade
|
||||
/// [`None`]: ../../std/option/enum.Option.html
|
||||
///
|
||||
/// # Examples
|
||||
|
@ -1260,6 +1261,52 @@ impl<T: ?Sized> Weak<T> {
|
|||
Some(unsafe { self.ptr.as_ref() })
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns true if the two `Weak`s point to the same value (not just values
|
||||
/// that compare as equal).
|
||||
///
|
||||
/// # Notes
|
||||
///
|
||||
/// Since this compares pointers it means that `Weak::new()` will equal each
|
||||
/// other, even though they don't point to any value.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(weak_ptr_eq)]
|
||||
/// use std::rc::{Rc, Weak};
|
||||
///
|
||||
/// let first_rc = Rc::new(5);
|
||||
/// let first = Rc::downgrade(&first_rc);
|
||||
/// let second = Rc::downgrade(&first_rc);
|
||||
///
|
||||
/// assert!(Weak::ptr_eq(&first, &second));
|
||||
///
|
||||
/// let third_rc = Rc::new(5);
|
||||
/// let third = Rc::downgrade(&third_rc);
|
||||
///
|
||||
/// assert!(!Weak::ptr_eq(&first, &third));
|
||||
/// ```
|
||||
///
|
||||
/// Comparing `Weak::new`.
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(weak_ptr_eq)]
|
||||
/// use std::rc::{Rc, Weak};
|
||||
///
|
||||
/// let first = Weak::new();
|
||||
/// let second = Weak::new();
|
||||
/// assert!(Weak::ptr_eq(&first, &second));
|
||||
///
|
||||
/// let third_rc = Rc::new(());
|
||||
/// let third = Rc::downgrade(&third_rc);
|
||||
/// assert!(!Weak::ptr_eq(&first, &third));
|
||||
/// ```
|
||||
#[inline]
|
||||
#[unstable(feature = "weak_ptr_eq", issue = "55981")]
|
||||
pub fn ptr_eq(this: &Self, other: &Self) -> bool {
|
||||
this.ptr.as_ptr() == other.ptr.as_ptr()
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "rc_weak", since = "1.4.0")]
|
||||
|
|
|
@ -1130,6 +1130,53 @@ impl<T: ?Sized> Weak<T> {
|
|||
Some(unsafe { self.ptr.as_ref() })
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns true if the two `Weak`s point to the same value (not just values
|
||||
/// that compare as equal).
|
||||
///
|
||||
/// # Notes
|
||||
///
|
||||
/// Since this compares pointers it means that `Weak::new()` will equal each
|
||||
/// other, even though they don't point to any value.
|
||||
///
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(weak_ptr_eq)]
|
||||
/// use std::sync::{Arc, Weak};
|
||||
///
|
||||
/// let first_rc = Arc::new(5);
|
||||
/// let first = Arc::downgrade(&first_rc);
|
||||
/// let second = Arc::downgrade(&first_rc);
|
||||
///
|
||||
/// assert!(Weak::ptr_eq(&first, &second));
|
||||
///
|
||||
/// let third_rc = Arc::new(5);
|
||||
/// let third = Arc::downgrade(&third_rc);
|
||||
///
|
||||
/// assert!(!Weak::ptr_eq(&first, &third));
|
||||
/// ```
|
||||
///
|
||||
/// Comparing `Weak::new`.
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(weak_ptr_eq)]
|
||||
/// use std::sync::{Arc, Weak};
|
||||
///
|
||||
/// let first = Weak::new();
|
||||
/// let second = Weak::new();
|
||||
/// assert!(Weak::ptr_eq(&first, &second));
|
||||
///
|
||||
/// let third_rc = Arc::new(());
|
||||
/// let third = Arc::downgrade(&third_rc);
|
||||
/// assert!(!Weak::ptr_eq(&first, &third));
|
||||
/// ```
|
||||
#[inline]
|
||||
#[unstable(feature = "weak_ptr_eq", issue = "55981")]
|
||||
pub fn ptr_eq(this: &Self, other: &Self) -> bool {
|
||||
this.ptr.as_ptr() == other.ptr.as_ptr()
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "arc_weak", since = "1.4.0")]
|
||||
|
|
Loading…
Reference in a new issue