implement `IntoIterator` for `Vec`

pull/337/head
Kirin 3 years ago
parent 98a2ca0eef
commit ae64208c26

@ -82,8 +82,10 @@ impl<T> Drop for IntoIter<T> {
}
}
impl<T> Vec<T> {
pub fn into_iter(self) -> IntoIter<T> {
impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(self) -> IntoIter<T> {
unsafe {
let iter = RawValIter::new(&self);

@ -158,19 +158,6 @@ impl<T> Vec<T> {
}
}
pub fn into_iter(self) -> IntoIter<T> {
unsafe {
let iter = RawValIter::new(&self);
let buf = ptr::read(&self.buf);
mem::forget(self);
IntoIter {
iter: iter,
_buf: buf,
}
}
}
pub fn drain(&mut self) -> Drain<T> {
unsafe {
let iter = RawValIter::new(&self);
@ -208,6 +195,23 @@ impl<T> DerefMut for Vec<T> {
}
}
impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(self) -> IntoIter<T> {
unsafe {
let iter = RawValIter::new(&self);
let buf = ptr::read(&self.buf);
mem::forget(self);
IntoIter {
iter: iter,
_buf: buf,
}
}
}
}
struct RawValIter<T> {
start: *const T,
end: *const T,

@ -57,8 +57,10 @@ And this is what we end up with for initialization:
<!-- ignore: simplified code -->
```rust,ignore
impl<T> Vec<T> {
pub fn into_iter(self) -> IntoIter<T> {
impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(self) -> IntoIter<T> {
// Can't destructure Vec since it's Drop
let ptr = self.ptr;
let cap = self.cap;

@ -134,8 +134,10 @@ impl<T> Drop for IntoIter<T> {
}
}
impl<T> Vec<T> {
pub fn into_iter(self) -> IntoIter<T> {
impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(self) -> IntoIter<T> {
unsafe {
// need to use ptr::read to unsafely move the buf out since it's
// not Copy, and Vec implements Drop (so we can't destructure it).

Loading…
Cancel
Save