Removed DeepClone. Issue #12698.
This commit is contained in:
parent
96e8c00e95
commit
438893b36f
28 changed files with 36 additions and 367 deletions
|
@ -11,7 +11,7 @@
|
||||||
//! Types dealing with dynamic mutability
|
//! Types dealing with dynamic mutability
|
||||||
|
|
||||||
use cast;
|
use cast;
|
||||||
use clone::{Clone, DeepClone};
|
use clone::Clone;
|
||||||
use cmp::Eq;
|
use cmp::Eq;
|
||||||
use fmt;
|
use fmt;
|
||||||
use kinds::{marker, Pod};
|
use kinds::{marker, Pod};
|
||||||
|
@ -222,13 +222,6 @@ impl<T: Clone> Clone for RefCell<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: DeepClone> DeepClone for RefCell<T> {
|
|
||||||
fn deep_clone(&self) -> RefCell<T> {
|
|
||||||
let x = self.borrow();
|
|
||||||
RefCell::new(x.get().deep_clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Eq> Eq for RefCell<T> {
|
impl<T: Eq> Eq for RefCell<T> {
|
||||||
fn eq(&self, other: &RefCell<T>) -> bool {
|
fn eq(&self, other: &RefCell<T>) -> bool {
|
||||||
let a = self.borrow();
|
let a = self.borrow();
|
||||||
|
|
|
@ -21,8 +21,6 @@ the `clone` method.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use std::kinds::Freeze;
|
|
||||||
|
|
||||||
/// A common trait for cloning an object.
|
/// A common trait for cloning an object.
|
||||||
pub trait Clone {
|
pub trait Clone {
|
||||||
/// Returns a copy of the value. The contents of owned pointers
|
/// Returns a copy of the value. The contents of owned pointers
|
||||||
|
@ -125,92 +123,6 @@ extern_fn_clone!(A, B, C, D, E, F)
|
||||||
extern_fn_clone!(A, B, C, D, E, F, G)
|
extern_fn_clone!(A, B, C, D, E, F, G)
|
||||||
extern_fn_clone!(A, B, C, D, E, F, G, H)
|
extern_fn_clone!(A, B, C, D, E, F, G, H)
|
||||||
|
|
||||||
/// A trait distinct from `Clone` which represents "deep copies" of things like
|
|
||||||
/// managed boxes which would otherwise not be copied.
|
|
||||||
pub trait DeepClone: Clone {
|
|
||||||
/// Return a deep copy of the value. Unlike `Clone`, the contents of shared pointer types
|
|
||||||
/// *are* copied.
|
|
||||||
fn deep_clone(&self) -> Self;
|
|
||||||
|
|
||||||
/// Perform deep copy-assignment from `source`.
|
|
||||||
///
|
|
||||||
/// `a.deep_clone_from(&b)` is equivalent to `a = b.deep_clone()` in
|
|
||||||
/// functionality, but can be overridden to reuse the resources of `a` to
|
|
||||||
/// avoid unnecessary allocations.
|
|
||||||
#[inline(always)]
|
|
||||||
fn deep_clone_from(&mut self, source: &Self) {
|
|
||||||
*self = source.deep_clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: DeepClone> DeepClone for ~T {
|
|
||||||
/// Return a deep copy of the owned box.
|
|
||||||
#[inline]
|
|
||||||
fn deep_clone(&self) -> ~T { ~(**self).deep_clone() }
|
|
||||||
|
|
||||||
/// Perform deep copy-assignment from `source` by reusing the existing allocation.
|
|
||||||
fn deep_clone_from(&mut self, source: &~T) {
|
|
||||||
**self = (**source).deep_clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: #6525: should also be implemented for `T: Send + DeepClone`
|
|
||||||
impl<T: Freeze + DeepClone + 'static> DeepClone for @T {
|
|
||||||
/// Return a deep copy of the managed box. The `Freeze` trait is required to prevent performing
|
|
||||||
/// a deep clone of a potentially cyclical type.
|
|
||||||
#[inline]
|
|
||||||
fn deep_clone(&self) -> @T { @(**self).deep_clone() }
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! deep_clone_impl(
|
|
||||||
($t:ty) => {
|
|
||||||
impl DeepClone for $t {
|
|
||||||
/// Return a deep copy of the value.
|
|
||||||
#[inline]
|
|
||||||
fn deep_clone(&self) -> $t { *self }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
deep_clone_impl!(int)
|
|
||||||
deep_clone_impl!(i8)
|
|
||||||
deep_clone_impl!(i16)
|
|
||||||
deep_clone_impl!(i32)
|
|
||||||
deep_clone_impl!(i64)
|
|
||||||
|
|
||||||
deep_clone_impl!(uint)
|
|
||||||
deep_clone_impl!(u8)
|
|
||||||
deep_clone_impl!(u16)
|
|
||||||
deep_clone_impl!(u32)
|
|
||||||
deep_clone_impl!(u64)
|
|
||||||
|
|
||||||
deep_clone_impl!(f32)
|
|
||||||
deep_clone_impl!(f64)
|
|
||||||
|
|
||||||
deep_clone_impl!(())
|
|
||||||
deep_clone_impl!(bool)
|
|
||||||
deep_clone_impl!(char)
|
|
||||||
|
|
||||||
macro_rules! extern_fn_deep_clone(
|
|
||||||
($($A:ident),*) => (
|
|
||||||
impl<$($A,)* ReturnType> DeepClone for extern "Rust" fn($($A),*) -> ReturnType {
|
|
||||||
/// Return a copy of a function pointer
|
|
||||||
#[inline]
|
|
||||||
fn deep_clone(&self) -> extern "Rust" fn($($A),*) -> ReturnType { *self }
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
extern_fn_deep_clone!()
|
|
||||||
extern_fn_deep_clone!(A)
|
|
||||||
extern_fn_deep_clone!(A, B)
|
|
||||||
extern_fn_deep_clone!(A, B, C)
|
|
||||||
extern_fn_deep_clone!(A, B, C, D)
|
|
||||||
extern_fn_deep_clone!(A, B, C, D, E)
|
|
||||||
extern_fn_deep_clone!(A, B, C, D, E, F)
|
|
||||||
extern_fn_deep_clone!(A, B, C, D, E, F, G)
|
|
||||||
extern_fn_deep_clone!(A, B, C, D, E, F, G, H)
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_owned_clone() {
|
fn test_owned_clone() {
|
||||||
let a = ~5i;
|
let a = ~5i;
|
||||||
|
@ -241,14 +153,6 @@ fn test_clone_from() {
|
||||||
assert_eq!(*b, 5);
|
assert_eq!(*b, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_deep_clone_from() {
|
|
||||||
let a = ~5;
|
|
||||||
let mut b = ~10;
|
|
||||||
b.deep_clone_from(&a);
|
|
||||||
assert_eq!(*b, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_extern_fn_clone() {
|
fn test_extern_fn_clone() {
|
||||||
trait Empty {}
|
trait Empty {}
|
||||||
|
@ -261,8 +165,4 @@ fn test_extern_fn_clone() {
|
||||||
let _ = test_fn_a.clone();
|
let _ = test_fn_a.clone();
|
||||||
let _ = test_fn_b::<int>.clone();
|
let _ = test_fn_b::<int>.clone();
|
||||||
let _ = test_fn_c.clone();
|
let _ = test_fn_c.clone();
|
||||||
|
|
||||||
let _ = test_fn_a.deep_clone();
|
|
||||||
let _ = test_fn_b::<int>.deep_clone();
|
|
||||||
let _ = test_fn_c.deep_clone();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,7 @@ collector is task-local so `Gc<T>` is not sendable.
|
||||||
#[allow(experimental)];
|
#[allow(experimental)];
|
||||||
|
|
||||||
use kinds::marker;
|
use kinds::marker;
|
||||||
use kinds::Send;
|
use clone::Clone;
|
||||||
use clone::{Clone, DeepClone};
|
|
||||||
use managed;
|
use managed;
|
||||||
|
|
||||||
/// Immutable garbage-collected pointer type
|
/// Immutable garbage-collected pointer type
|
||||||
|
@ -78,16 +77,6 @@ pub static GC: () = ();
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub static GC: () = ();
|
pub static GC: () = ();
|
||||||
|
|
||||||
/// The `Send` bound restricts this to acyclic graphs where it is well-defined.
|
|
||||||
///
|
|
||||||
/// A `Freeze` bound would also work, but `Send` *or* `Freeze` cannot be expressed.
|
|
||||||
impl<T: DeepClone + Send + 'static> DeepClone for Gc<T> {
|
|
||||||
#[inline]
|
|
||||||
fn deep_clone(&self) -> Gc<T> {
|
|
||||||
Gc::new(self.borrow().deep_clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use prelude::*;
|
use prelude::*;
|
||||||
|
@ -104,16 +93,6 @@ mod tests {
|
||||||
assert_eq!(y.borrow().with(|x| *x), 20);
|
assert_eq!(y.borrow().with(|x| *x), 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_deep_clone() {
|
|
||||||
let x = Gc::new(RefCell::new(5));
|
|
||||||
let y = x.deep_clone();
|
|
||||||
x.borrow().with_mut(|inner| {
|
|
||||||
*inner = 20;
|
|
||||||
});
|
|
||||||
assert_eq!(y.borrow().with(|x| *x), 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_simple() {
|
fn test_simple() {
|
||||||
let x = Gc::new(5);
|
let x = Gc::new(5);
|
||||||
|
|
|
@ -1757,7 +1757,7 @@ impl<'a,
|
||||||
|
|
||||||
/// An iterator that yields `None` forever after the underlying iterator
|
/// An iterator that yields `None` forever after the underlying iterator
|
||||||
/// yields `None` once.
|
/// yields `None` once.
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
pub struct Fuse<T> {
|
pub struct Fuse<T> {
|
||||||
priv iter: T,
|
priv iter: T,
|
||||||
priv done: bool
|
priv done: bool
|
||||||
|
@ -1946,7 +1946,7 @@ impl<A: Add<A, A> + Clone> Iterator<A> for Counter<A> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An iterator over the range [start, stop)
|
/// An iterator over the range [start, stop)
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
pub struct Range<A> {
|
pub struct Range<A> {
|
||||||
priv state: A,
|
priv state: A,
|
||||||
priv stop: A,
|
priv stop: A,
|
||||||
|
@ -2020,7 +2020,7 @@ impl<A: Int + Ord + Clone + ToPrimitive> DoubleEndedIterator<A> for Range<A> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An iterator over the range [start, stop]
|
/// An iterator over the range [start, stop]
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
pub struct RangeInclusive<A> {
|
pub struct RangeInclusive<A> {
|
||||||
priv range: Range<A>,
|
priv range: Range<A>,
|
||||||
priv done: bool
|
priv done: bool
|
||||||
|
@ -2083,7 +2083,7 @@ impl<A: Sub<A, A> + Int + Ord + Clone + ToPrimitive> DoubleEndedIterator<A>
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An iterator over the range [start, stop) by `step`. It handles overflow by stopping.
|
/// An iterator over the range [start, stop) by `step`. It handles overflow by stopping.
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
pub struct RangeStep<A> {
|
pub struct RangeStep<A> {
|
||||||
priv state: A,
|
priv state: A,
|
||||||
priv stop: A,
|
priv stop: A,
|
||||||
|
@ -2115,7 +2115,7 @@ impl<A: CheckedAdd + Ord + Clone> Iterator<A> for RangeStep<A> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An iterator over the range [start, stop] by `step`. It handles overflow by stopping.
|
/// An iterator over the range [start, stop] by `step`. It handles overflow by stopping.
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
pub struct RangeStepInclusive<A> {
|
pub struct RangeStepInclusive<A> {
|
||||||
priv state: A,
|
priv state: A,
|
||||||
priv stop: A,
|
priv stop: A,
|
||||||
|
@ -2150,7 +2150,7 @@ impl<A: CheckedAdd + Ord + Clone + Eq> Iterator<A> for RangeStepInclusive<A> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An iterator that repeats an element endlessly
|
/// An iterator that repeats an element endlessly
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
pub struct Repeat<A> {
|
pub struct Repeat<A> {
|
||||||
priv element: A
|
priv element: A
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
#[allow(missing_doc)];
|
#[allow(missing_doc)];
|
||||||
|
|
||||||
use clone::{Clone, DeepClone};
|
use clone::Clone;
|
||||||
use cmp::{Eq, Ord};
|
use cmp::{Eq, Ord};
|
||||||
use kinds::Pod;
|
use kinds::Pod;
|
||||||
use mem::size_of;
|
use mem::size_of;
|
||||||
|
@ -247,7 +247,6 @@ pub trait Bitwise: Bounded
|
||||||
/// may be useful for systems programming.
|
/// may be useful for systems programming.
|
||||||
pub trait Primitive: Pod
|
pub trait Primitive: Pod
|
||||||
+ Clone
|
+ Clone
|
||||||
+ DeepClone
|
|
||||||
+ Num
|
+ Num
|
||||||
+ NumCast
|
+ NumCast
|
||||||
+ Ord
|
+ Ord
|
||||||
|
|
|
@ -39,8 +39,7 @@
|
||||||
|
|
||||||
use any::Any;
|
use any::Any;
|
||||||
use clone::Clone;
|
use clone::Clone;
|
||||||
use clone::DeepClone;
|
use cmp::{Eq, TotalEq, TotalOrd};
|
||||||
use cmp::{Eq, TotalOrd};
|
|
||||||
use default::Default;
|
use default::Default;
|
||||||
use iter::{Iterator, DoubleEndedIterator, FromIterator, ExactSize};
|
use iter::{Iterator, DoubleEndedIterator, FromIterator, ExactSize};
|
||||||
use kinds::Send;
|
use kinds::Send;
|
||||||
|
@ -48,7 +47,7 @@ use mem;
|
||||||
use vec;
|
use vec;
|
||||||
|
|
||||||
/// The option type
|
/// The option type
|
||||||
#[deriving(Clone, DeepClone, Eq, Ord, TotalEq, TotalOrd, Show)]
|
#[deriving(Clone, Eq, Ord, TotalEq, TotalOrd, Show)]
|
||||||
pub enum Option<T> {
|
pub enum Option<T> {
|
||||||
/// No value
|
/// No value
|
||||||
None,
|
None,
|
||||||
|
@ -387,7 +386,7 @@ impl<T> Default for Option<T> {
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/// An iterator that yields either one or zero elements
|
/// An iterator that yields either one or zero elements
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
pub struct Item<A> {
|
pub struct Item<A> {
|
||||||
priv opt: Option<A>
|
priv opt: Option<A>
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ pub type RevStrComponents<'a> = Map<'a, &'a [u8], Option<&'a str>,
|
||||||
RevComponents<'a>>;
|
RevComponents<'a>>;
|
||||||
|
|
||||||
/// Represents a POSIX file path
|
/// Represents a POSIX file path
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
pub struct Path {
|
pub struct Path {
|
||||||
priv repr: ~[u8], // assumed to never be empty or contain NULs
|
priv repr: ~[u8], // assumed to never be empty or contain NULs
|
||||||
priv sepidx: Option<uint> // index of the final separator in repr
|
priv sepidx: Option<uint> // index of the final separator in repr
|
||||||
|
|
|
@ -79,7 +79,7 @@ pub type RevComponents<'a> = Map<'a, Option<&'a str>, &'a [u8],
|
||||||
//
|
//
|
||||||
// The only error condition imposed here is valid utf-8. All other invalid paths are simply
|
// The only error condition imposed here is valid utf-8. All other invalid paths are simply
|
||||||
// preserved by the data structure; let the Windows API error out on them.
|
// preserved by the data structure; let the Windows API error out on them.
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
pub struct Path {
|
pub struct Path {
|
||||||
priv repr: ~str, // assumed to never be empty
|
priv repr: ~str, // assumed to never be empty
|
||||||
priv prefix: Option<PathPrefix>,
|
priv prefix: Option<PathPrefix>,
|
||||||
|
@ -942,7 +942,7 @@ pub fn is_sep_byte_verbatim(u: &u8) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Prefix types for Path
|
/// Prefix types for Path
|
||||||
#[deriving(Eq, Clone, DeepClone)]
|
#[deriving(Eq, Clone)]
|
||||||
pub enum PathPrefix {
|
pub enum PathPrefix {
|
||||||
/// Prefix `\\?\`, uint is the length of the following component
|
/// Prefix `\\?\`, uint is the length of the following component
|
||||||
VerbatimPrefix(uint),
|
VerbatimPrefix(uint),
|
||||||
|
|
|
@ -38,7 +38,7 @@ pub use mem::drop;
|
||||||
pub use ascii::{Ascii, AsciiCast, OwnedAsciiCast, AsciiStr, IntoBytes};
|
pub use ascii::{Ascii, AsciiCast, OwnedAsciiCast, AsciiStr, IntoBytes};
|
||||||
pub use c_str::ToCStr;
|
pub use c_str::ToCStr;
|
||||||
pub use char::Char;
|
pub use char::Char;
|
||||||
pub use clone::{Clone, DeepClone};
|
pub use clone::Clone;
|
||||||
pub use cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater, Equiv};
|
pub use cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater, Equiv};
|
||||||
pub use container::{Container, Mutable, Map, MutableMap, Set, MutableSet};
|
pub use container::{Container, Mutable, Map, MutableMap, Set, MutableSet};
|
||||||
pub use iter::{FromIterator, Extendable};
|
pub use iter::{FromIterator, Extendable};
|
||||||
|
|
|
@ -24,7 +24,7 @@ pointers, and then storing the parent pointers as `Weak` pointers.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use cast::transmute;
|
use cast::transmute;
|
||||||
use clone::{Clone, DeepClone};
|
use clone::Clone;
|
||||||
use cmp::{Eq, Ord};
|
use cmp::{Eq, Ord};
|
||||||
use kinds::marker;
|
use kinds::marker;
|
||||||
use ops::{Deref, Drop};
|
use ops::{Deref, Drop};
|
||||||
|
@ -118,13 +118,6 @@ impl<T> Clone for Rc<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: DeepClone> DeepClone for Rc<T> {
|
|
||||||
#[inline]
|
|
||||||
fn deep_clone(&self) -> Rc<T> {
|
|
||||||
Rc::new(self.borrow().deep_clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Eq> Eq for Rc<T> {
|
impl<T: Eq> Eq for Rc<T> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn eq(&self, other: &Rc<T>) -> bool { *self.borrow() == *other.borrow() }
|
fn eq(&self, other: &Rc<T>) -> bool { *self.borrow() == *other.borrow() }
|
||||||
|
@ -210,16 +203,6 @@ mod tests {
|
||||||
assert_eq!(y.borrow().with(|v| *v), 20);
|
assert_eq!(y.borrow().with(|v| *v), 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_deep_clone() {
|
|
||||||
let x = Rc::new(RefCell::new(5));
|
|
||||||
let y = x.deep_clone();
|
|
||||||
x.borrow().with_mut(|inner| {
|
|
||||||
*inner = 20;
|
|
||||||
});
|
|
||||||
assert_eq!(y.borrow().with(|v| *v), 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_simple() {
|
fn test_simple() {
|
||||||
let x = Rc::new(5);
|
let x = Rc::new(5);
|
||||||
|
|
|
@ -16,7 +16,7 @@ use iter::{Iterator, FromIterator};
|
||||||
use option::{None, Option, Some};
|
use option::{None, Option, Some};
|
||||||
|
|
||||||
/// `Result` is a type that represents either success (`Ok`) or failure (`Err`).
|
/// `Result` is a type that represents either success (`Ok`) or failure (`Err`).
|
||||||
#[deriving(Clone, DeepClone, Eq, Ord, TotalEq, TotalOrd, Show)]
|
#[deriving(Clone, Eq, Ord, TotalEq, TotalOrd, Show)]
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub enum Result<T, E> {
|
pub enum Result<T, E> {
|
||||||
/// Contains the success value
|
/// Contains the success value
|
||||||
|
|
|
@ -85,7 +85,7 @@ use cast;
|
||||||
use cast::transmute;
|
use cast::transmute;
|
||||||
use char;
|
use char;
|
||||||
use char::Char;
|
use char::Char;
|
||||||
use clone::{Clone, DeepClone};
|
use clone::Clone;
|
||||||
use cmp::{Eq, TotalEq, Ord, TotalOrd, Equiv, Ordering};
|
use cmp::{Eq, TotalEq, Ord, TotalOrd, Equiv, Ordering};
|
||||||
use container::{Container, Mutable};
|
use container::{Container, Mutable};
|
||||||
use fmt;
|
use fmt;
|
||||||
|
@ -1326,16 +1326,6 @@ impl<'a> Clone for MaybeOwned<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> DeepClone for MaybeOwned<'a> {
|
|
||||||
#[inline]
|
|
||||||
fn deep_clone(&self) -> MaybeOwned<'a> {
|
|
||||||
match *self {
|
|
||||||
Slice(s) => Slice(s),
|
|
||||||
Owned(ref s) => Owned(s.to_owned())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Default for MaybeOwned<'a> {
|
impl<'a> Default for MaybeOwned<'a> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn default() -> MaybeOwned<'a> { Slice("") }
|
fn default() -> MaybeOwned<'a> { Slice("") }
|
||||||
|
@ -3031,13 +3021,6 @@ impl Clone for ~str {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DeepClone for ~str {
|
|
||||||
#[inline]
|
|
||||||
fn deep_clone(&self) -> ~str {
|
|
||||||
self.to_owned()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromIterator<char> for ~str {
|
impl FromIterator<char> for ~str {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from_iterator<T: Iterator<char>>(iterator: &mut T) -> ~str {
|
fn from_iterator<T: Iterator<char>>(iterator: &mut T) -> ~str {
|
||||||
|
@ -4465,16 +4448,9 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_maybe_owned_clone() {
|
fn test_maybe_owned_clone() {
|
||||||
assert_eq!(Owned(~"abcde"), Slice("abcde").clone());
|
assert_eq!(Owned(~"abcde"), Slice("abcde").clone());
|
||||||
assert_eq!(Owned(~"abcde"), Slice("abcde").deep_clone());
|
|
||||||
|
|
||||||
assert_eq!(Owned(~"abcde"), Owned(~"abcde").clone());
|
assert_eq!(Owned(~"abcde"), Owned(~"abcde").clone());
|
||||||
assert_eq!(Owned(~"abcde"), Owned(~"abcde").deep_clone());
|
|
||||||
|
|
||||||
assert_eq!(Slice("abcde"), Slice("abcde").clone());
|
assert_eq!(Slice("abcde"), Slice("abcde").clone());
|
||||||
assert_eq!(Slice("abcde"), Slice("abcde").deep_clone());
|
|
||||||
|
|
||||||
assert_eq!(Slice("abcde"), Owned(~"abcde").clone());
|
assert_eq!(Slice("abcde"), Owned(~"abcde").clone());
|
||||||
assert_eq!(Slice("abcde"), Owned(~"abcde").deep_clone());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -104,7 +104,7 @@ There are a number of free functions that create or take vectors, for example:
|
||||||
use cast;
|
use cast;
|
||||||
use cast::transmute;
|
use cast::transmute;
|
||||||
use ops::Drop;
|
use ops::Drop;
|
||||||
use clone::{Clone, DeepClone};
|
use clone::Clone;
|
||||||
use container::{Container, Mutable};
|
use container::{Container, Mutable};
|
||||||
use cmp::{Eq, TotalOrd, Ordering, Less, Equal, Greater};
|
use cmp::{Eq, TotalOrd, Ordering, Less, Equal, Greater};
|
||||||
use cmp;
|
use cmp;
|
||||||
|
@ -2635,24 +2635,6 @@ impl<A: Clone> Clone for ~[A] {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<A: DeepClone> DeepClone for ~[A] {
|
|
||||||
#[inline]
|
|
||||||
fn deep_clone(&self) -> ~[A] {
|
|
||||||
self.iter().map(|item| item.deep_clone()).collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn deep_clone_from(&mut self, source: &~[A]) {
|
|
||||||
if self.len() < source.len() {
|
|
||||||
*self = source.deep_clone()
|
|
||||||
} else {
|
|
||||||
self.truncate(source.len());
|
|
||||||
for (x, y) in self.mut_iter().zip(source.iter()) {
|
|
||||||
x.deep_clone_from(y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, T: fmt::Show> fmt::Show for &'a [T] {
|
impl<'a, T: fmt::Show> fmt::Show for &'a [T] {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
try!(write!(f.buf, "["));
|
try!(write!(f.buf, "["));
|
||||||
|
|
|
@ -44,36 +44,6 @@ pub fn expand_deriving_clone(cx: &mut ExtCtxt,
|
||||||
trait_def.expand(cx, mitem, item, push)
|
trait_def.expand(cx, mitem, item, push)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn expand_deriving_deep_clone(cx: &mut ExtCtxt,
|
|
||||||
span: Span,
|
|
||||||
mitem: @MetaItem,
|
|
||||||
item: @Item,
|
|
||||||
push: |@Item|) {
|
|
||||||
let trait_def = TraitDef {
|
|
||||||
span: span,
|
|
||||||
attributes: Vec::new(),
|
|
||||||
path: Path::new(vec!("std", "clone", "DeepClone")),
|
|
||||||
additional_bounds: Vec::new(),
|
|
||||||
generics: LifetimeBounds::empty(),
|
|
||||||
methods: vec!(
|
|
||||||
MethodDef {
|
|
||||||
name: "deep_clone",
|
|
||||||
generics: LifetimeBounds::empty(),
|
|
||||||
explicit_self: borrowed_explicit_self(),
|
|
||||||
args: Vec::new(),
|
|
||||||
ret_ty: Self,
|
|
||||||
inline: true,
|
|
||||||
const_nonmatching: false,
|
|
||||||
// cs_clone uses the ident passed to it, i.e. it will
|
|
||||||
// call deep_clone (not clone) here.
|
|
||||||
combine_substructure: |c, s, sub| cs_clone("DeepClone", c, s, sub)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
trait_def.expand(cx, mitem, item, push)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn cs_clone(
|
fn cs_clone(
|
||||||
name: &str,
|
name: &str,
|
||||||
cx: &mut ExtCtxt, trait_span: Span,
|
cx: &mut ExtCtxt, trait_span: Span,
|
||||||
|
|
|
@ -70,7 +70,6 @@ pub fn expand_meta_deriving(cx: &mut ExtCtxt,
|
||||||
|i| push(i))));
|
|i| push(i))));
|
||||||
match tname.get() {
|
match tname.get() {
|
||||||
"Clone" => expand!(clone::expand_deriving_clone),
|
"Clone" => expand!(clone::expand_deriving_clone),
|
||||||
"DeepClone" => expand!(clone::expand_deriving_deep_clone),
|
|
||||||
|
|
||||||
"Hash" => expand!(hash::expand_deriving_hash),
|
"Hash" => expand!(hash::expand_deriving_hash),
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ mod imp {
|
||||||
/// A record specifying a time value in seconds and nanoseconds.
|
/// A record specifying a time value in seconds and nanoseconds.
|
||||||
|
|
||||||
|
|
||||||
#[deriving(Clone, DeepClone, Eq, Encodable, Decodable, Show)]
|
#[deriving(Clone, Eq, Encodable, Decodable, Show)]
|
||||||
pub struct Timespec { sec: i64, nsec: i32 }
|
pub struct Timespec { sec: i64, nsec: i32 }
|
||||||
/*
|
/*
|
||||||
* Timespec assumes that pre-epoch Timespecs have negative sec and positive
|
* Timespec assumes that pre-epoch Timespecs have negative sec and positive
|
||||||
|
@ -191,7 +191,7 @@ pub fn tzset() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[deriving(Clone, DeepClone, Eq, Encodable, Decodable, Show)]
|
#[deriving(Clone, Eq, Encodable, Decodable, Show)]
|
||||||
pub struct Tm {
|
pub struct Tm {
|
||||||
tm_sec: i32, // seconds after the minute ~[0-60]
|
tm_sec: i32, // seconds after the minute ~[0-60]
|
||||||
tm_min: i32, // minutes after the hour ~[0-59]
|
tm_min: i32, // minutes after the hour ~[0-59]
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
|
||||||
// file at the top-level directory of this distribution and at
|
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
||||||
// option. This file may not be copied, modified, or distributed
|
|
||||||
// except according to those terms.
|
|
||||||
|
|
||||||
// This file was auto-generated using 'src/etc/generate-keyword-span-tests.py'
|
|
||||||
|
|
||||||
#[feature(struct_variant)];
|
|
||||||
extern crate extra;
|
|
||||||
|
|
||||||
#[deriving(Clone)]
|
|
||||||
struct Error;
|
|
||||||
|
|
||||||
#[deriving(DeepClone,Clone)]
|
|
||||||
enum Enum {
|
|
||||||
A {
|
|
||||||
x: Error //~ ERROR
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
|
@ -1,26 +0,0 @@
|
||||||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
|
||||||
// file at the top-level directory of this distribution and at
|
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
||||||
// option. This file may not be copied, modified, or distributed
|
|
||||||
// except according to those terms.
|
|
||||||
|
|
||||||
// This file was auto-generated using 'src/etc/generate-keyword-span-tests.py'
|
|
||||||
|
|
||||||
#[feature(struct_variant)];
|
|
||||||
extern crate extra;
|
|
||||||
|
|
||||||
#[deriving(Clone)]
|
|
||||||
struct Error;
|
|
||||||
|
|
||||||
#[deriving(DeepClone,Clone)]
|
|
||||||
enum Enum {
|
|
||||||
A(
|
|
||||||
Error //~ ERROR
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
|
@ -1,24 +0,0 @@
|
||||||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
|
||||||
// file at the top-level directory of this distribution and at
|
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
||||||
// option. This file may not be copied, modified, or distributed
|
|
||||||
// except according to those terms.
|
|
||||||
|
|
||||||
// This file was auto-generated using 'src/etc/generate-keyword-span-tests.py'
|
|
||||||
|
|
||||||
#[feature(struct_variant)];
|
|
||||||
extern crate extra;
|
|
||||||
|
|
||||||
#[deriving(Clone)]
|
|
||||||
struct Error;
|
|
||||||
|
|
||||||
#[deriving(DeepClone,Clone)]
|
|
||||||
struct Struct {
|
|
||||||
x: Error //~ ERROR
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
|
@ -1,24 +0,0 @@
|
||||||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
|
||||||
// file at the top-level directory of this distribution and at
|
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
||||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
||||||
// option. This file may not be copied, modified, or distributed
|
|
||||||
// except according to those terms.
|
|
||||||
|
|
||||||
// This file was auto-generated using 'src/etc/generate-keyword-span-tests.py'
|
|
||||||
|
|
||||||
#[feature(struct_variant)];
|
|
||||||
extern crate extra;
|
|
||||||
|
|
||||||
#[deriving(Clone)]
|
|
||||||
struct Error;
|
|
||||||
|
|
||||||
#[deriving(DeepClone,Clone)]
|
|
||||||
struct Struct(
|
|
||||||
Error //~ ERROR
|
|
||||||
);
|
|
||||||
|
|
||||||
fn main() {}
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
enum E {
|
enum E {
|
||||||
A,
|
A,
|
||||||
B(()),
|
B(()),
|
||||||
|
@ -17,5 +17,4 @@ enum E {
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
let _ = A.clone();
|
let _ = A.clone();
|
||||||
let _ = B(()).deep_clone();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
enum E<T,U> {
|
enum E<T,U> {
|
||||||
A(T),
|
A(T),
|
||||||
B(T,U),
|
B(T,U),
|
||||||
|
@ -17,5 +17,4 @@ enum E<T,U> {
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
let _ = A::<int, int>(1i).clone();
|
let _ = A::<int, int>(1i).clone();
|
||||||
let _ = B(1i, 1.234).deep_clone();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
struct S<T> {
|
struct S<T> {
|
||||||
foo: (),
|
foo: (),
|
||||||
bar: (),
|
bar: (),
|
||||||
|
@ -16,5 +16,5 @@ struct S<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
let _ = S { foo: (), bar: (), baz: 1i }.clone().deep_clone();
|
let _ = S { foo: (), bar: (), baz: 1i }.clone();
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,9 +8,9 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
struct S<T>(T, ());
|
struct S<T>(T, ());
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
let _ = S(1i, ()).clone().deep_clone();
|
let _ = S(1i, ()).clone();
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#[deriving(Clone, DeepClone)]
|
#[deriving(Clone)]
|
||||||
struct S {
|
struct S {
|
||||||
_int: int,
|
_int: int,
|
||||||
_i8: i8,
|
_i8: i8,
|
||||||
|
|
|
@ -28,21 +28,21 @@ mod submod {
|
||||||
// cause errors about unrecognised module `std` (or `extra`)
|
// cause errors about unrecognised module `std` (or `extra`)
|
||||||
#[deriving(Eq, Ord, TotalEq, TotalOrd,
|
#[deriving(Eq, Ord, TotalEq, TotalOrd,
|
||||||
Hash,
|
Hash,
|
||||||
Clone, DeepClone,
|
Clone,
|
||||||
Show, Rand,
|
Show, Rand,
|
||||||
Encodable, Decodable)]
|
Encodable, Decodable)]
|
||||||
enum A { A1(uint), A2(int) }
|
enum A { A1(uint), A2(int) }
|
||||||
|
|
||||||
#[deriving(Eq, Ord, TotalEq, TotalOrd,
|
#[deriving(Eq, Ord, TotalEq, TotalOrd,
|
||||||
Hash,
|
Hash,
|
||||||
Clone, DeepClone,
|
Clone,
|
||||||
Show, Rand,
|
Show, Rand,
|
||||||
Encodable, Decodable)]
|
Encodable, Decodable)]
|
||||||
struct B { x: uint, y: int }
|
struct B { x: uint, y: int }
|
||||||
|
|
||||||
#[deriving(Eq, Ord, TotalEq, TotalOrd,
|
#[deriving(Eq, Ord, TotalEq, TotalOrd,
|
||||||
Hash,
|
Hash,
|
||||||
Clone, DeepClone,
|
Clone,
|
||||||
Show, Rand,
|
Show, Rand,
|
||||||
Encodable, Decodable)]
|
Encodable, Decodable)]
|
||||||
struct C(uint, int);
|
struct C(uint, int);
|
||||||
|
|
|
@ -10,13 +10,8 @@
|
||||||
|
|
||||||
extern crate collections;
|
extern crate collections;
|
||||||
|
|
||||||
use std::clone::{Clone, DeepClone};
|
use std::container::{Map, MutableMap};
|
||||||
use std::cmp::{TotalEq, Ord, TotalOrd, Equiv};
|
use std::str::{SendStr, Owned, Slice};
|
||||||
use std::cmp::Equal;
|
|
||||||
use std::container::{Container, Map, MutableMap};
|
|
||||||
use std::default::Default;
|
|
||||||
use std::str::{Str, SendStr, Owned, Slice};
|
|
||||||
use std::to_str::ToStr;
|
|
||||||
use collections::HashMap;
|
use collections::HashMap;
|
||||||
use std::option::Some;
|
use std::option::Some;
|
||||||
|
|
||||||
|
|
|
@ -10,12 +10,8 @@
|
||||||
|
|
||||||
extern crate collections;
|
extern crate collections;
|
||||||
|
|
||||||
use std::clone::{Clone, DeepClone};
|
use std::container::{ Map, MutableMap};
|
||||||
use std::cmp::{TotalEq, Ord, TotalOrd, Equiv};
|
use std::str::{SendStr, Owned, Slice};
|
||||||
use std::cmp::Equal;
|
|
||||||
use std::container::{Container, Map, MutableMap};
|
|
||||||
use std::default::Default;
|
|
||||||
use std::str::{Str, SendStr, Owned, Slice};
|
|
||||||
use std::to_str::ToStr;
|
use std::to_str::ToStr;
|
||||||
use self::collections::TreeMap;
|
use self::collections::TreeMap;
|
||||||
use std::option::Some;
|
use std::option::Some;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue