do all the same edits with Arc

This commit is contained in:
Ralf Jung 2019-10-19 13:48:02 +02:00
parent 52a31f7a00
commit 1b3846359a

View File

@ -45,10 +45,10 @@
/// ///
/// The type `Arc<T>` provides shared ownership of a value of type `T`, /// The type `Arc<T>` provides shared ownership of a value of type `T`,
/// allocated in the heap. Invoking [`clone`][clone] on `Arc` produces /// allocated in the heap. Invoking [`clone`][clone] on `Arc` produces
/// a new `Arc` instance, which points to the same value on the heap as the /// a new `Arc` instance, which points to the same allocation on the heap as the
/// source `Arc`, while increasing a reference count. When the last `Arc` /// source `Arc`, while increasing a reference count. When the last `Arc`
/// pointer to a given value is destroyed, the pointed-to value is also /// pointer to a given allocation is destroyed, the value stored in that allocation (often
/// destroyed. /// referred to as "inner value") is also dropped.
/// ///
/// Shared references in Rust disallow mutation by default, and `Arc` is no /// Shared references in Rust disallow mutation by default, and `Arc` is no
/// exception: you cannot generally obtain a mutable reference to something /// exception: you cannot generally obtain a mutable reference to something
@ -61,7 +61,7 @@
/// Unlike [`Rc<T>`], `Arc<T>` uses atomic operations for its reference /// Unlike [`Rc<T>`], `Arc<T>` uses atomic operations for its reference
/// counting. This means that it is thread-safe. The disadvantage is that /// counting. This means that it is thread-safe. The disadvantage is that
/// atomic operations are more expensive than ordinary memory accesses. If you /// atomic operations are more expensive than ordinary memory accesses. If you
/// are not sharing reference-counted values between threads, consider using /// are not sharing reference-counted allocations between threads, consider using
/// [`Rc<T>`] for lower overhead. [`Rc<T>`] is a safe default, because the /// [`Rc<T>`] for lower overhead. [`Rc<T>`] is a safe default, because the
/// compiler will catch any attempt to send an [`Rc<T>`] between threads. /// compiler will catch any attempt to send an [`Rc<T>`] between threads.
/// However, a library might choose `Arc<T>` in order to give library consumers /// However, a library might choose `Arc<T>` in order to give library consumers
@ -85,8 +85,10 @@
/// ///
/// The [`downgrade`][downgrade] method can be used to create a non-owning /// The [`downgrade`][downgrade] method can be used to create a non-owning
/// [`Weak`][weak] pointer. A [`Weak`][weak] pointer can be [`upgrade`][upgrade]d /// [`Weak`][weak] pointer. A [`Weak`][weak] pointer can be [`upgrade`][upgrade]d
/// to an `Arc`, but this will return [`None`] if the value has already been /// to an `Arc`, but this will return [`None`] if the value stored in the allocation has
/// dropped. /// already been dropped. In other words, `Weak` pointers do not keep the value
/// inside the allocation alive; however, they *do* keep the allocation
/// (the backing store for the value) alive.
/// ///
/// A cycle between `Arc` pointers will never be deallocated. For this reason, /// A cycle between `Arc` pointers will never be deallocated. For this reason,
/// [`Weak`][weak] is used to break cycles. For example, a tree could have /// [`Weak`][weak] is used to break cycles. For example, a tree could have
@ -121,8 +123,8 @@
/// Arc::downgrade(&my_arc); /// Arc::downgrade(&my_arc);
/// ``` /// ```
/// ///
/// [`Weak<T>`][weak] does not auto-dereference to `T`, because the value may have /// [`Weak<T>`][weak] does not auto-dereference to `T`, because the inner value may have
/// already been destroyed. /// already been dropped.
/// ///
/// [arc]: struct.Arc.html /// [arc]: struct.Arc.html
/// [weak]: struct.Weak.html /// [weak]: struct.Weak.html
@ -221,17 +223,18 @@ unsafe fn from_ptr(ptr: *mut ArcInner<T>) -> Self {
} }
/// `Weak` is a version of [`Arc`] that holds a non-owning reference to the /// `Weak` is a version of [`Arc`] that holds a non-owning reference to the
/// managed value. The value is accessed by calling [`upgrade`] on the `Weak` /// managed allocation. The allocation is accessed by calling [`upgrade`] on the `Weak`
/// pointer, which returns an [`Option`]`<`[`Arc`]`<T>>`. /// pointer, which returns an [`Option`]`<`[`Arc`]`<T>>`.
/// ///
/// Since a `Weak` reference does not count towards ownership, it will not /// Since a `Weak` reference does not count towards ownership, it will not
/// prevent the inner value from being dropped, and `Weak` itself makes no /// prevent the value stored in the allocation from being dropped, and `Weak` itself makes no
/// guarantees about the value still being present and may return [`None`] /// guarantees about the value still being present. Thus it may return [`None`]
/// when [`upgrade`]d. /// when [`upgrade`]d. Note however that a `Weak` reference *does* prevent the allocation
/// itself (the backing store) from being deallocated.
/// ///
/// A `Weak` pointer is useful for keeping a temporary reference to the value /// A `Weak` pointer is useful for keeping a temporary reference to the allocation
/// within [`Arc`] without extending its lifetime. It is also used to prevent /// managed by [`Arc`] without preventing its inner value from being dropped. It is also used to
/// circular references between [`Arc`] pointers, since mutual owning references /// prevent circular references between [`Arc`] pointers, since mutual owning references
/// would never allow either [`Arc`] to be dropped. For example, a tree could /// would never allow either [`Arc`] to be dropped. For example, a tree could
/// have strong [`Arc`] pointers from parent nodes to children, and `Weak` /// have strong [`Arc`] pointers from parent nodes to children, and `Weak`
/// pointers from children back to their parents. /// pointers from children back to their parents.
@ -345,7 +348,7 @@ pub fn pin(data: T) -> Pin<Arc<T>> {
unsafe { Pin::new_unchecked(Arc::new(data)) } unsafe { Pin::new_unchecked(Arc::new(data)) }
} }
/// Returns the contained value, if the `Arc` has exactly one strong reference. /// Returns the inner value, if the `Arc` has exactly one strong reference.
/// ///
/// Otherwise, an [`Err`][result] is returned with the same `Arc` that was /// Otherwise, an [`Err`][result] is returned with the same `Arc` that was
/// passed in. /// passed in.
@ -426,7 +429,7 @@ impl<T> Arc<mem::MaybeUninit<T>> {
/// # Safety /// # Safety
/// ///
/// As with [`MaybeUninit::assume_init`], /// As with [`MaybeUninit::assume_init`],
/// it is up to the caller to guarantee that the value /// it is up to the caller to guarantee that the inner value
/// really is in an initialized state. /// really is in an initialized state.
/// Calling this when the content is not yet fully initialized /// Calling this when the content is not yet fully initialized
/// causes immediate undefined behavior. /// causes immediate undefined behavior.
@ -465,7 +468,7 @@ impl<T> Arc<[mem::MaybeUninit<T>]> {
/// # Safety /// # Safety
/// ///
/// As with [`MaybeUninit::assume_init`], /// As with [`MaybeUninit::assume_init`],
/// it is up to the caller to guarantee that the value /// it is up to the caller to guarantee that the inner value
/// really is in an initialized state. /// really is in an initialized state.
/// Calling this when the content is not yet fully initialized /// Calling this when the content is not yet fully initialized
/// causes immediate undefined behavior. /// causes immediate undefined behavior.
@ -584,7 +587,7 @@ pub fn into_raw_non_null(this: Self) -> NonNull<T> {
unsafe { NonNull::new_unchecked(Arc::into_raw(this) as *mut _) } unsafe { NonNull::new_unchecked(Arc::into_raw(this) as *mut _) }
} }
/// Creates a new [`Weak`][weak] pointer to this value. /// Creates a new [`Weak`][weak] pointer to this allocation.
/// ///
/// [weak]: struct.Weak.html /// [weak]: struct.Weak.html
/// ///
@ -628,7 +631,7 @@ pub fn downgrade(this: &Self) -> Weak<T> {
} }
} }
/// Gets the number of [`Weak`][weak] pointers to this value. /// Gets the number of [`Weak`][weak] pointers to this allocation.
/// ///
/// [weak]: struct.Weak.html /// [weak]: struct.Weak.html
/// ///
@ -659,7 +662,7 @@ pub fn weak_count(this: &Self) -> usize {
if cnt == usize::MAX { 0 } else { cnt - 1 } if cnt == usize::MAX { 0 } else { cnt - 1 }
} }
/// Gets the number of strong (`Arc`) pointers to this value. /// Gets the number of strong (`Arc`) pointers to this allocation.
/// ///
/// # Safety /// # Safety
/// ///
@ -710,8 +713,8 @@ unsafe fn drop_slow(&mut self) {
#[inline] #[inline]
#[stable(feature = "ptr_eq", since = "1.17.0")] #[stable(feature = "ptr_eq", since = "1.17.0")]
/// Returns `true` if the two `Arc`s point to the same value (not /// Returns `true` if the two `Arc`s point to the same allocation
/// just values that compare as equal). /// (in a vein similar to [`ptr::eq`]).
/// ///
/// # Examples /// # Examples
/// ///
@ -725,6 +728,8 @@ unsafe fn drop_slow(&mut self) {
/// assert!(Arc::ptr_eq(&five, &same_five)); /// assert!(Arc::ptr_eq(&five, &same_five));
/// assert!(!Arc::ptr_eq(&five, &other_five)); /// assert!(!Arc::ptr_eq(&five, &other_five));
/// ``` /// ```
///
/// [`ptr::eq`]: ../../std/ptr/fn.eq.html
pub fn ptr_eq(this: &Self, other: &Self) -> bool { pub fn ptr_eq(this: &Self, other: &Self) -> bool {
this.ptr.as_ptr() == other.ptr.as_ptr() this.ptr.as_ptr() == other.ptr.as_ptr()
} }
@ -732,7 +737,7 @@ pub fn ptr_eq(this: &Self, other: &Self) -> bool {
impl<T: ?Sized> Arc<T> { impl<T: ?Sized> Arc<T> {
/// Allocates an `ArcInner<T>` with sufficient space for /// Allocates an `ArcInner<T>` with sufficient space for
/// a possibly-unsized value where the value has the layout provided. /// a possibly-unsized inner value where the value has the layout provided.
/// ///
/// The function `mem_to_arcinner` is called with the data pointer /// The function `mem_to_arcinner` is called with the data pointer
/// and must return back a (potentially fat)-pointer for the `ArcInner<T>`. /// and must return back a (potentially fat)-pointer for the `ArcInner<T>`.
@ -761,7 +766,7 @@ unsafe fn allocate_for_layout(
inner inner
} }
/// Allocates an `ArcInner<T>` with sufficient space for an unsized value. /// Allocates an `ArcInner<T>` with sufficient space for an unsized inner value.
unsafe fn allocate_for_ptr(ptr: *const T) -> *mut ArcInner<T> { unsafe fn allocate_for_ptr(ptr: *const T) -> *mut ArcInner<T> {
// Allocate for the `ArcInner<T>` using the given value. // Allocate for the `ArcInner<T>` using the given value.
Self::allocate_for_layout( Self::allocate_for_layout(
@ -903,7 +908,7 @@ fn from_slice(v: &[T]) -> Self {
impl<T: ?Sized> Clone for Arc<T> { impl<T: ?Sized> Clone for Arc<T> {
/// Makes a clone of the `Arc` pointer. /// Makes a clone of the `Arc` pointer.
/// ///
/// This creates another pointer to the same inner value, increasing the /// This creates another pointer to the same allocation, increasing the
/// strong reference count. /// strong reference count.
/// ///
/// # Examples /// # Examples
@ -965,15 +970,19 @@ impl<T: ?Sized> Receiver for Arc<T> {}
impl<T: Clone> Arc<T> { impl<T: Clone> Arc<T> {
/// Makes a mutable reference into the given `Arc`. /// Makes a mutable reference into the given `Arc`.
/// ///
/// If there are other `Arc` or [`Weak`][weak] pointers to the same value, /// If there are other `Arc` or [`Weak`][weak] pointers to the same allocation,
/// then `make_mut` will invoke [`clone`][clone] on the inner value to /// then `make_mut` will create a new allocation and invoke [`clone`][clone] on the inner value
/// ensure unique ownership. This is also referred to as clone-on-write. /// to ensure unique ownership. This is also referred to as clone-on-write.
///
/// Note that this differs from the behavior of [`Rc::make_mut`] which disassociates
/// any remaining `Weak` pointers.
/// ///
/// See also [`get_mut`][get_mut], which will fail rather than cloning. /// See also [`get_mut`][get_mut], which will fail rather than cloning.
/// ///
/// [weak]: struct.Weak.html /// [weak]: struct.Weak.html
/// [clone]: ../../std/clone/trait.Clone.html#tymethod.clone /// [clone]: ../../std/clone/trait.Clone.html#tymethod.clone
/// [get_mut]: struct.Arc.html#method.get_mut /// [get_mut]: struct.Arc.html#method.get_mut
/// [`Rc::make_mut`]: ../rc/struct.Rc.html#method.make_mut
/// ///
/// # Examples /// # Examples
/// ///
@ -988,7 +997,7 @@ impl<T: Clone> Arc<T> {
/// *Arc::make_mut(&mut data) += 1; // Won't clone anything /// *Arc::make_mut(&mut data) += 1; // Won't clone anything
/// *Arc::make_mut(&mut other_data) *= 2; // Won't clone anything /// *Arc::make_mut(&mut other_data) *= 2; // Won't clone anything
/// ///
/// // Now `data` and `other_data` point to different values. /// // Now `data` and `other_data` point to different allocations.
/// assert_eq!(*data, 8); /// assert_eq!(*data, 8);
/// assert_eq!(*other_data, 12); /// assert_eq!(*other_data, 12);
/// ``` /// ```
@ -1048,14 +1057,14 @@ pub fn make_mut(this: &mut Self) -> &mut T {
} }
impl<T: ?Sized> Arc<T> { impl<T: ?Sized> Arc<T> {
/// Returns a mutable reference to the inner value, if there are /// Returns a mutable reference into the given `Arc`, if there are
/// no other `Arc` or [`Weak`][weak] pointers to the same value. /// no other `Arc` or [`Weak`][weak] pointers to the same allocation.
/// ///
/// Returns [`None`][option] otherwise, because it is not safe to /// Returns [`None`][option] otherwise, because it is not safe to
/// mutate a shared value. /// mutate a shared value.
/// ///
/// See also [`make_mut`][make_mut], which will [`clone`][clone] /// See also [`make_mut`][make_mut], which will [`clone`][clone]
/// the inner value when it's shared. /// the inner value when there are other pointers.
/// ///
/// [weak]: struct.Weak.html /// [weak]: struct.Weak.html
/// [option]: ../../std/option/enum.Option.html /// [option]: ../../std/option/enum.Option.html
@ -1091,7 +1100,7 @@ pub fn get_mut(this: &mut Self) -> Option<&mut T> {
} }
} }
/// Returns a mutable reference to the inner value, /// Returns a mutable reference into the given `Arc`,
/// without any check. /// without any check.
/// ///
/// See also [`get_mut`], which is safe and does appropriate checks. /// See also [`get_mut`], which is safe and does appropriate checks.
@ -1100,7 +1109,7 @@ pub fn get_mut(this: &mut Self) -> Option<&mut T> {
/// ///
/// # Safety /// # Safety
/// ///
/// Any other `Arc` or [`Weak`] pointers to the same value must not be dereferenced /// Any other `Arc` or [`Weak`] pointers to the same allocation must not be dereferenced
/// for the duration of the returned borrow. /// for the duration of the returned borrow.
/// This is trivially the case if no such pointers exist, /// This is trivially the case if no such pointers exist,
/// for example immediately after `Arc::new`. /// for example immediately after `Arc::new`.
@ -1424,10 +1433,10 @@ pub unsafe fn from_raw(ptr: *const T) -> Self {
} }
impl<T: ?Sized> Weak<T> { impl<T: ?Sized> Weak<T> {
/// Attempts to upgrade the `Weak` pointer to an [`Arc`], extending /// Attempts to upgrade the `Weak` pointer to an [`Arc`], delaying
/// the lifetime of the value if successful. /// dropping of the inner value if successful.
/// ///
/// Returns [`None`] if the value has since been dropped. /// Returns [`None`] if the inner value has since been dropped.
/// ///
/// [`Arc`]: struct.Arc.html /// [`Arc`]: struct.Arc.html
/// [`None`]: ../../std/option/enum.Option.html#variant.None /// [`None`]: ../../std/option/enum.Option.html#variant.None
@ -1482,7 +1491,7 @@ pub fn upgrade(&self) -> Option<Arc<T>> {
} }
} }
/// Gets the number of strong (`Arc`) pointers pointing to this value. /// Gets the number of strong (`Arc`) pointers pointing to this allocation.
/// ///
/// If `self` was created using [`Weak::new`], this will return 0. /// If `self` was created using [`Weak::new`], this will return 0.
/// ///
@ -1497,17 +1506,17 @@ pub fn strong_count(&self) -> usize {
} }
/// Gets an approximation of the number of `Weak` pointers pointing to this /// Gets an approximation of the number of `Weak` pointers pointing to this
/// value. /// allocation.
/// ///
/// If `self` was created using [`Weak::new`], this will return 0. If not, /// If `self` was created using [`Weak::new`], this will return 0. If not,
/// the returned value is at least 1, since `self` still points to the /// the returned value is at least 1, since `self` still points to the
/// value. /// allocation.
/// ///
/// # Accuracy /// # Accuracy
/// ///
/// Due to implementation details, the returned value can be off by 1 in /// Due to implementation details, the returned value can be off by 1 in
/// either direction when other threads are manipulating any `Arc`s or /// either direction when other threads are manipulating any `Arc`s or
/// `Weak`s pointing to the same value. /// `Weak`s pointing to the same allocation.
/// ///
/// [`Weak::new`]: #method.new /// [`Weak::new`]: #method.new
#[unstable(feature = "weak_counts", issue = "57977")] #[unstable(feature = "weak_counts", issue = "57977")]
@ -1548,14 +1557,14 @@ fn inner(&self) -> Option<&ArcInner<T>> {
} }
} }
/// Returns `true` if the two `Weak`s point to the same value (not just /// Returns `true` if the two `Weak`s point to the same allocation (similar to
/// values that compare as equal), or if both don't point to any value /// [`ptr::eq`]), or if both don't point to any allocation
/// (because they were created with `Weak::new()`). /// (because they were created with `Weak::new()`).
/// ///
/// # Notes /// # Notes
/// ///
/// Since this compares pointers it means that `Weak::new()` will equal each /// Since this compares pointers it means that `Weak::new()` will equal each
/// other, even though they don't point to any value. /// other, even though they don't point to any allocation.
/// ///
/// # Examples /// # Examples
/// ///
@ -1587,6 +1596,8 @@ fn inner(&self) -> Option<&ArcInner<T>> {
/// let third = Arc::downgrade(&third_rc); /// let third = Arc::downgrade(&third_rc);
/// assert!(!first.ptr_eq(&third)); /// assert!(!first.ptr_eq(&third));
/// ``` /// ```
///
/// [`ptr::eq`]: ../../std/ptr/fn.eq.html
#[inline] #[inline]
#[stable(feature = "weak_ptr_eq", since = "1.39.0")] #[stable(feature = "weak_ptr_eq", since = "1.39.0")]
pub fn ptr_eq(&self, other: &Self) -> bool { pub fn ptr_eq(&self, other: &Self) -> bool {
@ -1596,7 +1607,7 @@ pub fn ptr_eq(&self, other: &Self) -> bool {
#[stable(feature = "arc_weak", since = "1.4.0")] #[stable(feature = "arc_weak", since = "1.4.0")]
impl<T: ?Sized> Clone for Weak<T> { impl<T: ?Sized> Clone for Weak<T> {
/// Makes a clone of the `Weak` pointer that points to the same value. /// Makes a clone of the `Weak` pointer that points to the same allocation.
/// ///
/// # Examples /// # Examples
/// ///
@ -1726,6 +1737,8 @@ impl<T: ?Sized + PartialEq> ArcEqIdent<T> for Arc<T> {
/// store large values, that are slow to clone, but also heavy to check for equality, causing this /// store large values, that are slow to clone, but also heavy to check for equality, causing this
/// cost to pay off more easily. It's also more likely to have two `Arc` clones, that point to /// cost to pay off more easily. It's also more likely to have two `Arc` clones, that point to
/// the same value, than two `&T`s. /// the same value, than two `&T`s.
///
/// We can only do this when `T: Eq` as a `PartialEq` might be deliberately irreflexive.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized + Eq> ArcEqIdent<T> for Arc<T> { impl<T: ?Sized + Eq> ArcEqIdent<T> for Arc<T> {
#[inline] #[inline]
@ -1743,10 +1756,11 @@ fn ne(&self, other: &Arc<T>) -> bool {
impl<T: ?Sized + PartialEq> PartialEq for Arc<T> { impl<T: ?Sized + PartialEq> PartialEq for Arc<T> {
/// Equality for two `Arc`s. /// Equality for two `Arc`s.
/// ///
/// Two `Arc`s are equal if their inner values are equal. /// Two `Arc`s are equal if their inner values are equal, even if they are
/// stored in different allocation.
/// ///
/// If `T` also implements `Eq`, two `Arc`s that point to the same value are /// If `T` also implements `Eq` (implying reflexivity of equality),
/// always equal. /// two `Arc`s that point to the same allocation are always equal.
/// ///
/// # Examples /// # Examples
/// ///
@ -1766,8 +1780,8 @@ fn eq(&self, other: &Arc<T>) -> bool {
/// ///
/// Two `Arc`s are unequal if their inner values are unequal. /// Two `Arc`s are unequal if their inner values are unequal.
/// ///
/// If `T` also implements `Eq`, two `Arc`s that point to the same value are /// If `T` also implements `Eq` (implying reflexivity of equality),
/// never unequal. /// two `Arc`s that point to the same value are never unequal.
/// ///
/// # Examples /// # Examples
/// ///