auto merge of #6723 : osaut/rust/arc-remove-get, r=brson

* Remove clone and get functions from ARC.
* Update the tests and bench.
This commit is contained in:
bors 2013-05-24 19:01:51 -07:00
commit 5f90f1ca1d
4 changed files with 24 additions and 34 deletions

View File

@ -107,7 +107,7 @@ pub impl<'self> Condvar<'self> {
****************************************************************************/
/// An atomically reference counted wrapper for shared immutable state.
struct ARC<T> { x: UnsafeAtomicRcBox<T> }
pub struct ARC<T> { x: UnsafeAtomicRcBox<T> }
/// Create an atomically reference counted wrapper.
pub fn ARC<T:Const + Owned>(data: T) -> ARC<T> {
@ -118,15 +118,12 @@ pub fn ARC<T:Const + Owned>(data: T) -> ARC<T> {
* Access the underlying data in an atomically reference counted
* wrapper.
*/
pub fn get<'a, T:Const + Owned>(rc: &'a ARC<T>) -> &'a T {
rc.get()
}
impl<T:Const+Owned> ARC<T> {
pub fn get<'a>(&'a self) -> &'a T {
pub impl<T:Const+Owned> ARC<T> {
fn get<'a>(&'a self) -> &'a T {
unsafe { &*self.x.get_immut() }
}
}
/**
* Duplicate an atomically reference counted wrapper.
*
@ -134,13 +131,9 @@ impl<T:Const+Owned> ARC<T> {
* object. However, one of the `arc` objects can be sent to another task,
* allowing them to share the underlying data.
*/
pub fn clone<T:Const + Owned>(rc: &ARC<T>) -> ARC<T> {
ARC { x: rc.x.clone() }
}
impl<T:Const + Owned> Clone for ARC<T> {
fn clone(&self) -> ARC<T> {
clone(self)
ARC { x: self.x.clone() }
}
}
@ -512,17 +505,14 @@ pub impl<'self, T:Const + Owned> RWReadMode<'self, T> {
#[cfg(test)]
mod tests {
use core::prelude::*;
use core::cell::Cell;
use arc::*;
use arc;
use core::cell::Cell;
use core::task;
#[test]
fn manually_share_arc() {
let v = ~[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let arc_v = arc::ARC(v);
let arc_v = ARC(v);
let (p, c) = comm::stream();
@ -530,16 +520,16 @@ mod tests {
let p = comm::PortSet::new();
c.send(p.chan());
let arc_v = p.recv();
let arc_v : ARC<~[int]> = p.recv();
let v = copy *arc::get::<~[int]>(&arc_v);
let v = copy (*arc_v.get());
assert_eq!(v[3], 4);
};
let c = p.recv();
c.send(arc::clone(&arc_v));
c.send(arc_v.clone());
assert_eq!((*arc::get(&arc_v))[2], 3);
assert_eq!(arc_v.get()[2], 3);
assert_eq!(arc_v.get()[4], 5);
info!(arc_v);

View File

@ -1,6 +1,6 @@
// xfail-pretty
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
@ -234,7 +234,7 @@ fn pbfs(graph: &arc::ARC<graph>, key: node_id) -> bfs_result {
black(node_id)
};
let graph_vec = arc::get(graph); // FIXME #3387 requires this temp
let graph_vec = graph.get(); // FIXME #3387 requires this temp
let mut colors = do vec::from_fn(graph_vec.len()) |i| {
if i as node_id == key {
gray(key)
@ -266,13 +266,13 @@ fn pbfs(graph: &arc::ARC<graph>, key: node_id) -> bfs_result {
let color = arc::ARC(colors);
let color_vec = arc::get(&color); // FIXME #3387 requires this temp
let color_vec = color.get(); // FIXME #3387 requires this temp
colors = do par::mapi(*color_vec) {
let colors = arc::clone(&color);
let graph = arc::clone(graph);
let colors = color.clone();
let graph = graph.clone();
let result: ~fn(x: uint, y: &color) -> color = |i, c| {
let colors = arc::get(&colors);
let graph = arc::get(&graph);
let colors = colors.get();
let graph = graph.get();
match *c {
white => {
let i = i as node_id;

View File

@ -1,4 +1,4 @@
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
@ -18,11 +18,11 @@ fn main() {
let arc_v = arc::ARC(v);
do task::spawn() {
let v = *arc::get(&arc_v);
let v = arc_v.get();
assert_eq!(v[3], 4);
};
assert_eq!((*arc::get(&arc_v))[2], 3);
assert_eq!((arc_v.get())[2], 3);
info!(arc_v);
}

View File

@ -1,4 +1,4 @@
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
@ -16,11 +16,11 @@ fn main() {
let arc_v = arc::ARC(v);
do task::spawn() { //~ NOTE `arc_v` moved into closure environment here
let v = *arc::get(&arc_v);
let v = arc_v.get();
assert_eq!(v[3], 4);
};
assert!((*arc::get(&arc_v))[2] == 3); //~ ERROR use of moved value: `arc_v`
assert_eq!((arc_v.get())[2], 3); //~ ERROR use of moved value: `arc_v`
info!(arc_v);
}