Skip to content

Commit 66613e2

Browse files
committed
make FromIterator use IntoIterator
This breaks all implementors of FromIterator, 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 FromIterator should be unaffected because Iterators are IntoIterator. [breaking-change]
1 parent 4a9d190 commit 66613e2

File tree

20 files changed

+48
-43
lines changed

20 files changed

+48
-43
lines changed

src/libcollections/binary_heap.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -650,8 +650,8 @@ impl<'a, T: 'a> ExactSizeIterator for Drain<'a, T> {}
650650

651651
#[stable(feature = "rust1", since = "1.0.0")]
652652
impl<T: Ord> FromIterator<T> for BinaryHeap<T> {
653-
fn from_iter<Iter: Iterator<Item=T>>(iter: Iter) -> BinaryHeap<T> {
654-
BinaryHeap::from_vec(iter.collect())
653+
fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> BinaryHeap<T> {
654+
BinaryHeap::from_vec(iter.into_iter().collect())
655655
}
656656
}
657657

src/libcollections/bit.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -924,9 +924,9 @@ impl Default for BitVec {
924924

925925
#[stable(feature = "rust1", since = "1.0.0")]
926926
impl FromIterator<bool> for BitVec {
927-
fn from_iter<I:Iterator<Item=bool>>(iterator: I) -> BitVec {
928-
let mut ret = BitVec::new();
929-
ret.extend(iterator);
927+
fn from_iter<I: IntoIterator<Item=bool>>(iter: I) -> BitVec {
928+
let mut ret = Bitv::new();
929+
ret.extend(iter);
930930
ret
931931
}
932932
}
@@ -1134,9 +1134,9 @@ impl Default for BitSet {
11341134

11351135
#[stable(feature = "rust1", since = "1.0.0")]
11361136
impl FromIterator<usize> for BitSet {
1137-
fn from_iter<I:Iterator<Item=usize>>(iterator: I) -> BitSet {
1138-
let mut ret = BitSet::new();
1139-
ret.extend(iterator);
1137+
fn from_iter<I: IntoIterator<Item=usize>>(iter: I) -> BitSet {
1138+
let mut ret = BitvSet::new();
1139+
ret.extend(iter);
11401140
ret
11411141
}
11421142
}

src/libcollections/btree/map.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,7 @@ mod stack {
826826

827827
#[stable(feature = "rust1", since = "1.0.0")]
828828
impl<K: Ord, V> FromIterator<(K, V)> for BTreeMap<K, V> {
829-
fn from_iter<T: Iterator<Item=(K, V)>>(iter: T) -> BTreeMap<K, V> {
829+
fn from_iter<T: IntoIterator<Item=(K, V)>>(iter: T) -> BTreeMap<K, V> {
830830
let mut map = BTreeMap::new();
831831
map.extend(iter);
832832
map

src/libcollections/btree/set.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ impl<T: Ord> BTreeSet<T> {
473473

474474
#[stable(feature = "rust1", since = "1.0.0")]
475475
impl<T: Ord> FromIterator<T> for BTreeSet<T> {
476-
fn from_iter<Iter: Iterator<Item=T>>(iter: Iter) -> BTreeSet<T> {
476+
fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> BTreeSet<T> {
477477
let mut set = BTreeSet::new();
478478
set.extend(iter);
479479
set

src/libcollections/enum_set.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,9 @@ impl<E:CLike> Iterator for Iter<E> {
250250
}
251251

252252
impl<E:CLike> FromIterator<E> for EnumSet<E> {
253-
fn from_iter<I:Iterator<Item=E>>(iterator: I) -> EnumSet<E> {
253+
fn from_iter<I: IntoIterator<Item=E>>(iter: I) -> EnumSet<E> {
254254
let mut ret = EnumSet::new();
255-
ret.extend(iterator);
255+
ret.extend(iter);
256256
ret
257257
}
258258
}

src/libcollections/linked_list.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -834,9 +834,9 @@ impl<A> DoubleEndedIterator for IntoIter<A> {
834834

835835
#[stable(feature = "rust1", since = "1.0.0")]
836836
impl<A> FromIterator<A> for LinkedList<A> {
837-
fn from_iter<T: Iterator<Item=A>>(iterator: T) -> LinkedList<A> {
838-
let mut ret = LinkedList::new();
839-
ret.extend(iterator);
837+
fn from_iter<T: IntoIterator<Item=A>>(iter: T) -> LinkedList<A> {
838+
let mut ret = DList::new();
839+
ret.extend(iter);
840840
ret
841841
}
842842
}

src/libcollections/string.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -709,18 +709,18 @@ impl Error for FromUtf16Error {
709709

710710
#[stable(feature = "rust1", since = "1.0.0")]
711711
impl FromIterator<char> for String {
712-
fn from_iter<I:Iterator<Item=char>>(iterator: I) -> String {
712+
fn from_iter<I: IntoIterator<Item=char>>(iter: I) -> String {
713713
let mut buf = String::new();
714-
buf.extend(iterator);
714+
buf.extend(iter);
715715
buf
716716
}
717717
}
718718

719719
#[stable(feature = "rust1", since = "1.0.0")]
720720
impl<'a> FromIterator<&'a str> for String {
721-
fn from_iter<I:Iterator<Item=&'a str>>(iterator: I) -> String {
721+
fn from_iter<I: IntoIterator<Item=&'a str>>(iter: I) -> String {
722722
let mut buf = String::new();
723-
buf.extend(iterator);
723+
buf.extend(iter);
724724
buf
725725
}
726726
}

src/libcollections/vec.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,7 +1407,8 @@ impl<T> ops::DerefMut for Vec<T> {
14071407
#[stable(feature = "rust1", since = "1.0.0")]
14081408
impl<T> FromIterator<T> for Vec<T> {
14091409
#[inline]
1410-
fn from_iter<I:Iterator<Item=T>>(mut iterator: I) -> Vec<T> {
1410+
fn from_iter<I: IntoIterator<Item=T>>(iterable: I) -> Vec<T> {
1411+
let mut iterator = iterable.into_iter();
14111412
let (lower, _) = iterator.size_hint();
14121413
let mut vector = Vec::with_capacity(lower);
14131414

@@ -1651,7 +1652,7 @@ pub type CowVec<'a, T> = Cow<'a, Vec<T>, [T]>;
16511652

16521653
#[unstable(feature = "collections")]
16531654
impl<'a, T> FromIterator<T> for CowVec<'a, T> where T: Clone {
1654-
fn from_iter<I: Iterator<Item=T>>(it: I) -> CowVec<'a, T> {
1655+
fn from_iter<I: IntoIterator<Item=T>>(it: I) -> CowVec<'a, T> {
16551656
Cow::Owned(FromIterator::from_iter(it))
16561657
}
16571658
}

src/libcollections/vec_deque.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1701,7 +1701,8 @@ impl<A> IndexMut<usize> for VecDeque<A> {
17011701

17021702
#[stable(feature = "rust1", since = "1.0.0")]
17031703
impl<A> FromIterator<A> for VecDeque<A> {
1704-
fn from_iter<T: Iterator<Item=A>>(iterator: T) -> VecDeque<A> {
1704+
fn from_iter<T: IntoIterator<Item=A>>(iterable: T) -> VecDeque<A> {
1705+
let iterator = iterable.into_iter();
17051706
let (lower, _) = iterator.size_hint();
17061707
let mut deq = VecDeque::with_capacity(lower);
17071708
deq.extend(iterator);

src/libcollections/vec_map.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ impl<V: fmt::Debug> fmt::Debug for VecMap<V> {
661661

662662
#[stable(feature = "rust1", since = "1.0.0")]
663663
impl<V> FromIterator<(usize, V)> for VecMap<V> {
664-
fn from_iter<Iter: Iterator<Item=(usize, V)>>(iter: Iter) -> VecMap<V> {
664+
fn from_iter<I: IntoIterator<Item=(usize, V)>>(iter: I) -> VecMap<V> {
665665
let mut map = VecMap::new();
666666
map.extend(iter);
667667
map

src/libcore/iter.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,9 @@ impl<'a, I: Iterator + ?Sized> Iterator for &'a mut I {
113113
#[rustc_on_unimplemented="a collection of type `{Self}` cannot be \
114114
built from an iterator over elements of type `{A}`"]
115115
pub trait FromIterator<A> {
116-
/// Build a container with elements from an external iterator.
116+
/// Build a container with elements from something iterable.
117117
#[stable(feature = "rust1", since = "1.0.0")]
118-
fn from_iter<T: Iterator<Item=A>>(iterator: T) -> Self;
118+
fn from_iter<T: IntoIterator<Item=A>>(iterator: T) -> Self;
119119
}
120120

121121
/// Conversion into an `Iterator`

src/libcore/option.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ use clone::Clone;
149149
use cmp::{Eq, Ord};
150150
use default::Default;
151151
use iter::{ExactSizeIterator};
152-
use iter::{Iterator, IteratorExt, DoubleEndedIterator, FromIterator};
152+
use iter::{Iterator, IteratorExt, DoubleEndedIterator, FromIterator, IntoIterator};
153153
use mem;
154154
use ops::{Deref, FnOnce};
155155
use result::Result::{Ok, Err};
@@ -909,7 +909,7 @@ impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {
909909
/// ```
910910
#[inline]
911911
#[stable(feature = "rust1", since = "1.0.0")]
912-
fn from_iter<I: Iterator<Item=Option<A>>>(iter: I) -> Option<V> {
912+
fn from_iter<I: IntoIterator<Item=Option<A>>>(iter: I) -> Option<V> {
913913
// FIXME(#11084): This could be replaced with Iterator::scan when this
914914
// performance bug is closed.
915915

@@ -934,7 +934,7 @@ impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {
934934
}
935935
}
936936

937-
let mut adapter = Adapter { iter: iter, found_none: false };
937+
let mut adapter = Adapter { iter: iter.into_iter(), found_none: false };
938938
let v: V = FromIterator::from_iter(adapter.by_ref());
939939

940940
if adapter.found_none {

src/libcore/result.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,8 @@ use self::Result::{Ok, Err};
230230

231231
use clone::Clone;
232232
use fmt;
233-
use iter::{Iterator, IteratorExt, DoubleEndedIterator, FromIterator, ExactSizeIterator};
233+
use iter::{Iterator, IteratorExt, DoubleEndedIterator,
234+
FromIterator, ExactSizeIterator, IntoIterator};
234235
use ops::{FnMut, FnOnce};
235236
use option::Option::{self, None, Some};
236237
use slice::AsSlice;
@@ -906,7 +907,7 @@ impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> {
906907
/// assert!(res == Ok(vec!(2, 3)));
907908
/// ```
908909
#[inline]
909-
fn from_iter<I: Iterator<Item=Result<A, E>>>(iter: I) -> Result<V, E> {
910+
fn from_iter<I: IntoIterator<Item=Result<A, E>>>(iter: I) -> Result<V, E> {
910911
// FIXME(#11084): This could be replaced with Iterator::scan when this
911912
// performance bug is closed.
912913

@@ -931,7 +932,7 @@ impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> {
931932
}
932933
}
933934

934-
let mut adapter = Adapter { iter: iter, err: None };
935+
let mut adapter = Adapter { iter: iter.into_iter(), err: None };
935936
let v: V = FromIterator::from_iter(adapter.by_ref());
936937

937938
match adapter.err {

src/librustc/middle/check_match.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use middle::ty::*;
2525
use middle::ty;
2626
use std::cmp::Ordering;
2727
use std::fmt;
28-
use std::iter::{range_inclusive, AdditiveIterator, FromIterator, repeat};
28+
use std::iter::{range_inclusive, AdditiveIterator, FromIterator, IntoIterator, repeat};
2929
use std::num::Float;
3030
use std::slice;
3131
use syntax::ast::{self, DUMMY_NODE_ID, NodeId, Pat};
@@ -94,8 +94,8 @@ impl<'a> fmt::Debug for Matrix<'a> {
9494
}
9595

9696
impl<'a> FromIterator<Vec<&'a Pat>> for Matrix<'a> {
97-
fn from_iter<T: Iterator<Item=Vec<&'a Pat>>>(iterator: T) -> Matrix<'a> {
98-
Matrix(iterator.collect())
97+
fn from_iter<T: IntoIterator<Item=Vec<&'a Pat>>>(iter: T) -> Matrix<'a> {
98+
Matrix(iter.into_iter().collect())
9999
}
100100
}
101101

src/libstd/collections/hash/map.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1555,7 +1555,8 @@ impl<K, V, S, H> FromIterator<(K, V)> for HashMap<K, V, S>
15551555
S: HashState<Hasher=H> + Default,
15561556
H: hash::Hasher<Output=u64>
15571557
{
1558-
fn from_iter<T: Iterator<Item=(K, V)>>(iter: T) -> HashMap<K, V, S> {
1558+
fn from_iter<T: IntoIterator<Item=(K, V)>>(iterable: T) -> HashMap<K, V, S> {
1559+
let iter = iterable.into_iter();
15591560
let lower = iter.size_hint().0;
15601561
let mut map = HashMap::with_capacity_and_hash_state(lower,
15611562
Default::default());

src/libstd/collections/hash/set.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,8 @@ impl<T, S, H> FromIterator<T> for HashSet<T, S>
622622
S: HashState<Hasher=H> + Default,
623623
H: hash::Hasher<Output=u64>
624624
{
625-
fn from_iter<I: Iterator<Item=T>>(iter: I) -> HashSet<T, S> {
625+
fn from_iter<I: IntoIterator<Item=T>>(iterable: I) -> HashSet<T, S> {
626+
let iter = iterable.into_iter();
626627
let lower = iter.size_hint().0;
627628
let mut set = HashSet::with_capacity_and_hash_state(lower, Default::default());
628629
set.extend(iter);

src/libstd/path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -953,7 +953,7 @@ impl PathBuf {
953953
}
954954

955955
impl<'a, P: ?Sized + 'a> iter::FromIterator<&'a P> for PathBuf where P: AsPath {
956-
fn from_iter<I: Iterator<Item = &'a P>>(iter: I) -> PathBuf {
956+
fn from_iter<I: IntoIterator<Item = &'a P>>(iter: I) -> PathBuf {
957957
let mut buf = PathBuf::new("");
958958
buf.extend(iter);
959959
buf

src/libstd/sys/common/wtf8.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,9 +356,9 @@ impl Wtf8Buf {
356356
/// This replaces surrogate code point pairs with supplementary code points,
357357
/// like concatenating ill-formed UTF-16 strings effectively would.
358358
impl FromIterator<CodePoint> for Wtf8Buf {
359-
fn from_iter<T: Iterator<Item=CodePoint>>(iterator: T) -> Wtf8Buf {
359+
fn from_iter<T: IntoIterator<Item=CodePoint>>(iter: T) -> Wtf8Buf {
360360
let mut string = Wtf8Buf::new();
361-
string.extend(iterator);
361+
string.extend(iter);
362362
string
363363
}
364364
}

src/libsyntax/owned_slice.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
use std::default::Default;
1212
use std::fmt;
13-
use std::iter::FromIterator;
13+
use std::iter::{IntoIterator, FromIterator};
1414
use std::ops::Deref;
1515
use std::vec;
1616
use serialize::{Encodable, Decodable, Encoder, Decoder};
@@ -77,8 +77,8 @@ impl<T: Clone> Clone for OwnedSlice<T> {
7777
}
7878

7979
impl<T> FromIterator<T> for OwnedSlice<T> {
80-
fn from_iter<I: Iterator<Item=T>>(iter: I) -> OwnedSlice<T> {
81-
OwnedSlice::from_vec(iter.collect())
80+
fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> OwnedSlice<T> {
81+
OwnedSlice::from_vec(iter.into_iter().collect())
8282
}
8383
}
8484

src/libsyntax/util/small_vector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ enum SmallVectorRepr<T> {
3030
}
3131

3232
impl<T> FromIterator<T> for SmallVector<T> {
33-
fn from_iter<I: Iterator<Item=T>>(iter: I) -> SmallVector<T> {
33+
fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> SmallVector<T> {
3434
let mut v = SmallVector::zero();
3535
v.extend(iter);
3636
v

0 commit comments

Comments
 (0)