impl Clone for ~T, ~[T], ~str
This commit is contained in:
parent
2b059c6e56
commit
748c2c9ebc
7 changed files with 51 additions and 25 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)]
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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!();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue