diff options
| author | bors <bors@rust-lang.org> | 2021-05-19 02:17:41 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-05-19 02:17:41 +0000 |
| commit | 3d31363338bc3a4db66237f5be10389cfd01201b (patch) | |
| tree | b1b255a1082731bcfb5bc2c817078c35dd172e08 | |
| parent | 4e3e6db011c5b482d2bef8ba02274657f93b5e0d (diff) | |
| parent | 9332ac3bfca0dad696127267ba8029677795b4ce (diff) | |
| download | rust-3d31363338bc3a4db66237f5be10389cfd01201b.tar.gz rust-3d31363338bc3a4db66237f5be10389cfd01201b.zip | |
Auto merge of #85176 - a1phyr:impl_clone_from, r=yaahc
Override `clone_from` for some types Override `clone_from` method of the `Clone` trait for: - `cell::RefCell` - `cmp::Reverse` - `io::Cursor` - `mem::ManuallyDrop` This can bring performance improvements.
| -rw-r--r-- | library/core/src/cell.rs | 9 | ||||
| -rw-r--r-- | library/core/src/cmp.rs | 15 | ||||
| -rw-r--r-- | library/core/src/mem/manually_drop.rs | 15 | ||||
| -rw-r--r-- | library/std/src/io/cursor.rs | 19 |
4 files changed, 55 insertions, 3 deletions
diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index 4820588df25..f88a6e418c7 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -1123,6 +1123,15 @@ impl<T: Clone> Clone for RefCell<T> { fn clone(&self) -> RefCell<T> { RefCell::new(self.borrow().clone()) } + + /// # Panics + /// + /// Panics if `other` is currently mutably borrowed. + #[inline] + #[track_caller] + fn clone_from(&mut self, other: &Self) { + self.get_mut().clone_from(&other.borrow()) + } } #[stable(feature = "rust1", since = "1.0.0")] diff --git a/library/core/src/cmp.rs b/library/core/src/cmp.rs index f8b16b6f927..3f0acf435fe 100644 --- a/library/core/src/cmp.rs +++ b/library/core/src/cmp.rs @@ -578,7 +578,7 @@ impl Ordering { /// v.sort_by_key(|&num| (num > 3, Reverse(num))); /// assert_eq!(v, vec![3, 2, 1, 6, 5, 4]); /// ``` -#[derive(PartialEq, Eq, Debug, Copy, Clone, Default, Hash)] +#[derive(PartialEq, Eq, Debug, Copy, Default, Hash)] #[stable(feature = "reverse_cmp_key", since = "1.19.0")] #[repr(transparent)] pub struct Reverse<T>(#[stable(feature = "reverse_cmp_key", since = "1.19.0")] pub T); @@ -616,6 +616,19 @@ impl<T: Ord> Ord for Reverse<T> { } } +#[stable(feature = "reverse_cmp_key", since = "1.19.0")] +impl<T: Clone> Clone for Reverse<T> { + #[inline] + fn clone(&self) -> Reverse<T> { + Reverse(self.0.clone()) + } + + #[inline] + fn clone_from(&mut self, other: &Self) { + self.0.clone_from(&other.0) + } +} + /// Trait for types that form a [total order](https://en.wikipedia.org/wiki/Total_order). /// /// An order is a total order if it is (for all `a`, `b` and `c`): diff --git a/library/core/src/mem/manually_drop.rs b/library/core/src/mem/manually_drop.rs index d86939454be..5b99f6954e6 100644 --- a/library/core/src/mem/manually_drop.rs +++ b/library/core/src/mem/manually_drop.rs @@ -44,7 +44,7 @@ use crate::ptr; /// [`MaybeUninit<T>`]: crate::mem::MaybeUninit #[stable(feature = "manually_drop", since = "1.20.0")] #[lang = "manually_drop"] -#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[derive(Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(transparent)] pub struct ManuallyDrop<T: ?Sized> { value: T, @@ -160,3 +160,16 @@ impl<T: ?Sized> DerefMut for ManuallyDrop<T> { &mut self.value } } + +#[stable(feature = "manually_drop", since = "1.20.0")] +impl<T: Clone> Clone for ManuallyDrop<T> { + #[inline] + fn clone(&self) -> ManuallyDrop<T> { + ManuallyDrop { value: self.value.clone() } + } + + #[inline] + fn clone_from(&mut self, other: &Self) { + self.value.clone_from(&other.value) + } +} diff --git a/library/std/src/io/cursor.rs b/library/std/src/io/cursor.rs index 9021b470065..9527254c947 100644 --- a/library/std/src/io/cursor.rs +++ b/library/std/src/io/cursor.rs @@ -71,7 +71,7 @@ use core::convert::TryInto; /// } /// ``` #[stable(feature = "rust1", since = "1.0.0")] -#[derive(Clone, Debug, Default, Eq, PartialEq)] +#[derive(Debug, Default, Eq, PartialEq)] pub struct Cursor<T> { inner: T, pos: u64, @@ -206,6 +206,23 @@ impl<T> Cursor<T> { } #[stable(feature = "rust1", since = "1.0.0")] +impl<T> Clone for Cursor<T> +where + T: Clone, +{ + #[inline] + fn clone(&self) -> Self { + Cursor { inner: self.inner.clone(), pos: self.pos } + } + + #[inline] + fn clone_from(&mut self, other: &Self) { + self.inner.clone_from(&other.inner); + self.pos = other.pos; + } +} + +#[stable(feature = "rust1", since = "1.0.0")] impl<T> io::Seek for Cursor<T> where T: AsRef<[u8]>, |
