Skip to content

Commit

Permalink
Auto merge of #28602 - apasel422:clone_from, r=bluss
Browse files Browse the repository at this point in the history
  • Loading branch information
bors committed Sep 24, 2015
2 parents 8fe79bd + 97f2a32 commit 355bbfb
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 11 deletions.
12 changes: 11 additions & 1 deletion src/libcollections/binary_heap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
2 changes: 1 addition & 1 deletion src/libcollections/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
13 changes: 12 additions & 1 deletion src/libcollections/string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>,
Expand Down Expand Up @@ -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 {
Expand Down
12 changes: 4 additions & 8 deletions src/libcollections/vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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..]);
}
}

Expand Down

0 comments on commit 355bbfb

Please sign in to comment.