From 748c2c9ebc3859c77a1fa3ef808ddd04c77bab75 Mon Sep 17 00:00:00 2001 From: Ben Striegel Date: Fri, 15 Mar 2013 18:26:59 -0400 Subject: [PATCH] impl Clone for ~T, ~[T], ~str --- src/libcore/clone.rs | 5 +++++ src/libcore/str.rs | 8 ++++++++ src/libcore/unstable/global.rs | 6 +++--- src/libcore/vec.rs | 13 +++++++++++++ src/libstd/arc.rs | 20 ++++++++++---------- src/libstd/sync.rs | 22 +++++++++++----------- src/libsyntax/ext/pipes/liveness.rs | 2 +- 7 files changed, 51 insertions(+), 25 deletions(-) diff --git a/src/libcore/clone.rs b/src/libcore/clone.rs index 297c4438039f..af44f68601bc 100644 --- a/src/libcore/clone.rs +++ b/src/libcore/clone.rs @@ -20,6 +20,11 @@ impl Clone for () { fn clone(&self) -> () { () } } +impl 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 4163679a98d7..67a3f0d5d722 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}; @@ -2433,6 +2434,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 654bf18a5b6b..d8ded635291d 100644 --- a/src/libcore/unstable/global.rs +++ b/src/libcore/unstable/global.rs @@ -68,11 +68,11 @@ unsafe fn global_data_clone_create_( 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 { // 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 360940236ca1..f11a63a787d7 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 iter::CopyableNonstrictIter for @[A] { } } +impl 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)] diff --git a/src/libstd/arc.rs b/src/libstd/arc.rs index b91af9a00690..bd2f641c017f 100644 --- a/src/libstd/arc.rs +++ b/src/libstd/arc.rs @@ -572,7 +572,7 @@ mod tests { #[test] #[should_fail] #[ignore(cfg(windows))] pub fn test_rw_arc_poison_wr() { let arc = ~RWARC(1); - let arc2 = ~arc.clone(); + let arc2 = (*arc).clone(); do task::try || { do arc2.write |one| { fail_unless!(*one == 2); @@ -585,7 +585,7 @@ mod tests { #[test] #[should_fail] #[ignore(cfg(windows))] pub fn test_rw_arc_poison_ww() { let arc = ~RWARC(1); - let arc2 = ~arc.clone(); + let arc2 = (*arc).clone(); do task::try || { do arc2.write |one| { fail_unless!(*one == 2); @@ -598,7 +598,7 @@ mod tests { #[test] #[should_fail] #[ignore(cfg(windows))] pub fn test_rw_arc_poison_dw() { let arc = ~RWARC(1); - let arc2 = ~arc.clone(); + let arc2 = (*arc).clone(); do task::try || { do arc2.write_downgrade |write_mode| { do (&write_mode).write |one| { @@ -613,7 +613,7 @@ mod tests { #[test] #[ignore(cfg(windows))] pub fn test_rw_arc_no_poison_rr() { let arc = ~RWARC(1); - let arc2 = ~arc.clone(); + let arc2 = (*arc).clone(); do task::try || { do arc2.read |one| { fail_unless!(*one == 2); @@ -626,7 +626,7 @@ mod tests { #[test] #[ignore(cfg(windows))] pub fn test_rw_arc_no_poison_rw() { let arc = ~RWARC(1); - let arc2 = ~arc.clone(); + let arc2 = (*arc).clone(); do task::try || { do arc2.read |one| { fail_unless!(*one == 2); @@ -639,7 +639,7 @@ mod tests { #[test] #[ignore(cfg(windows))] pub fn test_rw_arc_no_poison_dr() { let arc = ~RWARC(1); - let arc2 = ~arc.clone(); + let arc2 = (*arc).clone(); do task::try || { do arc2.write_downgrade |write_mode| { let read_mode = arc2.downgrade(write_mode); @@ -655,7 +655,7 @@ mod tests { #[test] pub fn test_rw_arc() { let arc = ~RWARC(0); - let arc2 = ~arc.clone(); + let arc2 = (*arc).clone(); let (p,c) = comm::stream(); do task::spawn || { @@ -673,7 +673,7 @@ mod tests { // Readers try to catch the writer in the act let mut children = ~[]; for 5.times { - let arc3 = ~arc.clone(); + let arc3 = (*arc).clone(); do task::task().future_result(|+r| children.push(r)).spawn || { do arc3.read |num| { @@ -704,7 +704,7 @@ mod tests { for 10.times { let ((rp1,rc1),(rp2,rc2)) = (comm::stream(),comm::stream()); reader_convos.push((rc1, rp2)); - let arcn = ~arc.clone(); + let arcn = (*arc).clone(); do task::spawn || { rp1.recv(); // wait for downgrader to give go-ahead do arcn.read |state| { @@ -715,7 +715,7 @@ mod tests { } // Writer task - let arc2 = ~arc.clone(); + let arc2 = (*arc).clone(); let ((wp1,wc1),(wp2,wc2)) = (comm::stream(),comm::stream()); do task::spawn || { wp1.recv(); diff --git a/src/libstd/sync.rs b/src/libstd/sync.rs index abd8bc742359..1d1ec0e11f7f 100644 --- a/src/libstd/sync.rs +++ b/src/libstd/sync.rs @@ -827,7 +827,7 @@ mod tests { // "load tmp = move ptr; inc tmp; store ptr <- tmp" dance. let (p,c) = comm::stream(); let m = ~Mutex(); - let m2 = ~m.clone(); + let m2 = m.clone(); let mut sharedstate = ~0; let ptr = ptr::addr_of(&(*sharedstate)); do task::spawn || { @@ -1105,13 +1105,13 @@ mod tests { // Test mutual exclusion between readers and writers. Just like the // mutex mutual exclusion test, a ways above. let (p,c) = comm::stream(); - let x2 = ~x.clone(); + let x2 = (*x).clone(); let mut sharedstate = ~0; let ptr = ptr::addr_of(&(*sharedstate)); do task::spawn || { let sharedstate: &mut int = unsafe { cast::reinterpret_cast(&ptr) }; - access_shared(sharedstate, x2, mode1, 10); + access_shared(sharedstate, &x2, mode1, 10); c.send(()); } access_shared(sharedstate, x, mode2, 10); @@ -1150,14 +1150,14 @@ mod tests { mode2: RWlockMode, make_mode2_go_first: bool) { // Much like sem_multi_resource. - let x2 = ~x.clone(); + let x2 = (*x).clone(); let (p1,c1) = comm::stream(); let (p2,c2) = comm::stream(); do task::spawn || { if !make_mode2_go_first { let _ = p2.recv(); // parent sends to us once it locks, or ... } - do lock_rwlock_in_mode(x2, mode2) { + do lock_rwlock_in_mode(&x2, mode2) { if make_mode2_go_first { c1.send(()); // ... we send to it once we lock } @@ -1207,7 +1207,7 @@ mod tests { // Child wakes up parent do x.write_cond |cond| { - let x2 = ~x.clone(); + let x2 = (*x).clone(); do task::spawn || { do x2.write_cond |cond| { let woken = cond.signal(); @@ -1218,7 +1218,7 @@ mod tests { } // Parent wakes up child let (port,chan) = comm::stream(); - let x3 = ~x.clone(); + let x3 = (*x).clone(); do task::spawn || { do x3.write_cond |cond| { chan.send(()); @@ -1253,11 +1253,11 @@ mod tests { let mut ports = ~[]; for num_waiters.times { - let xi = ~x.clone(); + let xi = (*x).clone(); let (port, chan) = comm::stream(); ports.push(port); do task::spawn || { - do lock_cond(xi, dg1) |cond| { + do lock_cond(&xi, dg1) |cond| { chan.send(()); cond.wait(); chan.send(()); @@ -1289,10 +1289,10 @@ mod tests { pub fn rwlock_kill_helper(mode1: RWlockMode, mode2: RWlockMode) { // Mutex must get automatically unlocked if failed/killed within. let x = ~RWlock(); - let x2 = ~x.clone(); + let x2 = (*x).clone(); let result: result::Result<(),()> = do task::try || { - do lock_rwlock_in_mode(x2, mode1) { + do lock_rwlock_in_mode(&x2, mode1) { fail!(); } }; diff --git a/src/libsyntax/ext/pipes/liveness.rs b/src/libsyntax/ext/pipes/liveness.rs index 97f2e516603b..15ba7f95538f 100644 --- a/src/libsyntax/ext/pipes/liveness.rs +++ b/src/libsyntax/ext/pipes/liveness.rs @@ -63,7 +63,7 @@ pub fn analyze(proto: protocol, _cx: @ext_ctxt) { debug!("colive iteration %?", i); let mut new_colive = ~[]; for colive.eachi |i, this_colive| { - let mut result = ~this_colive.clone(); + let mut result = this_colive.clone(); let this = proto.get_state_by_id(i); for this_colive.ones |j| { let next = proto.get_state_by_id(j);