diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2015-02-18 23:50:21 +1100 |
|---|---|---|
| committer | Huon Wilson <dbau.pp+github@gmail.com> | 2015-02-18 23:50:21 +1100 |
| commit | dfc5c0f1e8799f47f9033bdcc8a7cd8a217620a5 (patch) | |
| tree | e9c32f2e58b3462a23dd9c472d2f236640b78811 /src/libcollections | |
| parent | 6c065fc8cb036785f61ff03e05c1563cbb2dd081 (diff) | |
| parent | 47f91a9484eceef10536d4caac6ef578cd254567 (diff) | |
| download | rust-dfc5c0f1e8799f47f9033bdcc8a7cd8a217620a5.tar.gz rust-dfc5c0f1e8799f47f9033bdcc8a7cd8a217620a5.zip | |
Manual merge of #22475 - alexcrichton:rollup, r=alexcrichton
One windows bot failed spuriously.
Diffstat (limited to 'src/libcollections')
| -rw-r--r-- | src/libcollections/binary_heap.rs | 24 | ||||
| -rw-r--r-- | src/libcollections/bit.rs | 24 | ||||
| -rw-r--r-- | src/libcollections/btree/map.rs | 36 | ||||
| -rw-r--r-- | src/libcollections/btree/set.rs | 24 | ||||
| -rw-r--r-- | src/libcollections/dlist.rs | 39 | ||||
| -rw-r--r-- | src/libcollections/enum_set.rs | 12 | ||||
| -rw-r--r-- | src/libcollections/lib.rs | 9 | ||||
| -rw-r--r-- | src/libcollections/macros.rs | 28 | ||||
| -rw-r--r-- | src/libcollections/ring_buf.rs | 49 | ||||
| -rw-r--r-- | src/libcollections/vec.rs | 89 | ||||
| -rw-r--r-- | src/libcollections/vec_map.rs | 36 |
11 files changed, 100 insertions, 270 deletions
diff --git a/src/libcollections/binary_heap.rs b/src/libcollections/binary_heap.rs index 1d994839d99..6196d94b5a6 100644 --- a/src/libcollections/binary_heap.rs +++ b/src/libcollections/binary_heap.rs @@ -655,17 +655,7 @@ impl<T: Ord> FromIterator<T> for BinaryHeap<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<T: Ord> IntoIterator for BinaryHeap<T> { - type IntoIter = IntoIter<T>; - - fn into_iter(self) -> IntoIter<T> { - self.into_iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<T: Ord> IntoIterator for BinaryHeap<T> { type Item = T; type IntoIter = IntoIter<T>; @@ -675,17 +665,7 @@ impl<T: Ord> IntoIterator for BinaryHeap<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, T> IntoIterator for &'a BinaryHeap<T> where T: Ord { - type IntoIter = Iter<'a, T>; - - fn into_iter(self) -> Iter<'a, T> { - self.iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> IntoIterator for &'a BinaryHeap<T> where T: Ord { type Item = &'a T; type IntoIter = Iter<'a, T>; diff --git a/src/libcollections/bit.rs b/src/libcollections/bit.rs index ca598a8d4d2..0b762788b20 100644 --- a/src/libcollections/bit.rs +++ b/src/libcollections/bit.rs @@ -1070,17 +1070,7 @@ impl<'a> RandomAccessIterator for Iter<'a> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a> IntoIterator for &'a Bitv { - type IntoIter = Iter<'a>; - - fn into_iter(self) -> Iter<'a> { - self.iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a> IntoIterator for &'a Bitv { type Item = bool; type IntoIter = Iter<'a>; @@ -1894,17 +1884,7 @@ impl<'a> Iterator for SymmetricDifference<'a> { #[inline] fn size_hint(&self) -> (usize, Option<usize>) { self.0.size_hint() } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a> IntoIterator for &'a BitvSet { - type IntoIter = SetIter<'a>; - - fn into_iter(self) -> SetIter<'a> { - self.iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a> IntoIterator for &'a BitvSet { type Item = usize; type IntoIter = SetIter<'a>; diff --git a/src/libcollections/btree/map.rs b/src/libcollections/btree/map.rs index 84f9825e989..747211e9238 100644 --- a/src/libcollections/btree/map.rs +++ b/src/libcollections/btree/map.rs @@ -462,17 +462,7 @@ impl<K: Ord, V> BTreeMap<K, V> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<K, V> IntoIterator for BTreeMap<K, V> { - type IntoIter = IntoIter<K, V>; - - fn into_iter(self) -> IntoIter<K, V> { - self.into_iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<K, V> IntoIterator for BTreeMap<K, V> { type Item = (K, V); type IntoIter = IntoIter<K, V>; @@ -482,17 +472,7 @@ impl<K, V> IntoIterator for BTreeMap<K, V> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, K, V> IntoIterator for &'a BTreeMap<K, V> { - type IntoIter = Iter<'a, K, V>; - - fn into_iter(self) -> Iter<'a, K, V> { - self.iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, K, V> IntoIterator for &'a BTreeMap<K, V> { type Item = (&'a K, &'a V); type IntoIter = Iter<'a, K, V>; @@ -502,17 +482,7 @@ impl<'a, K, V> IntoIterator for &'a BTreeMap<K, V> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, K, V> IntoIterator for &'a mut BTreeMap<K, V> { - type IntoIter = IterMut<'a, K, V>; - - fn into_iter(mut self) -> IterMut<'a, K, V> { - self.iter_mut() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, K, V> IntoIterator for &'a mut BTreeMap<K, V> { type Item = (&'a K, &'a mut V); type IntoIter = IterMut<'a, K, V>; diff --git a/src/libcollections/btree/set.rs b/src/libcollections/btree/set.rs index aecf5940311..7ef887b70cc 100644 --- a/src/libcollections/btree/set.rs +++ b/src/libcollections/btree/set.rs @@ -480,17 +480,7 @@ impl<T: Ord> FromIterator<T> for BTreeSet<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<T> IntoIterator for BTreeSet<T> { - type IntoIter = IntoIter<T>; - - fn into_iter(self) -> IntoIter<T> { - self.into_iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<T> IntoIterator for BTreeSet<T> { type Item = T; type IntoIter = IntoIter<T>; @@ -500,17 +490,7 @@ impl<T> IntoIterator for BTreeSet<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, T> IntoIterator for &'a BTreeSet<T> { - type IntoIter = Iter<'a, T>; - - fn into_iter(self) -> Iter<'a, T> { - self.iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> IntoIterator for &'a BTreeSet<T> { type Item = &'a T; type IntoIter = Iter<'a, T>; diff --git a/src/libcollections/dlist.rs b/src/libcollections/dlist.rs index 27b282ee9a9..eb1bf93c0aa 100644 --- a/src/libcollections/dlist.rs +++ b/src/libcollections/dlist.rs @@ -837,17 +837,7 @@ impl<A> FromIterator<A> for DList<A> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<T> IntoIterator for DList<T> { - type IntoIter = IntoIter<T>; - - fn into_iter(self) -> IntoIter<T> { - self.into_iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<T> IntoIterator for DList<T> { type Item = T; type IntoIter = IntoIter<T>; @@ -857,17 +847,7 @@ impl<T> IntoIterator for DList<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, T> IntoIterator for &'a DList<T> { - type IntoIter = Iter<'a, T>; - - fn into_iter(self) -> Iter<'a, T> { - self.iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> IntoIterator for &'a DList<T> { type Item = &'a T; type IntoIter = Iter<'a, T>; @@ -877,17 +857,6 @@ impl<'a, T> IntoIterator for &'a DList<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, T> IntoIterator for &'a mut DList<T> { - type IntoIter = IterMut<'a, T>; - - fn into_iter(mut self) -> IterMut<'a, T> { - self.iter_mut() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot impl<'a, T> IntoIterator for &'a mut DList<T> { type Item = &'a mut T; type IntoIter = IterMut<'a, T>; @@ -971,7 +940,7 @@ mod tests { use prelude::*; use std::rand; use std::hash::{self, SipHasher}; - use std::thread::Thread; + use std::thread; use test::Bencher; use test; @@ -1320,7 +1289,7 @@ mod tests { #[test] fn test_send() { let n = list_from(&[1,2,3]); - Thread::scoped(move || { + thread::spawn(move || { check_links(&n); let a: &[_] = &[&1,&2,&3]; assert_eq!(a, n.iter().collect::<Vec<_>>()); diff --git a/src/libcollections/enum_set.rs b/src/libcollections/enum_set.rs index 5c37be188fe..d5403ca5d9b 100644 --- a/src/libcollections/enum_set.rs +++ b/src/libcollections/enum_set.rs @@ -257,17 +257,7 @@ impl<E:CLike> FromIterator<E> for EnumSet<E> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, E> IntoIterator for &'a EnumSet<E> where E: CLike { - type IntoIter = Iter<E>; - - fn into_iter(self) -> Iter<E> { - self.iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, E> IntoIterator for &'a EnumSet<E> where E: CLike { type Item = E; type IntoIter = Iter<E>; diff --git a/src/libcollections/lib.rs b/src/libcollections/lib.rs index 8325e7247d5..cacbf3bce80 100644 --- a/src/libcollections/lib.rs +++ b/src/libcollections/lib.rs @@ -111,15 +111,6 @@ pub fn fixme_14344_be_sure_to_link_to_collections() {} #[cfg(not(test))] mod std { - // NOTE: remove after next snapshot - #[cfg(stage0)] pub use core::clone; // derive(Clone) - #[cfg(stage0)] pub use core::cmp; // derive(Eq, Ord, etc.) - #[cfg(stage0)] pub use core::marker; // derive(Copy) - #[cfg(stage0)] pub use core::hash; // derive(Hash) - #[cfg(stage0)] pub use core::iter; - #[cfg(stage0)] pub use core::fmt; // necessary for panic!() - #[cfg(stage0)] pub use core::option; // necessary for panic!() - pub use core::ops; // RangeFull } diff --git a/src/libcollections/macros.rs b/src/libcollections/macros.rs index 79c86a846f1..ebcfb8d1cf8 100644 --- a/src/libcollections/macros.rs +++ b/src/libcollections/macros.rs @@ -9,12 +9,34 @@ // except according to those terms. /// Creates a `Vec` containing the arguments. +/// +/// `vec!` allows `Vec`s to be defined with the same syntax as array expressions. +/// There are two forms of this macro: +/// +/// - Create a `Vec` containing a given list of elements: +/// +/// ``` +/// let v = vec![1, 2, 3]; +/// assert_eq!(v[0], 1); +/// assert_eq!(v[1], 2); +/// assert_eq!(v[2], 3); +/// ``` +/// +/// - Create a `Vec` from a given element and size: +/// +/// ``` +/// let v = vec![1; 3]; +/// assert_eq!(v, vec![1, 1, 1]); +/// ``` +/// +/// Note that unlike array expressions this syntax supports all elements +/// which implement `Clone` and the number of elements doesn't have to be +/// a constant. #[macro_export] #[stable(feature = "rust1", since = "1.0.0")] macro_rules! vec { - ($x:expr; $y:expr) => ( - <[_] as $crate::slice::SliceExt>::into_vec( - $crate::boxed::Box::new([$x; $y])) + ($elem:expr; $n:expr) => ( + $crate::vec::from_elem($elem, $n) ); ($($x:expr),*) => ( <[_] as $crate::slice::SliceExt>::into_vec( diff --git a/src/libcollections/ring_buf.rs b/src/libcollections/ring_buf.rs index 0a4ccde9236..6dcdb21f800 100644 --- a/src/libcollections/ring_buf.rs +++ b/src/libcollections/ring_buf.rs @@ -8,9 +8,13 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -//! This crate implements a double-ended queue with `O(1)` amortized inserts and removals from both -//! ends of the container. It also has `O(1)` indexing like a vector. The contained elements are -//! not required to be copyable, and the queue will be sendable if the contained type is sendable. +//! RingBuf is a double-ended queue, which is implemented with the help of a +//! growing circular buffer. +//! +//! This queue has `O(1)` amortized inserts and removals from both ends of the +//! container. It also has `O(1)` indexing like a vector. The contained elements +//! are not required to be copyable, and the queue will be sendable if the +//! contained type is sendable. #![stable(feature = "rust1", since = "1.0.0")] @@ -113,7 +117,8 @@ impl<T> RingBuf<T> { #[inline] fn is_full(&self) -> bool { self.cap - self.len() == 1 } - /// Returns the index in the underlying buffer for a given logical element index. + /// Returns the index in the underlying buffer for a given logical element + /// index. #[inline] fn wrap_index(&self, idx: usize) -> usize { wrap_index(idx, self.cap) } @@ -1699,17 +1704,7 @@ impl<A> FromIterator<A> for RingBuf<A> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<T> IntoIterator for RingBuf<T> { - type IntoIter = IntoIter<T>; - - fn into_iter(self) -> IntoIter<T> { - self.into_iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<T> IntoIterator for RingBuf<T> { type Item = T; type IntoIter = IntoIter<T>; @@ -1719,17 +1714,7 @@ impl<T> IntoIterator for RingBuf<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, T> IntoIterator for &'a RingBuf<T> { - type IntoIter = Iter<'a, T>; - - fn into_iter(self) -> Iter<'a, T> { - self.iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> IntoIterator for &'a RingBuf<T> { type Item = &'a T; type IntoIter = Iter<'a, T>; @@ -1739,17 +1724,7 @@ impl<'a, T> IntoIterator for &'a RingBuf<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, T> IntoIterator for &'a mut RingBuf<T> { - type IntoIter = IterMut<'a, T>; - - fn into_iter(mut self) -> IterMut<'a, T> { - self.iter_mut() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> IntoIterator for &'a mut RingBuf<T> { type Item = &'a mut T; type IntoIter = IterMut<'a, T>; diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index f294dd3c3e0..bde733644b5 100644 --- a/src/libcollections/vec.rs +++ b/src/libcollections/vec.rs @@ -1252,6 +1252,30 @@ unsafe fn dealloc<T>(ptr: *mut T, len: usize) { } } +#[doc(hidden)] +#[stable(feature = "rust1", since = "1.0.0")] +pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> { + unsafe { + let mut v = Vec::with_capacity(n); + let mut ptr = v.as_mut_ptr(); + + // Write all elements except the last one + for i in 1..n { + ptr::write(ptr, Clone::clone(&elem)); + ptr = ptr.offset(1); + v.set_len(i); // Increment the length in every step in case Clone::clone() panics + } + + if n > 0 { + // We can write the last element directly without cloning needlessly + ptr::write(ptr, elem); + v.set_len(n); + } + + v + } +} + //////////////////////////////////////////////////////////////////////////////// // Common trait implementations for Vec //////////////////////////////////////////////////////////////////////////////// @@ -1383,7 +1407,7 @@ impl<T> ops::DerefMut for Vec<T> { #[stable(feature = "rust1", since = "1.0.0")] impl<T> FromIterator<T> for Vec<T> { #[inline] - fn from_iter<I:Iterator<Item=T>>(iterator: I) -> Vec<T> { + fn from_iter<I:Iterator<Item=T>>(mut iterator: I) -> Vec<T> { let (lower, _) = iterator.size_hint(); let mut vector = Vec::with_capacity(lower); @@ -1393,13 +1417,20 @@ impl<T> FromIterator<T> for Vec<T> { // vector.push(item); // } // - // This equivalent crucially runs the iterator precisely once. The - // optimization below (eliding bound/growth checks) means that we - // actually run the iterator twice. To ensure the "moral equivalent" we - // do a `fuse()` operation to ensure that the iterator continues to - // return `None` after seeing the first `None`. - let mut i = iterator.fuse(); - for element in i.by_ref().take(vector.capacity()) { + // This equivalent crucially runs the iterator precisely once. Below we + // actually in theory run the iterator twice (one without bounds checks + // and one with). To achieve the "moral equivalent", we use the `if` + // statement below to break out early. + // + // If the first loop has terminated, then we have one of two conditions. + // + // 1. The underlying iterator returned `None`. In this case we are + // guaranteed that less than `vector.capacity()` elements have been + // returned, so we break out early. + // 2. The underlying iterator yielded `vector.capacity()` elements and + // has not yielded `None` yet. In this case we run the iterator to + // its end below. + for element in iterator.by_ref().take(vector.capacity()) { let len = vector.len(); unsafe { ptr::write(vector.get_unchecked_mut(len), element); @@ -1407,24 +1438,16 @@ impl<T> FromIterator<T> for Vec<T> { } } - for element in i { - vector.push(element) + if vector.len() == vector.capacity() { + for element in iterator { + vector.push(element); + } } vector } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<T> IntoIterator for Vec<T> { - type IntoIter = IntoIter<T>; - - fn into_iter(self) -> IntoIter<T> { - self.into_iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<T> IntoIterator for Vec<T> { type Item = T; type IntoIter = IntoIter<T>; @@ -1434,17 +1457,7 @@ impl<T> IntoIterator for Vec<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, T> IntoIterator for &'a Vec<T> { - type IntoIter = slice::Iter<'a, T>; - - fn into_iter(self) -> slice::Iter<'a, T> { - self.iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> IntoIterator for &'a Vec<T> { type Item = &'a T; type IntoIter = slice::Iter<'a, T>; @@ -1454,17 +1467,7 @@ impl<'a, T> IntoIterator for &'a Vec<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, T> IntoIterator for &'a mut Vec<T> { - type IntoIter = slice::IterMut<'a, T>; - - fn into_iter(mut self) -> slice::IterMut<'a, T> { - self.iter_mut() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> IntoIterator for &'a mut Vec<T> { type Item = &'a mut T; type IntoIter = slice::IterMut<'a, T>; diff --git a/src/libcollections/vec_map.rs b/src/libcollections/vec_map.rs index 7f9484c58a1..82ccfd0614f 100644 --- a/src/libcollections/vec_map.rs +++ b/src/libcollections/vec_map.rs @@ -668,17 +668,7 @@ impl<V> FromIterator<(usize, V)> for VecMap<V> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<T> IntoIterator for VecMap<T> { - type IntoIter = IntoIter<T>; - - fn into_iter(self) -> IntoIter<T> { - self.into_iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<T> IntoIterator for VecMap<T> { type Item = (usize, T); type IntoIter = IntoIter<T>; @@ -688,17 +678,7 @@ impl<T> IntoIterator for VecMap<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, T> IntoIterator for &'a VecMap<T> { - type IntoIter = Iter<'a, T>; - - fn into_iter(self) -> Iter<'a, T> { - self.iter() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> IntoIterator for &'a VecMap<T> { type Item = (usize, &'a T); type IntoIter = Iter<'a, T>; @@ -708,17 +688,7 @@ impl<'a, T> IntoIterator for &'a VecMap<T> { } } -// NOTE(stage0): remove impl after a snapshot -#[cfg(stage0)] -impl<'a, T> IntoIterator for &'a mut VecMap<T> { - type IntoIter = IterMut<'a, T>; - - fn into_iter(mut self) -> IterMut<'a, T> { - self.iter_mut() - } -} - -#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot +#[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> IntoIterator for &'a mut VecMap<T> { type Item = (usize, &'a mut T); type IntoIter = IterMut<'a, T>; |
