Skip to content

Commit

Permalink
Auto merge of #48945 - clarcharr:iter_exhaust, r=Kimundi
Browse files Browse the repository at this point in the history
Replace manual iterator exhaust with for_each(drop)

This originally added a dedicated method, `Iterator::exhaust`, and has since been replaced with `for_each(drop)`, which is more idiomatic.

<del>This is just shorthand for `for _ in &mut self {}` or `while let Some(_) = self.next() {}`. This states the intent a lot more clearly than the identical code: run the iterator to completion.

<del>At least personally, my eyes tend to gloss over `for _ in &mut self {}` without fully paying attention to what it does; having a `Drop` implementation akin to:

<del>`for _ in &mut self {}; unsafe { free(self.ptr); }`</del>

<del>Is not as clear as:

<del>`self.exhaust(); unsafe { free(self.ptr); }`

<del>Additionally, I've seen debate over whether `while let Some(_) = self.next() {}` or `for _ in &mut self {}` is more clear, whereas `self.exhaust()` is clearer than both.
  • Loading branch information
bors committed Apr 16, 2018
2 parents d6a2dd9 + 5c58eec commit 1ef1563
Show file tree
Hide file tree
Showing 6 changed files with 9 additions and 13 deletions.
3 changes: 1 addition & 2 deletions src/liballoc/btree/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1287,8 +1287,7 @@ impl<K, V> IntoIterator for BTreeMap<K, V> {
#[stable(feature = "btree_drop", since = "1.7.0")]
impl<K, V> Drop for IntoIter<K, V> {
fn drop(&mut self) {
for _ in &mut *self {
}
self.for_each(drop);
unsafe {
let leaf_node = ptr::read(&self.front).into_node();
if let Some(first_parent) = leaf_node.deallocate_and_ascend() {
Expand Down
2 changes: 1 addition & 1 deletion src/liballoc/linked_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1019,7 +1019,7 @@ impl<'a, T, F> Drop for DrainFilter<'a, T, F>
where F: FnMut(&mut T) -> bool,
{
fn drop(&mut self) {
for _ in self { }
self.for_each(drop);
}
}

Expand Down
9 changes: 3 additions & 6 deletions src/liballoc/vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2521,7 +2521,7 @@ impl<'a, T> DoubleEndedIterator for Drain<'a, T> {
impl<'a, T> Drop for Drain<'a, T> {
fn drop(&mut self) {
// exhaust self first
while let Some(_) = self.next() {}
self.for_each(drop);

if self.tail_len > 0 {
unsafe {
Expand Down Expand Up @@ -2590,9 +2590,7 @@ impl<'a, I: Iterator> ExactSizeIterator for Splice<'a, I> {}
#[stable(feature = "vec_splice", since = "1.21.0")]
impl<'a, I: Iterator> Drop for Splice<'a, I> {
fn drop(&mut self) {
// exhaust drain first
while let Some(_) = self.drain.next() {}

self.drain.by_ref().for_each(drop);

unsafe {
if self.drain.tail_len == 0 {
Expand Down Expand Up @@ -2721,8 +2719,7 @@ impl<'a, T, F> Drop for DrainFilter<'a, T, F>
where F: FnMut(&mut T) -> bool,
{
fn drop(&mut self) {
for _ in self.by_ref() { }

self.for_each(drop);
unsafe {
self.vec.set_len(self.old_len - self.del);
}
Expand Down
2 changes: 1 addition & 1 deletion src/liballoc/vec_deque.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2250,7 +2250,7 @@ unsafe impl<'a, T: Send> Send for Drain<'a, T> {}
#[stable(feature = "drain", since = "1.6.0")]
impl<'a, T: 'a> Drop for Drain<'a, T> {
fn drop(&mut self) {
for _ in self.by_ref() {}
self.for_each(drop);

let source_deque = unsafe { self.deque.as_mut() };

Expand Down
4 changes: 2 additions & 2 deletions src/librustc_data_structures/array_vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ pub struct Iter<A: Array> {

impl<A: Array> Drop for Iter<A> {
fn drop(&mut self) {
for _ in self {}
self.for_each(drop);
}
}

Expand Down Expand Up @@ -251,7 +251,7 @@ impl<'a, A: Array> Iterator for Drain<'a, A> {
impl<'a, A: Array> Drop for Drain<'a, A> {
fn drop(&mut self) {
// exhaust self first
while let Some(_) = self.next() {}
self.for_each(drop);

if self.tail_len > 0 {
unsafe {
Expand Down
2 changes: 1 addition & 1 deletion src/libstd/collections/hash/table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1124,7 +1124,7 @@ impl<'a, K, V> ExactSizeIterator for Drain<'a, K, V> {

impl<'a, K: 'a, V: 'a> Drop for Drain<'a, K, V> {
fn drop(&mut self) {
for _ in self {}
self.for_each(drop);
}
}

Expand Down

0 comments on commit 1ef1563

Please sign in to comment.