]> git.lizzy.rs Git - rust.git/commitdiff
make FromIterator use IntoIterator
authorAlexis <a.beingessner@gmail.com>
Wed, 18 Feb 2015 18:06:21 +0000 (13:06 -0500)
committerAlexis <a.beingessner@gmail.com>
Wed, 18 Feb 2015 19:01:47 +0000 (14:01 -0500)
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]

20 files changed:
src/libcollections/binary_heap.rs
src/libcollections/bit.rs
src/libcollections/btree/map.rs
src/libcollections/btree/set.rs
src/libcollections/enum_set.rs
src/libcollections/linked_list.rs
src/libcollections/string.rs
src/libcollections/vec.rs
src/libcollections/vec_deque.rs
src/libcollections/vec_map.rs
src/libcore/iter.rs
src/libcore/option.rs
src/libcore/result.rs
src/librustc/middle/check_match.rs
src/libstd/collections/hash/map.rs
src/libstd/collections/hash/set.rs
src/libstd/path.rs
src/libstd/sys/common/wtf8.rs
src/libsyntax/owned_slice.rs
src/libsyntax/util/small_vector.rs

index 2f994e94ccc3ef7f6fb93b407f396040a150e8dc..9f549fd7237711dce941f7ef0d37e0eec9e8db73 100644 (file)
@@ -650,8 +650,8 @@ impl<'a, T: 'a> ExactSizeIterator for Drain<'a, T> {}
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<T: Ord> FromIterator<T> for BinaryHeap<T> {
-    fn from_iter<Iter: Iterator<Item=T>>(iter: Iter) -> BinaryHeap<T> {
-        BinaryHeap::from_vec(iter.collect())
+    fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> BinaryHeap<T> {
+        BinaryHeap::from_vec(iter.into_iter().collect())
     }
 }
 
index c1d79d8204384b9f4c830cad20369a7944bab5c0..f4b65aab38b65658333d748c93b5ee2d25ffb8eb 100644 (file)
@@ -924,9 +924,9 @@ fn default() -> BitVec { BitVec::new() }
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl FromIterator<bool> for BitVec {
-    fn from_iter<I:Iterator<Item=bool>>(iterator: I) -> BitVec {
-        let mut ret = BitVec::new();
-        ret.extend(iterator);
+    fn from_iter<I: IntoIterator<Item=bool>>(iter: I) -> BitVec {
+        let mut ret = Bitv::new();
+        ret.extend(iter);
         ret
     }
 }
@@ -1134,9 +1134,9 @@ fn default() -> BitSet { BitSet::new() }
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl FromIterator<usize> for BitSet {
-    fn from_iter<I:Iterator<Item=usize>>(iterator: I) -> BitSet {
-        let mut ret = BitSet::new();
-        ret.extend(iterator);
+    fn from_iter<I: IntoIterator<Item=usize>>(iter: I) -> BitSet {
+        let mut ret = BitvSet::new();
+        ret.extend(iter);
         ret
     }
 }
index 9273d50db856b03dbb809e275cdb5b1bb2e33856..262084d5a91227346b50a7f8b94d32c528fa0202 100644 (file)
@@ -826,7 +826,7 @@ pub fn insert(mut self, key: K, val: V) -> &'a mut V {
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<K: Ord, V> FromIterator<(K, V)> for BTreeMap<K, V> {
-    fn from_iter<T: Iterator<Item=(K, V)>>(iter: T) -> BTreeMap<K, V> {
+    fn from_iter<T: IntoIterator<Item=(K, V)>>(iter: T) -> BTreeMap<K, V> {
         let mut map = BTreeMap::new();
         map.extend(iter);
         map
index d2241a674649910d0de76f26dde4a3fa8300e209..614971866231480fcfdbbbd6a642a90a16a9758e 100644 (file)
@@ -473,7 +473,7 @@ pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool where Q: BorrowFrom<T> +
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<T: Ord> FromIterator<T> for BTreeSet<T> {
-    fn from_iter<Iter: Iterator<Item=T>>(iter: Iter) -> BTreeSet<T> {
+    fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> BTreeSet<T> {
         let mut set = BTreeSet::new();
         set.extend(iter);
         set
index 3f8c0121fafb59fe6dfe9e098082ad7f5face1a9..140c9edb5a3a7f5c34c292d0f6659d990597d574 100644 (file)
@@ -250,9 +250,9 @@ fn size_hint(&self) -> (usize, Option<usize>) {
 }
 
 impl<E:CLike> FromIterator<E> for EnumSet<E> {
-    fn from_iter<I:Iterator<Item=E>>(iterator: I) -> EnumSet<E> {
+    fn from_iter<I: IntoIterator<Item=E>>(iter: I) -> EnumSet<E> {
         let mut ret = EnumSet::new();
-        ret.extend(iterator);
+        ret.extend(iter);
         ret
     }
 }
index 0ec1371c73cbf2ea317e42a85210733ce4c3dca3..bd8f508b70fabcc526505df7299d4791c24aed17 100644 (file)
@@ -834,9 +834,9 @@ fn next_back(&mut self) -> Option<A> { self.list.pop_back() }
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<A> FromIterator<A> for LinkedList<A> {
-    fn from_iter<T: Iterator<Item=A>>(iterator: T) -> LinkedList<A> {
-        let mut ret = LinkedList::new();
-        ret.extend(iterator);
+    fn from_iter<T: IntoIterator<Item=A>>(iter: T) -> LinkedList<A> {
+        let mut ret = DList::new();
+        ret.extend(iter);
         ret
     }
 }
index dc1158ecaf85e3b4b4a82dfa6120428850eecd63..627c357d8b3f833b94c3de5b9dd5f8d877d16599 100644 (file)
@@ -709,18 +709,18 @@ fn description(&self) -> &str { "invalid utf-16" }
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl FromIterator<char> for String {
-    fn from_iter<I:Iterator<Item=char>>(iterator: I) -> String {
+    fn from_iter<I: IntoIterator<Item=char>>(iter: I) -> String {
         let mut buf = String::new();
-        buf.extend(iterator);
+        buf.extend(iter);
         buf
     }
 }
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<'a> FromIterator<&'a str> for String {
-    fn from_iter<I:Iterator<Item=&'a str>>(iterator: I) -> String {
+    fn from_iter<I: IntoIterator<Item=&'a str>>(iter: I) -> String {
         let mut buf = String::new();
-        buf.extend(iterator);
+        buf.extend(iter);
         buf
     }
 }
index e4b090e4dd7acf68214f2dfd9822d94079aec472..dd10a7582fb8997262b168fbbc4e2cd131b77ded 100644 (file)
@@ -1407,7 +1407,8 @@ fn deref_mut(&mut self) -> &mut [T] { self.as_mut_slice() }
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<T> FromIterator<T> for Vec<T> {
     #[inline]
-    fn from_iter<I:Iterator<Item=T>>(mut iterator: I) -> Vec<T> {
+    fn from_iter<I: IntoIterator<Item=T>>(iterable: I) -> Vec<T> {
+        let mut iterator = iterable.into_iter();
         let (lower, _) = iterator.size_hint();
         let mut vector = Vec::with_capacity(lower);
 
@@ -1651,7 +1652,7 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 
 #[unstable(feature = "collections")]
 impl<'a, T> FromIterator<T> for CowVec<'a, T> where T: Clone {
-    fn from_iter<I: Iterator<Item=T>>(it: I) -> CowVec<'a, T> {
+    fn from_iter<I: IntoIterator<Item=T>>(it: I) -> CowVec<'a, T> {
         Cow::Owned(FromIterator::from_iter(it))
     }
 }
index cc01e800f60736bbb3ab4e3e0ccbb62eef529c71..c281d5de0272383e46b6c60b79f6662020a81416 100644 (file)
@@ -1701,7 +1701,8 @@ fn index_mut(&mut self, i: &usize) -> &mut A {
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<A> FromIterator<A> for VecDeque<A> {
-    fn from_iter<T: Iterator<Item=A>>(iterator: T) -> VecDeque<A> {
+    fn from_iter<T: IntoIterator<Item=A>>(iterable: T) -> VecDeque<A> {
+        let iterator = iterable.into_iter();
         let (lower, _) = iterator.size_hint();
         let mut deq = VecDeque::with_capacity(lower);
         deq.extend(iterator);
index 7085111d6a87bc26ce21de2c3616b3594d663b32..4431bfddbd74cb81187c2fb41d0e7a7b5c2ec8ba 100644 (file)
@@ -661,7 +661,7 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<V> FromIterator<(usize, V)> for VecMap<V> {
-    fn from_iter<Iter: Iterator<Item=(usize, V)>>(iter: Iter) -> VecMap<V> {
+    fn from_iter<I: IntoIterator<Item=(usize, V)>>(iter: I) -> VecMap<V> {
         let mut map = VecMap::new();
         map.extend(iter);
         map
index 2e9977cd3eb1d2e79d3c33217401b4f50e5100cf..355bf3a28cbac24615b9ca0882c38bb18cfeaee8 100644 (file)
@@ -113,9 +113,9 @@ fn size_hint(&self) -> (usize, Option<usize>) { (**self).size_hint() }
 #[rustc_on_unimplemented="a collection of type `{Self}` cannot be \
                           built from an iterator over elements of type `{A}`"]
 pub trait FromIterator<A> {
-    /// Build a container with elements from an external iterator.
+    /// Build a container with elements from something iterable.
     #[stable(feature = "rust1", since = "1.0.0")]
-    fn from_iter<T: Iterator<Item=A>>(iterator: T) -> Self;
+    fn from_iter<T: IntoIterator<Item=A>>(iterator: T) -> Self;
 }
 
 /// Conversion into an `Iterator`
index 9a89682127fb1633df1538942e52ac7a277af71e..abfef72a5dbc33b735a67416a191f2e1b093600c 100644 (file)
 use cmp::{Eq, Ord};
 use default::Default;
 use iter::{ExactSizeIterator};
-use iter::{Iterator, IteratorExt, DoubleEndedIterator, FromIterator};
+use iter::{Iterator, IteratorExt, DoubleEndedIterator, FromIterator, IntoIterator};
 use mem;
 use ops::{Deref, FnOnce};
 use result::Result::{Ok, Err};
@@ -909,7 +909,7 @@ impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {
     /// ```
     #[inline]
     #[stable(feature = "rust1", since = "1.0.0")]
-    fn from_iter<I: Iterator<Item=Option<A>>>(iter: I) -> Option<V> {
+    fn from_iter<I: IntoIterator<Item=Option<A>>>(iter: I) -> Option<V> {
         // FIXME(#11084): This could be replaced with Iterator::scan when this
         // performance bug is closed.
 
@@ -934,7 +934,7 @@ fn next(&mut self) -> Option<T> {
             }
         }
 
-        let mut adapter = Adapter { iter: iter, found_none: false };
+        let mut adapter = Adapter { iter: iter.into_iter(), found_none: false };
         let v: V = FromIterator::from_iter(adapter.by_ref());
 
         if adapter.found_none {
index 1a874ee178ba0fd8c477c69e2232b01a1d50edd5..23e936a75d7097e04f972a3da25796a285090711 100644 (file)
 
 use clone::Clone;
 use fmt;
-use iter::{Iterator, IteratorExt, DoubleEndedIterator, FromIterator, ExactSizeIterator};
+use iter::{Iterator, IteratorExt, DoubleEndedIterator,
+           FromIterator, ExactSizeIterator, IntoIterator};
 use ops::{FnMut, FnOnce};
 use option::Option::{self, None, Some};
 use slice::AsSlice;
@@ -906,7 +907,7 @@ impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> {
     /// assert!(res == Ok(vec!(2, 3)));
     /// ```
     #[inline]
-    fn from_iter<I: Iterator<Item=Result<A, E>>>(iter: I) -> Result<V, E> {
+    fn from_iter<I: IntoIterator<Item=Result<A, E>>>(iter: I) -> Result<V, E> {
         // FIXME(#11084): This could be replaced with Iterator::scan when this
         // performance bug is closed.
 
@@ -931,7 +932,7 @@ fn next(&mut self) -> Option<T> {
             }
         }
 
-        let mut adapter = Adapter { iter: iter, err: None };
+        let mut adapter = Adapter { iter: iter.into_iter(), err: None };
         let v: V = FromIterator::from_iter(adapter.by_ref());
 
         match adapter.err {
index 03456f8529028a36a8527a3f00cc3a5e8e99548a..3b29c43ce8cedf1613bb1ad3945a0d20c9e177eb 100644 (file)
@@ -25,7 +25,7 @@
 use middle::ty;
 use std::cmp::Ordering;
 use std::fmt;
-use std::iter::{range_inclusive, AdditiveIterator, FromIterator, repeat};
+use std::iter::{range_inclusive, AdditiveIterator, FromIterator, IntoIterator, repeat};
 use std::num::Float;
 use std::slice;
 use syntax::ast::{self, DUMMY_NODE_ID, NodeId, Pat};
@@ -94,8 +94,8 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 }
 
 impl<'a> FromIterator<Vec<&'a Pat>> for Matrix<'a> {
-    fn from_iter<T: Iterator<Item=Vec<&'a Pat>>>(iterator: T) -> Matrix<'a> {
-        Matrix(iterator.collect())
+    fn from_iter<T: IntoIterator<Item=Vec<&'a Pat>>>(iter: T) -> Matrix<'a> {
+        Matrix(iter.into_iter().collect())
     }
 }
 
index 61b531054a07b3e2c0e47aa1b8c5444c6eab8a10..0ce5b164ca13b3b4fe334cf212690ce736d40dd0 100644 (file)
@@ -1555,7 +1555,8 @@ impl<K, V, S, H> FromIterator<(K, V)> for HashMap<K, V, S>
           S: HashState<Hasher=H> + Default,
           H: hash::Hasher<Output=u64>
 {
-    fn from_iter<T: Iterator<Item=(K, V)>>(iter: T) -> HashMap<K, V, S> {
+    fn from_iter<T: IntoIterator<Item=(K, V)>>(iterable: T) -> HashMap<K, V, S> {
+        let iter = iterable.into_iter();
         let lower = iter.size_hint().0;
         let mut map = HashMap::with_capacity_and_hash_state(lower,
                                                             Default::default());
index f5e57b78d2a63f5591c6b0af7bed4fd8b5cece25..593248fd5c6029162bf9b9847f9ecb3d984d1487 100644 (file)
@@ -622,7 +622,8 @@ impl<T, S, H> FromIterator<T> for HashSet<T, S>
           S: HashState<Hasher=H> + Default,
           H: hash::Hasher<Output=u64>
 {
-    fn from_iter<I: Iterator<Item=T>>(iter: I) -> HashSet<T, S> {
+    fn from_iter<I: IntoIterator<Item=T>>(iterable: I) -> HashSet<T, S> {
+        let iter = iterable.into_iter();
         let lower = iter.size_hint().0;
         let mut set = HashSet::with_capacity_and_hash_state(lower, Default::default());
         set.extend(iter);
index f25cc83b93e1648aa96cba50e88b108eee2eebc1..2ad07462f20f71033973708f600787e713e2e746 100755 (executable)
@@ -953,7 +953,7 @@ pub fn into_os_string(self) -> OsString {
 }
 
 impl<'a, P: ?Sized + 'a> iter::FromIterator<&'a P> for PathBuf where P: AsPath {
-    fn from_iter<I: Iterator<Item = &'a P>>(iter: I) -> PathBuf {
+    fn from_iter<I: IntoIterator<Item = &'a P>>(iter: I) -> PathBuf {
         let mut buf = PathBuf::new("");
         buf.extend(iter);
         buf
index e7cb67c6287edd6661fd3c56c3a2d0355b9a348d..da5ab8e434a7bf6516bbe150aaa8b32e00573177 100644 (file)
@@ -356,9 +356,9 @@ pub fn into_string_lossy(mut self) -> String {
 /// This replaces surrogate code point pairs with supplementary code points,
 /// like concatenating ill-formed UTF-16 strings effectively would.
 impl FromIterator<CodePoint> for Wtf8Buf {
-    fn from_iter<T: Iterator<Item=CodePoint>>(iterator: T) -> Wtf8Buf {
+    fn from_iter<T: IntoIterator<Item=CodePoint>>(iter: T) -> Wtf8Buf {
         let mut string = Wtf8Buf::new();
-        string.extend(iterator);
+        string.extend(iter);
         string
     }
 }
index 0f9a56baa170bc43b4d646f92241d35720cd067c..f5201d4a8bc68f73ea9f46c07e6bca61330a561e 100644 (file)
@@ -10,7 +10,7 @@
 
 use std::default::Default;
 use std::fmt;
-use std::iter::FromIterator;
+use std::iter::{IntoIterator, FromIterator};
 use std::ops::Deref;
 use std::vec;
 use serialize::{Encodable, Decodable, Encoder, Decoder};
@@ -77,8 +77,8 @@ fn clone(&self) -> OwnedSlice<T> {
 }
 
 impl<T> FromIterator<T> for OwnedSlice<T> {
-    fn from_iter<I: Iterator<Item=T>>(iter: I) -> OwnedSlice<T> {
-        OwnedSlice::from_vec(iter.collect())
+    fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> OwnedSlice<T> {
+        OwnedSlice::from_vec(iter.into_iter().collect())
     }
 }
 
index 6a1fb4008ade027848d86f57f0ce9c544326d125..0a39d3809045a2e56f745255e6b204bc5d43f8d0 100644 (file)
@@ -30,7 +30,7 @@ enum SmallVectorRepr<T> {
 }
 
 impl<T> FromIterator<T> for SmallVector<T> {
-    fn from_iter<I: Iterator<Item=T>>(iter: I) -> SmallVector<T> {
+    fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> SmallVector<T> {
         let mut v = SmallVector::zero();
         v.extend(iter);
         v