Document overrides of clone_from()
Specifically, when an override doesn't just forward to an inner type, document the behavior and that it's preferred over simply assigning a clone of source. Also, change instances where the second parameter is "other" to "source".
This commit is contained in:
parent
bfe762e0ed
commit
c0e913fdd7
14 changed files with 134 additions and 24 deletions
|
@ -2084,11 +2084,29 @@ impl<T: Clone, A: Allocator + Clone> Clone for Box<[T], A> {
|
||||||
self.to_vec_in(alloc).into_boxed_slice()
|
self.to_vec_in(alloc).into_boxed_slice()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn clone_from(&mut self, other: &Self) {
|
/// Copies `source`'s contents into `self` without creating a new allocation,
|
||||||
if self.len() == other.len() {
|
/// so long as the two are of the same length.
|
||||||
self.clone_from_slice(&other);
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// let x = Box::new([5, 6, 7]);
|
||||||
|
/// let mut y = Box::new([8, 9, 10]);
|
||||||
|
/// let yp: *const [i32] = &*y;
|
||||||
|
///
|
||||||
|
/// y.clone_from(&x);
|
||||||
|
///
|
||||||
|
/// // The value is the same
|
||||||
|
/// assert_eq!(x, y);
|
||||||
|
///
|
||||||
|
/// // And no allocation occurred
|
||||||
|
/// assert_eq!(yp, &*y);
|
||||||
|
/// ```
|
||||||
|
fn clone_from(&mut self, source: &Self) {
|
||||||
|
if self.len() == source.len() {
|
||||||
|
self.clone_from_slice(&source);
|
||||||
} else {
|
} else {
|
||||||
*self = other.clone();
|
*self = source.clone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -385,6 +385,12 @@ impl<T: Clone, A: Allocator + Clone> Clone for BinaryHeap<T, A> {
|
||||||
BinaryHeap { data: self.data.clone() }
|
BinaryHeap { data: self.data.clone() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Overwrites the contents of `self` with a clone of the contents of `source`.
|
||||||
|
///
|
||||||
|
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||||
|
/// as it avoids reallocation if possible.
|
||||||
|
///
|
||||||
|
/// See [`Vec::clone_from()`] for more details.
|
||||||
fn clone_from(&mut self, source: &Self) {
|
fn clone_from(&mut self, source: &Self) {
|
||||||
self.data.clone_from(&source.data);
|
self.data.clone_from(&source.data);
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,8 +116,8 @@ impl<T: Clone, A: Allocator + Clone> Clone for BTreeSet<T, A> {
|
||||||
BTreeSet { map: self.map.clone() }
|
BTreeSet { map: self.map.clone() }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn clone_from(&mut self, other: &Self) {
|
fn clone_from(&mut self, source: &Self) {
|
||||||
self.map.clone_from(&other.map);
|
self.map.clone_from(&source.map);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2126,16 +2126,22 @@ impl<T: Clone, A: Allocator + Clone> Clone for LinkedList<T, A> {
|
||||||
list
|
list
|
||||||
}
|
}
|
||||||
|
|
||||||
fn clone_from(&mut self, other: &Self) {
|
/// Overwrites the contents of `self` with a clone of the contents of `source`.
|
||||||
let mut iter_other = other.iter();
|
///
|
||||||
if self.len() > other.len() {
|
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||||
self.split_off(other.len());
|
/// as it avoids reallocation of the nodes of the linked list. Additionally,
|
||||||
|
/// if the element type `T` overrides `clone_from()`, this will reuse the
|
||||||
|
/// resources of `self`'s elements as well.
|
||||||
|
fn clone_from(&mut self, source: &Self) {
|
||||||
|
let mut source_iter = source.iter();
|
||||||
|
if self.len() > source.len() {
|
||||||
|
self.split_off(source.len());
|
||||||
}
|
}
|
||||||
for (elem, elem_other) in self.iter_mut().zip(&mut iter_other) {
|
for (elem, source_elem) in self.iter_mut().zip(&mut source_iter) {
|
||||||
elem.clone_from(elem_other);
|
elem.clone_from(source_elem);
|
||||||
}
|
}
|
||||||
if !iter_other.is_empty() {
|
if !source_iter.is_empty() {
|
||||||
self.extend(iter_other.cloned());
|
self.extend(source_iter.cloned());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,9 +113,15 @@ impl<T: Clone, A: Allocator + Clone> Clone for VecDeque<T, A> {
|
||||||
deq
|
deq
|
||||||
}
|
}
|
||||||
|
|
||||||
fn clone_from(&mut self, other: &Self) {
|
/// Overwrites the contents of `self` with a clone of the contents of `source`.
|
||||||
|
///
|
||||||
|
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||||
|
/// as it avoids reallocation if possible. Additionally, if the element type
|
||||||
|
/// `T` overrides `clone_from()`, this will reuse the resources of `self`'s
|
||||||
|
/// elements as well.
|
||||||
|
fn clone_from(&mut self, source: &Self) {
|
||||||
self.clear();
|
self.clear();
|
||||||
self.extend(other.iter().cloned());
|
self.extend(source.iter().cloned());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2084,6 +2084,10 @@ impl Clone for String {
|
||||||
String { vec: self.vec.clone() }
|
String { vec: self.vec.clone() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Clones the contents of `source` into `self`.
|
||||||
|
///
|
||||||
|
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||||
|
/// as it avoids reallocation if possible.
|
||||||
fn clone_from(&mut self, source: &Self) {
|
fn clone_from(&mut self, source: &Self) {
|
||||||
self.vec.clone_from(&source.vec);
|
self.vec.clone_from(&source.vec);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2758,8 +2758,30 @@ impl<T: Clone, A: Allocator + Clone> Clone for Vec<T, A> {
|
||||||
crate::slice::to_vec(&**self, alloc)
|
crate::slice::to_vec(&**self, alloc)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn clone_from(&mut self, other: &Self) {
|
/// Overwrites the contents of `self` with a clone of the contents of `source`.
|
||||||
crate::slice::SpecCloneIntoVec::clone_into(other.as_slice(), self);
|
///
|
||||||
|
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||||
|
/// as it avoids reallocation if possible. Additionally, if the element type
|
||||||
|
/// `T` overrides `clone_from()`, this will reuse the resources of `self`'s
|
||||||
|
/// elements as well.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// let x = vec![5, 6, 7];
|
||||||
|
/// let mut y = vec![8, 9, 10];
|
||||||
|
/// let yp: *const i32 = y.as_ptr();
|
||||||
|
///
|
||||||
|
/// y.clone_from(&x);
|
||||||
|
///
|
||||||
|
/// // The value is the same
|
||||||
|
/// assert_eq!(x, y);
|
||||||
|
///
|
||||||
|
/// // And no reallocation occurred
|
||||||
|
/// assert_eq!(yp, y.as_ptr());
|
||||||
|
/// ```
|
||||||
|
fn clone_from(&mut self, source: &Self) {
|
||||||
|
crate::slice::SpecCloneIntoVec::clone_into(source.as_slice(), self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1276,8 +1276,8 @@ impl<T: Clone> Clone for RefCell<T> {
|
||||||
/// Panics if `other` is currently mutably borrowed.
|
/// Panics if `other` is currently mutably borrowed.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn clone_from(&mut self, other: &Self) {
|
fn clone_from(&mut self, source: &Self) {
|
||||||
self.get_mut().clone_from(&other.borrow())
|
self.get_mut().clone_from(&source.borrow())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -684,8 +684,8 @@ impl<T: Clone> Clone for Reverse<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone_from(&mut self, other: &Self) {
|
fn clone_from(&mut self, source: &Self) {
|
||||||
self.0.clone_from(&other.0)
|
self.0.clone_from(&source.0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -515,6 +515,42 @@ impl Clone for Waker {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Assigns a clone of `source` to `self`, unless [`self.will_wake(source)`][Waker::will_wake] anyway.
|
||||||
|
///
|
||||||
|
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||||
|
/// as it avoids cloning the waker if `self` is already the same waker.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use std::future::Future;
|
||||||
|
/// use std::pin::Pin;
|
||||||
|
/// use std::sync::{Arc, Mutex};
|
||||||
|
/// use std::task::{Context, Poll, Waker};
|
||||||
|
///
|
||||||
|
/// struct Waiter {
|
||||||
|
/// shared: Arc<Mutex<Shared>>,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// struct Shared {
|
||||||
|
/// waker: Waker,
|
||||||
|
/// // ...
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl Future for Waiter {
|
||||||
|
/// type Output = ();
|
||||||
|
/// fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> {
|
||||||
|
/// let mut shared = self.shared.lock().unwrap();
|
||||||
|
///
|
||||||
|
/// // update the waker
|
||||||
|
/// shared.waker.clone_from(cx.waker());
|
||||||
|
///
|
||||||
|
/// // readiness logic ...
|
||||||
|
/// # Poll::Ready(())
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone_from(&mut self, source: &Self) {
|
fn clone_from(&mut self, source: &Self) {
|
||||||
if !self.will_wake(source) {
|
if !self.will_wake(source) {
|
||||||
|
|
|
@ -1271,8 +1271,8 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone_from(&mut self, other: &Self) {
|
fn clone_from(&mut self, source: &Self) {
|
||||||
self.base.clone_from(&other.base);
|
self.base.clone_from(&source.base);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -978,6 +978,10 @@ where
|
||||||
Self { base: self.base.clone() }
|
Self { base: self.base.clone() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Overwrites the contents of `self` with a clone of the contents of `source`.
|
||||||
|
///
|
||||||
|
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||||
|
/// as it avoids reallocation if possible.
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone_from(&mut self, other: &Self) {
|
fn clone_from(&mut self, other: &Self) {
|
||||||
self.base.clone_from(&other.base);
|
self.base.clone_from(&other.base);
|
||||||
|
|
|
@ -606,6 +606,10 @@ impl Clone for OsString {
|
||||||
OsString { inner: self.inner.clone() }
|
OsString { inner: self.inner.clone() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Clones the contents of `source` into `self`.
|
||||||
|
///
|
||||||
|
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||||
|
/// as it avoids reallocation if possible.
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone_from(&mut self, source: &Self) {
|
fn clone_from(&mut self, source: &Self) {
|
||||||
self.inner.clone_from(&source.inner)
|
self.inner.clone_from(&source.inner)
|
||||||
|
|
|
@ -1628,6 +1628,10 @@ impl Clone for PathBuf {
|
||||||
PathBuf { inner: self.inner.clone() }
|
PathBuf { inner: self.inner.clone() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Clones the contents of `source` into `self`.
|
||||||
|
///
|
||||||
|
/// This method is preferred over simply assigning `source.clone()` to `self`,
|
||||||
|
/// as it avoids reallocation if possible.
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone_from(&mut self, source: &Self) {
|
fn clone_from(&mut self, source: &Self) {
|
||||||
self.inner.clone_from(&source.inner)
|
self.inner.clone_from(&source.inner)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue