std: override clone_from for Vec.
A vector can reuse its allocation (and the allocations/resources of any contained values) when cloning into an already-instantiated vector, so we might as well do so.
This commit is contained in:
parent
0bd6f2ce0b
commit
f5a4837df0
2 changed files with 53 additions and 4 deletions
|
@ -232,4 +232,5 @@ mod std {
|
||||||
pub use to_str;
|
pub use to_str;
|
||||||
pub use ty;
|
pub use ty;
|
||||||
pub use unstable;
|
pub use unstable;
|
||||||
|
pub use vec;
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,11 +310,24 @@ impl<T: Clone> Vec<T> {
|
||||||
|
|
||||||
impl<T:Clone> Clone for Vec<T> {
|
impl<T:Clone> Clone for Vec<T> {
|
||||||
fn clone(&self) -> Vec<T> {
|
fn clone(&self) -> Vec<T> {
|
||||||
let mut vector = Vec::with_capacity(self.len());
|
self.iter().map(|x| x.clone()).collect()
|
||||||
for element in self.iter() {
|
}
|
||||||
vector.push((*element).clone())
|
|
||||||
|
fn clone_from(&mut self, other: &Vec<T>) {
|
||||||
|
// drop anything in self that will not be overwritten
|
||||||
|
if self.len() > other.len() {
|
||||||
|
self.truncate(other.len())
|
||||||
}
|
}
|
||||||
vector
|
|
||||||
|
// reuse the contained values' allocations/resources.
|
||||||
|
for (place, thing) in self.mut_iter().zip(other.iter()) {
|
||||||
|
place.clone_from(thing)
|
||||||
|
}
|
||||||
|
|
||||||
|
// self.len <= other.len due to the truncate above, so the
|
||||||
|
// slice here is always in-bounds.
|
||||||
|
let len = self.len();
|
||||||
|
self.extend(other.slice_from(len).iter().map(|x| x.clone()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1475,4 +1488,39 @@ mod tests {
|
||||||
|
|
||||||
assert!(values == Vec::from_slice([2u8, 3, 5, 6, 7]));
|
assert!(values == Vec::from_slice([2u8, 3, 5, 6, 7]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_clone() {
|
||||||
|
let v: Vec<int> = vec!();
|
||||||
|
let w = vec!(1, 2, 3);
|
||||||
|
|
||||||
|
assert_eq!(v, v.clone());
|
||||||
|
|
||||||
|
let z = w.clone();
|
||||||
|
assert_eq!(w, z);
|
||||||
|
// they should be disjoint in memory.
|
||||||
|
assert!(w.as_ptr() != z.as_ptr())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_clone_from() {
|
||||||
|
let mut v = vec!();
|
||||||
|
let three = vec!(~1, ~2, ~3);
|
||||||
|
let two = vec!(~4, ~5);
|
||||||
|
// zero, long
|
||||||
|
v.clone_from(&three);
|
||||||
|
assert_eq!(v, three);
|
||||||
|
|
||||||
|
// equal
|
||||||
|
v.clone_from(&three);
|
||||||
|
assert_eq!(v, three);
|
||||||
|
|
||||||
|
// long, short
|
||||||
|
v.clone_from(&two);
|
||||||
|
assert_eq!(v, two);
|
||||||
|
|
||||||
|
// short, long
|
||||||
|
v.clone_from(&three);
|
||||||
|
assert_eq!(v, three)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue