1
Fork 0

impl Clone for ~T, ~[T], ~str

This commit is contained in:
Ben Striegel 2013-03-15 18:26:59 -04:00
commit 748c2c9ebc
7 changed files with 51 additions and 25 deletions

View file

@ -20,6 +20,11 @@ impl Clone for () {
fn clone(&self) -> () { () } fn clone(&self) -> () { () }
} }
impl<T:Clone> Clone for ~T {
#[inline(always)]
fn clone(&self) -> ~T { ~(**self).clone() }
}
macro_rules! clone_impl( macro_rules! clone_impl(
($t:ty) => { ($t:ty) => {
impl Clone for $t { impl Clone for $t {

View file

@ -20,6 +20,7 @@
use at_vec; use at_vec;
use cast; use cast;
use char; use char;
use clone::Clone;
use cmp::{Equiv, TotalOrd, Ordering, Less, Equal, Greater}; use cmp::{Equiv, TotalOrd, Ordering, Less, Equal, Greater};
use libc; use libc;
use option::{None, Option, Some}; 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)] #[cfg(test)]
mod tests { mod tests {
use char; use char;

View file

@ -68,11 +68,11 @@ unsafe fn global_data_clone_create_<T:Owned + Clone>(
match value { match value {
None => { None => {
let value = create(); let value = create();
clone_value = Some(value.clone()); clone_value = Some((*value).clone());
Some(value) Some(value)
} }
Some(value) => { Some(value) => {
clone_value = Some(value.clone()); clone_value = Some((*value).clone());
Some(value) Some(value)
} }
} }
@ -193,7 +193,7 @@ fn get_global_state() -> Exclusive<GlobalState> {
// Successfully installed the global pointer // Successfully installed the global pointer
// Take a handle to return // Take a handle to return
let clone = state.clone(); let clone = (*state).clone();
// Install a runtime exit function to destroy the global object // Install a runtime exit function to destroy the global object
do at_exit { do at_exit {

View file

@ -15,6 +15,7 @@
use container::{Container, Mutable}; use container::{Container, Mutable};
use cast; use cast;
use cmp::{Eq, Equiv, Ord, TotalOrd, Ordering, Less, Equal, Greater}; use cmp::{Eq, Equiv, Ord, TotalOrd, Ordering, Less, Equal, Greater};
use clone::Clone;
use iter::BaseIter; use iter::BaseIter;
use iter; use iter;
use kinds::Copy; 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)] #[cfg(test)]

View file

@ -572,7 +572,7 @@ mod tests {
#[test] #[should_fail] #[ignore(cfg(windows))] #[test] #[should_fail] #[ignore(cfg(windows))]
pub fn test_rw_arc_poison_wr() { pub fn test_rw_arc_poison_wr() {
let arc = ~RWARC(1); let arc = ~RWARC(1);
let arc2 = ~arc.clone(); let arc2 = (*arc).clone();
do task::try || { do task::try || {
do arc2.write |one| { do arc2.write |one| {
fail_unless!(*one == 2); fail_unless!(*one == 2);
@ -585,7 +585,7 @@ mod tests {
#[test] #[should_fail] #[ignore(cfg(windows))] #[test] #[should_fail] #[ignore(cfg(windows))]
pub fn test_rw_arc_poison_ww() { pub fn test_rw_arc_poison_ww() {
let arc = ~RWARC(1); let arc = ~RWARC(1);
let arc2 = ~arc.clone(); let arc2 = (*arc).clone();
do task::try || { do task::try || {
do arc2.write |one| { do arc2.write |one| {
fail_unless!(*one == 2); fail_unless!(*one == 2);
@ -598,7 +598,7 @@ mod tests {
#[test] #[should_fail] #[ignore(cfg(windows))] #[test] #[should_fail] #[ignore(cfg(windows))]
pub fn test_rw_arc_poison_dw() { pub fn test_rw_arc_poison_dw() {
let arc = ~RWARC(1); let arc = ~RWARC(1);
let arc2 = ~arc.clone(); let arc2 = (*arc).clone();
do task::try || { do task::try || {
do arc2.write_downgrade |write_mode| { do arc2.write_downgrade |write_mode| {
do (&write_mode).write |one| { do (&write_mode).write |one| {
@ -613,7 +613,7 @@ mod tests {
#[test] #[ignore(cfg(windows))] #[test] #[ignore(cfg(windows))]
pub fn test_rw_arc_no_poison_rr() { pub fn test_rw_arc_no_poison_rr() {
let arc = ~RWARC(1); let arc = ~RWARC(1);
let arc2 = ~arc.clone(); let arc2 = (*arc).clone();
do task::try || { do task::try || {
do arc2.read |one| { do arc2.read |one| {
fail_unless!(*one == 2); fail_unless!(*one == 2);
@ -626,7 +626,7 @@ mod tests {
#[test] #[ignore(cfg(windows))] #[test] #[ignore(cfg(windows))]
pub fn test_rw_arc_no_poison_rw() { pub fn test_rw_arc_no_poison_rw() {
let arc = ~RWARC(1); let arc = ~RWARC(1);
let arc2 = ~arc.clone(); let arc2 = (*arc).clone();
do task::try || { do task::try || {
do arc2.read |one| { do arc2.read |one| {
fail_unless!(*one == 2); fail_unless!(*one == 2);
@ -639,7 +639,7 @@ mod tests {
#[test] #[ignore(cfg(windows))] #[test] #[ignore(cfg(windows))]
pub fn test_rw_arc_no_poison_dr() { pub fn test_rw_arc_no_poison_dr() {
let arc = ~RWARC(1); let arc = ~RWARC(1);
let arc2 = ~arc.clone(); let arc2 = (*arc).clone();
do task::try || { do task::try || {
do arc2.write_downgrade |write_mode| { do arc2.write_downgrade |write_mode| {
let read_mode = arc2.downgrade(write_mode); let read_mode = arc2.downgrade(write_mode);
@ -655,7 +655,7 @@ mod tests {
#[test] #[test]
pub fn test_rw_arc() { pub fn test_rw_arc() {
let arc = ~RWARC(0); let arc = ~RWARC(0);
let arc2 = ~arc.clone(); let arc2 = (*arc).clone();
let (p,c) = comm::stream(); let (p,c) = comm::stream();
do task::spawn || { do task::spawn || {
@ -673,7 +673,7 @@ mod tests {
// Readers try to catch the writer in the act // Readers try to catch the writer in the act
let mut children = ~[]; let mut children = ~[];
for 5.times { for 5.times {
let arc3 = ~arc.clone(); let arc3 = (*arc).clone();
do task::task().future_result(|+r| children.push(r)).spawn do task::task().future_result(|+r| children.push(r)).spawn
|| { || {
do arc3.read |num| { do arc3.read |num| {
@ -704,7 +704,7 @@ mod tests {
for 10.times { for 10.times {
let ((rp1,rc1),(rp2,rc2)) = (comm::stream(),comm::stream()); let ((rp1,rc1),(rp2,rc2)) = (comm::stream(),comm::stream());
reader_convos.push((rc1, rp2)); reader_convos.push((rc1, rp2));
let arcn = ~arc.clone(); let arcn = (*arc).clone();
do task::spawn || { do task::spawn || {
rp1.recv(); // wait for downgrader to give go-ahead rp1.recv(); // wait for downgrader to give go-ahead
do arcn.read |state| { do arcn.read |state| {
@ -715,7 +715,7 @@ mod tests {
} }
// Writer task // Writer task
let arc2 = ~arc.clone(); let arc2 = (*arc).clone();
let ((wp1,wc1),(wp2,wc2)) = (comm::stream(),comm::stream()); let ((wp1,wc1),(wp2,wc2)) = (comm::stream(),comm::stream());
do task::spawn || { do task::spawn || {
wp1.recv(); wp1.recv();

View file

@ -827,7 +827,7 @@ mod tests {
// "load tmp = move ptr; inc tmp; store ptr <- tmp" dance. // "load tmp = move ptr; inc tmp; store ptr <- tmp" dance.
let (p,c) = comm::stream(); let (p,c) = comm::stream();
let m = ~Mutex(); let m = ~Mutex();
let m2 = ~m.clone(); let m2 = m.clone();
let mut sharedstate = ~0; let mut sharedstate = ~0;
let ptr = ptr::addr_of(&(*sharedstate)); let ptr = ptr::addr_of(&(*sharedstate));
do task::spawn || { do task::spawn || {
@ -1105,13 +1105,13 @@ mod tests {
// Test mutual exclusion between readers and writers. Just like the // Test mutual exclusion between readers and writers. Just like the
// mutex mutual exclusion test, a ways above. // mutex mutual exclusion test, a ways above.
let (p,c) = comm::stream(); let (p,c) = comm::stream();
let x2 = ~x.clone(); let x2 = (*x).clone();
let mut sharedstate = ~0; let mut sharedstate = ~0;
let ptr = ptr::addr_of(&(*sharedstate)); let ptr = ptr::addr_of(&(*sharedstate));
do task::spawn || { do task::spawn || {
let sharedstate: &mut int = let sharedstate: &mut int =
unsafe { cast::reinterpret_cast(&ptr) }; unsafe { cast::reinterpret_cast(&ptr) };
access_shared(sharedstate, x2, mode1, 10); access_shared(sharedstate, &x2, mode1, 10);
c.send(()); c.send(());
} }
access_shared(sharedstate, x, mode2, 10); access_shared(sharedstate, x, mode2, 10);
@ -1150,14 +1150,14 @@ mod tests {
mode2: RWlockMode, mode2: RWlockMode,
make_mode2_go_first: bool) { make_mode2_go_first: bool) {
// Much like sem_multi_resource. // Much like sem_multi_resource.
let x2 = ~x.clone(); let x2 = (*x).clone();
let (p1,c1) = comm::stream(); let (p1,c1) = comm::stream();
let (p2,c2) = comm::stream(); let (p2,c2) = comm::stream();
do task::spawn || { do task::spawn || {
if !make_mode2_go_first { if !make_mode2_go_first {
let _ = p2.recv(); // parent sends to us once it locks, or ... 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 { if make_mode2_go_first {
c1.send(()); // ... we send to it once we lock c1.send(()); // ... we send to it once we lock
} }
@ -1207,7 +1207,7 @@ mod tests {
// Child wakes up parent // Child wakes up parent
do x.write_cond |cond| { do x.write_cond |cond| {
let x2 = ~x.clone(); let x2 = (*x).clone();
do task::spawn || { do task::spawn || {
do x2.write_cond |cond| { do x2.write_cond |cond| {
let woken = cond.signal(); let woken = cond.signal();
@ -1218,7 +1218,7 @@ mod tests {
} }
// Parent wakes up child // Parent wakes up child
let (port,chan) = comm::stream(); let (port,chan) = comm::stream();
let x3 = ~x.clone(); let x3 = (*x).clone();
do task::spawn || { do task::spawn || {
do x3.write_cond |cond| { do x3.write_cond |cond| {
chan.send(()); chan.send(());
@ -1253,11 +1253,11 @@ mod tests {
let mut ports = ~[]; let mut ports = ~[];
for num_waiters.times { for num_waiters.times {
let xi = ~x.clone(); let xi = (*x).clone();
let (port, chan) = comm::stream(); let (port, chan) = comm::stream();
ports.push(port); ports.push(port);
do task::spawn || { do task::spawn || {
do lock_cond(xi, dg1) |cond| { do lock_cond(&xi, dg1) |cond| {
chan.send(()); chan.send(());
cond.wait(); cond.wait();
chan.send(()); chan.send(());
@ -1289,10 +1289,10 @@ mod tests {
pub fn rwlock_kill_helper(mode1: RWlockMode, mode2: RWlockMode) { pub fn rwlock_kill_helper(mode1: RWlockMode, mode2: RWlockMode) {
// Mutex must get automatically unlocked if failed/killed within. // Mutex must get automatically unlocked if failed/killed within.
let x = ~RWlock(); let x = ~RWlock();
let x2 = ~x.clone(); let x2 = (*x).clone();
let result: result::Result<(),()> = do task::try || { let result: result::Result<(),()> = do task::try || {
do lock_rwlock_in_mode(x2, mode1) { do lock_rwlock_in_mode(&x2, mode1) {
fail!(); fail!();
} }
}; };

View file

@ -63,7 +63,7 @@ pub fn analyze(proto: protocol, _cx: @ext_ctxt) {
debug!("colive iteration %?", i); debug!("colive iteration %?", i);
let mut new_colive = ~[]; let mut new_colive = ~[];
for colive.eachi |i, this_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); let this = proto.get_state_by_id(i);
for this_colive.ones |j| { for this_colive.ones |j| {
let next = proto.get_state_by_id(j); let next = proto.get_state_by_id(j);