about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-10-24 01:02:21 +0000
committerbors <bors@rust-lang.org>2014-10-24 01:02:21 +0000
commitc53f8a920ec065ed109e2834572645cc47a9e597 (patch)
tree59653a66cddbbc0672ba3cd19bd7060116750542 /src/libcore
parent56d544f7adc455fc1d7dfaec80315ea44e46d9ae (diff)
parentcea171b0aecfbf982c606ce3d9be09ba8405fbd6 (diff)
downloadrust-c53f8a920ec065ed109e2834572645cc47a9e597.tar.gz
rust-c53f8a920ec065ed109e2834572645cc47a9e597.zip
auto merge of #17960 : mahkoh/rust/clone_from_slice, r=pcwalton
Old vs. New vs. Vec::push_all

```
test slice     ... bench:   3091942 ns/iter (+/- 54460)
test slice_new ... bench:   1800065 ns/iter (+/- 69513)
test vec       ... bench:   1804805 ns/iter (+/- 75609)
```
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/slice.rs11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs
index 6b24592b17f..88d64a1e669 100644
--- a/src/libcore/slice.rs
+++ b/src/libcore/slice.rs
@@ -853,13 +853,16 @@ pub trait MutableCloneableSlice<T> {
 }
 
 #[unstable = "trait is unstable"]
-impl<'a, T:Clone> MutableCloneableSlice<T> for &'a mut [T] {
+impl<'a, T: Clone> MutableCloneableSlice<T> for &'a mut [T] {
     #[inline]
     fn clone_from_slice(self, src: &[T]) -> uint {
-        for (a, b) in self.iter_mut().zip(src.iter()) {
-            a.clone_from(b);
+        let min = cmp::min(self.len(), src.len());
+        let dst = self.slice_to_mut(min);
+        let src = src.slice_to(min);
+        for i in range(0, min) {
+            dst[i].clone_from(&src[i]);
         }
-        cmp::min(self.len(), src.len())
+        min
     }
 }