Skip to content

Commit f6360b4

Browse files
committed
auto merge of #6527 : thestinger/rust/deep_clone, r=pcwalton
2 parents 2329651 + d6a8343 commit f6360b4

File tree

1 file changed

+36
-11
lines changed

1 file changed

+36
-11
lines changed

src/libcore/clone.rs

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ by convention implementing the `Clone` trait and calling the
2222
2323
*/
2424

25+
use core::kinds::Const;
26+
2527
pub trait Clone {
2628
/// Return a deep copy of the owned object tree. Types with shared ownership like managed boxes
2729
/// are cloned with a shallow copy.
@@ -78,11 +80,32 @@ clone_impl!(char)
7880

7981
pub trait DeepClone {
8082
/// Return a deep copy of the object tree. Types with shared ownership are also copied via a
81-
/// deep copy, unlike `Clone`. Note that this is currently unimplemented for managed boxes, as
82-
/// it would need to handle cycles.
83+
/// deep copy, unlike `Clone`.
8384
fn deep_clone(&self) -> Self;
8485
}
8586

87+
impl<T: DeepClone> DeepClone for ~T {
88+
/// Return a deep copy of the owned box.
89+
#[inline(always)]
90+
fn deep_clone(&self) -> ~T { ~(**self).deep_clone() }
91+
}
92+
93+
// FIXME: #6525: should also be implemented for `T: Owned + DeepClone`
94+
impl<T: Const + DeepClone> DeepClone for @T {
95+
/// Return a deep copy of the managed box. The `Const` trait is required to prevent performing
96+
/// a deep clone of a potentially cyclical type.
97+
#[inline(always)]
98+
fn deep_clone(&self) -> @T { @(**self).deep_clone() }
99+
}
100+
101+
// FIXME: #6525: should also be implemented for `T: Owned + DeepClone`
102+
impl<T: Const + DeepClone> DeepClone for @mut T {
103+
/// Return a deep copy of the managed box. The `Const` trait is required to prevent performing
104+
/// a deep clone of a potentially cyclical type.
105+
#[inline(always)]
106+
fn deep_clone(&self) -> @mut T { @mut (**self).deep_clone() }
107+
}
108+
86109
macro_rules! deep_clone_impl(
87110
($t:ty) => {
88111
impl DeepClone for $t {
@@ -93,12 +116,6 @@ macro_rules! deep_clone_impl(
93116
}
94117
)
95118

96-
impl<T: DeepClone> DeepClone for ~T {
97-
/// Return a deep copy of the owned box.
98-
#[inline(always)]
99-
fn deep_clone(&self) -> ~T { ~(**self).deep_clone() }
100-
}
101-
102119
deep_clone_impl!(int)
103120
deep_clone_impl!(i8)
104121
deep_clone_impl!(i16)
@@ -121,21 +138,29 @@ deep_clone_impl!(char)
121138

122139
#[test]
123140
fn test_owned_clone() {
124-
let a: ~int = ~5i;
141+
let a = ~5i;
125142
let b: ~int = a.clone();
126143
assert!(a == b);
127144
}
128145

129146
#[test]
130147
fn test_managed_clone() {
131-
let a: @int = @5i;
148+
let a = @5i;
132149
let b: @int = a.clone();
133150
assert!(a == b);
134151
}
135152

153+
#[test]
154+
fn test_managed_mut_deep_clone() {
155+
let x = @mut 5i;
156+
let y: @mut int = x.deep_clone();
157+
*x = 20;
158+
assert_eq!(*y, 5);
159+
}
160+
136161
#[test]
137162
fn test_managed_mut_clone() {
138-
let a: @mut int = @mut 5i;
163+
let a = @mut 5i;
139164
let b: @mut int = a.clone();
140165
assert!(a == b);
141166
*b = 10;

0 commit comments

Comments
 (0)