Auto merge of #28602 - apasel422:clone_from, r=bluss

r? @bluss
This commit is contained in:
bors 2015-09-24 14:19:20 +00:00
commit 355bbfb895
4 changed files with 28 additions and 11 deletions

View file

@ -167,12 +167,22 @@ use vec::{self, Vec};
/// item's ordering relative to any other item, as determined by the `Ord`
/// trait, changes while it is in the heap. This is normally only possible
/// through `Cell`, `RefCell`, global state, I/O, or unsafe code.
#[derive(Clone)]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct BinaryHeap<T> {
data: Vec<T>,
}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: Clone> Clone for BinaryHeap<T> {
fn clone(&self) -> Self {
BinaryHeap { data: self.data.clone() }
}
fn clone_from(&mut self, source: &Self) {
self.data.clone_from(&source.data);
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: Ord> Default for BinaryHeap<T> {
#[inline]

View file

@ -62,7 +62,7 @@
#![feature(unsafe_no_drop_flag, filling_drop)]
#![feature(decode_utf16)]
#![feature(utf8_error)]
#![cfg_attr(test, feature(rand, test))]
#![cfg_attr(test, feature(clone_from_slice, rand, test))]
#![feature(no_std)]
#![no_std]

View file

@ -30,7 +30,7 @@ use vec::Vec;
use boxed::Box;
/// A growable string stored as a UTF-8 encoded buffer.
#[derive(Clone, PartialOrd, Eq, Ord)]
#[derive(PartialOrd, Eq, Ord)]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct String {
vec: Vec<u8>,
@ -765,6 +765,17 @@ impl fmt::Display for FromUtf16Error {
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl Clone for String {
fn clone(&self) -> Self {
String { vec: self.vec.clone() }
}
fn clone_from(&mut self, source: &Self) {
self.vec.clone_from(&source.vec);
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl FromIterator<char> for String {
fn from_iter<I: IntoIterator<Item=char>>(iterable: I) -> String {

View file

@ -1007,19 +1007,15 @@ impl<T:Clone> Clone for Vec<T> {
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())
}
self.truncate(other.len());
let len = self.len();
// reuse the contained values' allocations/resources.
for (place, thing) in self.iter_mut().zip(other) {
place.clone_from(thing)
}
self.clone_from_slice(&other[..len]);
// self.len <= other.len due to the truncate above, so the
// slice here is always in-bounds.
let slice = &other[self.len()..];
self.push_all(slice);
self.push_all(&other[len..]);
}
}