Skip to content

Commit

Permalink
make Extend use IntoIterator
Browse files Browse the repository at this point in the history
This breaks all implementors of Extend, as they must now accept IntoIterator instead of Iterator. The fix for this is generally trivial (change the bound, and maybe call into_iter() on the argument to get the old argument).

Users of Extend should be unaffected because Iterators are IntoIterator.

[breaking-change]
  • Loading branch information
Gankra committed Feb 18, 2015
1 parent 5fa9de1 commit 4a9d190
Show file tree
Hide file tree
Showing 16 changed files with 32 additions and 26 deletions.
3 changes: 2 additions & 1 deletion src/libcollections/binary_heap.rs
Expand Up @@ -677,7 +677,8 @@ impl<'a, T> IntoIterator for &'a BinaryHeap<T> where T: Ord {

#[stable(feature = "rust1", since = "1.0.0")]
impl<T: Ord> Extend<T> for BinaryHeap<T> {
fn extend<Iter: Iterator<Item=T>>(&mut self, iter: Iter) {
fn extend<I: IntoIterator<Item=T>>(&mut self, iterable: I) {
let iter = iterable.into_iter();
let (lower, _) = iter.size_hint();

self.reserve(lower);
Expand Down
7 changes: 4 additions & 3 deletions src/libcollections/bit.rs
Expand Up @@ -934,7 +934,8 @@ impl FromIterator<bool> for BitVec {
#[stable(feature = "rust1", since = "1.0.0")]
impl Extend<bool> for BitVec {
#[inline]
fn extend<I: Iterator<Item=bool>>(&mut self, iterator: I) {
fn extend<I: IntoIterator<Item=bool>>(&mut self, iterable: I) {
let iterator = iterable.into_iter();
let (min, _) = iterator.size_hint();
self.reserve(min);
for element in iterator {
Expand Down Expand Up @@ -1143,8 +1144,8 @@ impl FromIterator<usize> for BitSet {
#[stable(feature = "rust1", since = "1.0.0")]
impl Extend<usize> for BitSet {
#[inline]
fn extend<I: Iterator<Item=usize>>(&mut self, iterator: I) {
for i in iterator {
fn extend<I: IntoIterator<Item=usize>>(&mut self, iter: I) {
for i in iter {
self.insert(i);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/libcollections/btree/map.rs
Expand Up @@ -836,7 +836,7 @@ impl<K: Ord, V> FromIterator<(K, V)> for BTreeMap<K, V> {
#[stable(feature = "rust1", since = "1.0.0")]
impl<K: Ord, V> Extend<(K, V)> for BTreeMap<K, V> {
#[inline]
fn extend<T: Iterator<Item=(K, V)>>(&mut self, iter: T) {
fn extend<T: IntoIterator<Item=(K, V)>>(&mut self, iter: T) {
for (k, v) in iter {
self.insert(k, v);
}
Expand Down
2 changes: 1 addition & 1 deletion src/libcollections/btree/set.rs
Expand Up @@ -503,7 +503,7 @@ impl<'a, T> IntoIterator for &'a BTreeSet<T> {
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: Ord> Extend<T> for BTreeSet<T> {
#[inline]
fn extend<Iter: Iterator<Item=T>>(&mut self, iter: Iter) {
fn extend<Iter: IntoIterator<Item=T>>(&mut self, iter: Iter) {
for elem in iter {
self.insert(elem);
}
Expand Down
4 changes: 2 additions & 2 deletions src/libcollections/enum_set.rs
Expand Up @@ -268,8 +268,8 @@ impl<'a, E> IntoIterator for &'a EnumSet<E> where E: CLike {
}

impl<E:CLike> Extend<E> for EnumSet<E> {
fn extend<I: Iterator<Item=E>>(&mut self, iterator: I) {
for element in iterator {
fn extend<I: IntoIterator<Item=E>>(&mut self, iter: I) {
for element in iter {
self.insert(element);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/libcollections/linked_list.rs
Expand Up @@ -872,8 +872,8 @@ impl<'a, T> IntoIterator for &'a mut LinkedList<T> {

#[stable(feature = "rust1", since = "1.0.0")]
impl<A> Extend<A> for LinkedList<A> {
fn extend<T: Iterator<Item=A>>(&mut self, iterator: T) {
for elt in iterator { self.push_back(elt); }
fn extend<T: IntoIterator<Item=A>>(&mut self, iter: T) {
for elt in iter { self.push_back(elt); }
}
}

Expand Down
8 changes: 5 additions & 3 deletions src/libcollections/string.rs
Expand Up @@ -21,7 +21,7 @@ use core::default::Default;
use core::error::Error;
use core::fmt;
use core::hash;
use core::iter::FromIterator;
use core::iter::{IntoIterator, FromIterator};
use core::mem;
use core::ops::{self, Deref, Add, Index};
use core::ptr;
Expand Down Expand Up @@ -728,7 +728,8 @@ impl<'a> FromIterator<&'a str> for String {
#[unstable(feature = "collections",
reason = "waiting on Extend stabilization")]
impl Extend<char> for String {
fn extend<I:Iterator<Item=char>>(&mut self, iterator: I) {
fn extend<I: IntoIterator<Item=char>>(&mut self, iterable: I) {
let iterator = iterable.into_iter();
let (lower_bound, _) = iterator.size_hint();
self.reserve(lower_bound);
for ch in iterator {
Expand All @@ -740,7 +741,8 @@ impl Extend<char> for String {
#[unstable(feature = "collections",
reason = "waiting on Extend stabilization")]
impl<'a> Extend<&'a str> for String {
fn extend<I: Iterator<Item=&'a str>>(&mut self, iterator: I) {
fn extend<I: IntoIterator<Item=&'a str>>(&mut self, iterable: I) {
let iterator = iterable.into_iter();
// A guess that at least one byte per iterator element will be needed.
let (lower_bound, _) = iterator.size_hint();
self.reserve(lower_bound);
Expand Down
3 changes: 2 additions & 1 deletion src/libcollections/vec.rs
Expand Up @@ -1480,7 +1480,8 @@ impl<'a, T> IntoIterator for &'a mut Vec<T> {
#[unstable(feature = "collections", reason = "waiting on Extend stability")]
impl<T> Extend<T> for Vec<T> {
#[inline]
fn extend<I: Iterator<Item=T>>(&mut self, iterator: I) {
fn extend<I: IntoIterator<Item=T>>(&mut self, iterable: I) {
let iterator = iterable.into_iter();
let (lower, _) = iterator.size_hint();
self.reserve(lower);
for element in iterator {
Expand Down
4 changes: 2 additions & 2 deletions src/libcollections/vec_deque.rs
Expand Up @@ -1741,8 +1741,8 @@ impl<'a, T> IntoIterator for &'a mut VecDeque<T> {

#[stable(feature = "rust1", since = "1.0.0")]
impl<A> Extend<A> for VecDeque<A> {
fn extend<T: Iterator<Item=A>>(&mut self, iterator: T) {
for elt in iterator {
fn extend<T: IntoIterator<Item=A>>(&mut self, iter: T) {
for elt in iter {
self.push_back(elt);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/libcollections/vec_map.rs
Expand Up @@ -700,7 +700,7 @@ impl<'a, T> IntoIterator for &'a mut VecMap<T> {

#[stable(feature = "rust1", since = "1.0.0")]
impl<V> Extend<(usize, V)> for VecMap<V> {
fn extend<Iter: Iterator<Item=(usize, V)>>(&mut self, iter: Iter) {
fn extend<I: IntoIterator<Item=(usize, V)>>(&mut self, iter: I) {
for (k, v) in iter {
self.insert(k, v);
}
Expand Down
2 changes: 1 addition & 1 deletion src/libcore/iter.rs
Expand Up @@ -147,7 +147,7 @@ impl<I: Iterator> IntoIterator for I {
pub trait Extend<A> {
/// Extend a container with the elements yielded by an arbitrary iterator
#[stable(feature = "rust1", since = "1.0.0")]
fn extend<T: Iterator<Item=A>>(&mut self, iterator: T);
fn extend<T: IntoIterator<Item=A>>(&mut self, iterable: T);
}

/// An extension trait providing numerous methods applicable to all iterators.
Expand Down
2 changes: 1 addition & 1 deletion src/libstd/collections/hash/map.rs
Expand Up @@ -1570,7 +1570,7 @@ impl<K, V, S, H> Extend<(K, V)> for HashMap<K, V, S>
S: HashState<Hasher=H>,
H: hash::Hasher<Output=u64>
{
fn extend<T: Iterator<Item=(K, V)>>(&mut self, iter: T) {
fn extend<T: IntoIterator<Item=(K, V)>>(&mut self, iter: T) {
for (k, v) in iter {
self.insert(k, v);
}
Expand Down
2 changes: 1 addition & 1 deletion src/libstd/collections/hash/set.rs
Expand Up @@ -636,7 +636,7 @@ impl<T, S, H> Extend<T> for HashSet<T, S>
S: HashState<Hasher=H>,
H: hash::Hasher<Output=u64>
{
fn extend<I: Iterator<Item=T>>(&mut self, iter: I) {
fn extend<I: IntoIterator<Item=T>>(&mut self, iter: I) {
for k in iter {
self.insert(k);
}
Expand Down
4 changes: 2 additions & 2 deletions src/libstd/path.rs
Expand Up @@ -110,7 +110,7 @@ use core::prelude::*;
use ascii::*;
use borrow::BorrowFrom;
use cmp;
use iter;
use iter::{self, IntoIterator};
use mem;
use ops::{self, Deref};
use string::CowString;
Expand Down Expand Up @@ -961,7 +961,7 @@ impl<'a, P: ?Sized + 'a> iter::FromIterator<&'a P> for PathBuf where P: AsPath {
}

impl<'a, P: ?Sized + 'a> iter::Extend<&'a P> for PathBuf where P: AsPath {
fn extend<I: Iterator<Item = &'a P>>(&mut self, iter: I) {
fn extend<I: IntoIterator<Item = &'a P>>(&mut self, iter: I) {
for p in iter {
self.push(p)
}
Expand Down
5 changes: 3 additions & 2 deletions src/libstd/sys/common/wtf8.rs
Expand Up @@ -32,7 +32,7 @@ use borrow::Cow;
use cmp;
use fmt;
use hash::{Hash, Writer, Hasher};
use iter::FromIterator;
use iter::{FromIterator, IntoIterator};
use mem;
use num::Int;
use ops;
Expand Down Expand Up @@ -368,7 +368,8 @@ impl FromIterator<CodePoint> for Wtf8Buf {
/// This replaces surrogate code point pairs with supplementary code points,
/// like concatenating ill-formed UTF-16 strings effectively would.
impl Extend<CodePoint> for Wtf8Buf {
fn extend<T: Iterator<Item=CodePoint>>(&mut self, iterator: T) {
fn extend<T: IntoIterator<Item=CodePoint>>(&mut self, iterable: T) {
let iterator = iterable.into_iter();
let (low, _high) = iterator.size_hint();
// Lower bound of one byte per code point (ASCII only)
self.bytes.reserve(low);
Expand Down
4 changes: 2 additions & 2 deletions src/libsyntax/util/small_vector.rs
Expand Up @@ -11,7 +11,7 @@
use self::SmallVectorRepr::*;
use self::IntoIterRepr::*;

use std::iter::FromIterator;
use std::iter::{IntoIterator, FromIterator};
use std::mem;
use std::slice;
use std::vec;
Expand All @@ -38,7 +38,7 @@ impl<T> FromIterator<T> for SmallVector<T> {
}

impl<T> Extend<T> for SmallVector<T> {
fn extend<I: Iterator<Item=T>>(&mut self, iter: I) {
fn extend<I: IntoIterator<Item=T>>(&mut self, iter: I) {
for val in iter {
self.push(val);
}
Expand Down

0 comments on commit 4a9d190

Please sign in to comment.