about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-03-15 20:15:44 -0700
committerbors <bors@rust-lang.org>2013-03-15 20:15:44 -0700
commit6f1e8ef71abb390a8f6406292ea06c729dcbf9e5 (patch)
treeeacbc64a864bd47298bdf1f2e678f096b1ea02b6 /src/libcore
parent5a77a1048897a12c9031d3e0b3867f0c6e3673ea (diff)
parentee5842494a9170d6e1079a671695fcfc32ceb920 (diff)
downloadrust-6f1e8ef71abb390a8f6406292ea06c729dcbf9e5.tar.gz
rust-6f1e8ef71abb390a8f6406292ea06c729dcbf9e5.zip
auto merge of #5404 : bstrie/rust/decopy, r=pcwalton
Also turn `copy` into `.clone()` in much of run-pass.
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/clone.rs5
-rw-r--r--src/libcore/str.rs8
-rw-r--r--src/libcore/unstable/global.rs6
-rw-r--r--src/libcore/vec.rs13
4 files changed, 29 insertions, 3 deletions
diff --git a/src/libcore/clone.rs b/src/libcore/clone.rs
index 297c4438039..af44f68601b 100644
--- a/src/libcore/clone.rs
+++ b/src/libcore/clone.rs
@@ -20,6 +20,11 @@ impl Clone for () {
     fn clone(&self) -> () { () }
 }
 
+impl<T:Clone> Clone for ~T {
+    #[inline(always)]
+    fn clone(&self) -> ~T { ~(**self).clone() }
+}
+
 macro_rules! clone_impl(
     ($t:ty) => {
         impl Clone for $t {
diff --git a/src/libcore/str.rs b/src/libcore/str.rs
index 430ed2d9e38..23b14e243b8 100644
--- a/src/libcore/str.rs
+++ b/src/libcore/str.rs
@@ -20,6 +20,7 @@
 use at_vec;
 use cast;
 use char;
+use clone::Clone;
 use cmp::{Equiv, TotalOrd, Ordering, Less, Equal, Greater};
 use libc;
 use option::{None, Option, Some};
@@ -2436,6 +2437,13 @@ impl OwnedStr for ~str {
     }
 }
 
+impl Clone for ~str {
+    #[inline(always)]
+    fn clone(&self) -> ~str {
+        self.to_str()  // hilarious
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use char;
diff --git a/src/libcore/unstable/global.rs b/src/libcore/unstable/global.rs
index 654bf18a5b6..d8ded635291 100644
--- a/src/libcore/unstable/global.rs
+++ b/src/libcore/unstable/global.rs
@@ -68,11 +68,11 @@ unsafe fn global_data_clone_create_<T:Owned + Clone>(
         match value {
             None => {
                 let value = create();
-                clone_value = Some(value.clone());
+                clone_value = Some((*value).clone());
                 Some(value)
             }
             Some(value) => {
-                clone_value = Some(value.clone());
+                clone_value = Some((*value).clone());
                 Some(value)
             }
         }
@@ -193,7 +193,7 @@ fn get_global_state() -> Exclusive<GlobalState> {
             // Successfully installed the global pointer
 
             // Take a handle to return
-            let clone = state.clone();
+            let clone = (*state).clone();
 
             // Install a runtime exit function to destroy the global object
             do at_exit {
diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs
index 360940236ca..f11a63a787d 100644
--- a/src/libcore/vec.rs
+++ b/src/libcore/vec.rs
@@ -15,6 +15,7 @@
 use container::{Container, Mutable};
 use cast;
 use cmp::{Eq, Equiv, Ord, TotalOrd, Ordering, Less, Equal, Greater};
+use clone::Clone;
 use iter::BaseIter;
 use iter;
 use kinds::Copy;
@@ -2501,6 +2502,18 @@ impl<A:Copy> iter::CopyableNonstrictIter<A> for @[A] {
     }
 }
 
+impl<A:Clone> Clone for ~[A] {
+    #[inline]
+    fn clone(&self) -> ~[A] {
+        let mut dolly = ~[];
+        vec::reserve(&mut dolly, self.len());
+        for self.each |item| {
+            dolly.push(item.clone());
+        }
+        return dolly;
+    }
+}
+
 // ___________________________________________________________________________
 
 #[cfg(test)]