diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2013-07-09 15:22:18 -0400 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2013-07-09 22:44:11 -0400 |
| commit | 6f5be9063ddbfe18ce5321817f782abcd2f55110 (patch) | |
| tree | b640276924a91c91faa48d1fae4049f75596ba67 /src/libstd | |
| parent | f74250e3a970f81388a73aeb8f3d53304d77c34b (diff) | |
| download | rust-6f5be9063ddbfe18ce5321817f782abcd2f55110.tar.gz rust-6f5be9063ddbfe18ce5321817f782abcd2f55110.zip | |
ptr: optimize {swap,replace,read}_ptr
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/ptr.rs | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/libstd/ptr.rs b/src/libstd/ptr.rs index 2b42c085009..a9db3cd27b3 100644 --- a/src/libstd/ptr.rs +++ b/src/libstd/ptr.rs @@ -14,6 +14,7 @@ use cast; use option::{Option, Some, None}; use sys; use unstable::intrinsics; +use util::swap; #[cfg(not(test))] use cmp::{Eq, Ord}; use uint; @@ -177,9 +178,9 @@ pub unsafe fn swap_ptr<T>(x: *mut T, y: *mut T) { let t: *mut T = &mut tmp; // Perform the swap - copy_memory(t, x, 1); - copy_memory(x, y, 1); - copy_memory(y, t, 1); + copy_nonoverlapping_memory(t, x, 1); + copy_memory(x, y, 1); // `x` and `y` may overlap + copy_nonoverlapping_memory(y, t, 1); // y and t now point to the same thing, but we need to completely forget `tmp` // because it's no longer relevant. @@ -192,7 +193,7 @@ pub unsafe fn swap_ptr<T>(x: *mut T, y: *mut T) { */ #[inline] pub unsafe fn replace_ptr<T>(dest: *mut T, mut src: T) -> T { - swap_ptr(dest, &mut src); + swap(cast::transmute(dest), &mut src); // cannot overlap src } @@ -202,8 +203,7 @@ pub unsafe fn replace_ptr<T>(dest: *mut T, mut src: T) -> T { #[inline(always)] pub unsafe fn read_ptr<T>(src: *mut T) -> T { let mut tmp: T = intrinsics::uninit(); - let t: *mut T = &mut tmp; - copy_memory(t, src, 1); + copy_nonoverlapping_memory(&mut tmp, src, 1); tmp } |
