@@ -3,9 +3,9 @@ use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
33use std:: fmt;
44use std:: fmt:: Debug ;
55use std:: hash:: Hash ;
6- use std:: iter:: { self , FromIterator } ;
6+ use std:: iter:: FromIterator ;
77use std:: marker:: PhantomData ;
8- use std:: ops:: { Index , IndexMut , Range , RangeBounds } ;
8+ use std:: ops:: { Index , IndexMut , RangeBounds } ;
99use std:: slice;
1010use std:: vec;
1111
@@ -518,8 +518,6 @@ impl<I: Idx, T: fmt::Debug> fmt::Debug for IndexVec<I, T> {
518518 }
519519}
520520
521- pub type Enumerated < I , J > = iter:: Map < iter:: Enumerate < J > , IntoIdx < I > > ;
522-
523521impl < I : Idx , T > IndexVec < I , T > {
524522 #[ inline]
525523 pub fn new ( ) -> Self {
@@ -596,8 +594,10 @@ impl<I: Idx, T> IndexVec<I, T> {
596594 }
597595
598596 #[ inline]
599- pub fn into_iter_enumerated ( self ) -> Enumerated < I , vec:: IntoIter < T > > {
600- self . raw . into_iter ( ) . enumerate ( ) . map ( IntoIdx { _marker : PhantomData } )
597+ pub fn into_iter_enumerated (
598+ self ,
599+ ) -> impl DoubleEndedIterator < Item = ( I , T ) > + ExactSizeIterator {
600+ self . raw . into_iter ( ) . enumerate ( ) . map ( |( n, t) | ( I :: new ( n) , t) )
601601 }
602602
603603 #[ inline]
@@ -606,13 +606,15 @@ impl<I: Idx, T> IndexVec<I, T> {
606606 }
607607
608608 #[ inline]
609- pub fn iter_enumerated ( & self ) -> Enumerated < I , slice:: Iter < ' _ , T > > {
610- self . raw . iter ( ) . enumerate ( ) . map ( IntoIdx { _marker : PhantomData } )
609+ pub fn iter_enumerated (
610+ & self ,
611+ ) -> impl DoubleEndedIterator < Item = ( I , & T ) > + ExactSizeIterator + ' _ {
612+ self . raw . iter ( ) . enumerate ( ) . map ( |( n, t) | ( I :: new ( n) , t) )
611613 }
612614
613615 #[ inline]
614- pub fn indices ( & self ) -> iter :: Map < Range < usize > , IntoIdx < I > > {
615- ( 0 ..self . len ( ) ) . map ( IntoIdx { _marker : PhantomData } )
616+ pub fn indices ( & self ) -> impl DoubleEndedIterator < Item = I > + ExactSizeIterator + ' static {
617+ ( 0 ..self . len ( ) ) . map ( |n| I :: new ( n ) )
616618 }
617619
618620 #[ inline]
@@ -621,8 +623,10 @@ impl<I: Idx, T> IndexVec<I, T> {
621623 }
622624
623625 #[ inline]
624- pub fn iter_enumerated_mut ( & mut self ) -> Enumerated < I , slice:: IterMut < ' _ , T > > {
625- self . raw . iter_mut ( ) . enumerate ( ) . map ( IntoIdx { _marker : PhantomData } )
626+ pub fn iter_enumerated_mut (
627+ & mut self ,
628+ ) -> impl DoubleEndedIterator < Item = ( I , & mut T ) > + ExactSizeIterator + ' _ {
629+ self . raw . iter_mut ( ) . enumerate ( ) . map ( |( n, t) | ( I :: new ( n) , t) )
626630 }
627631
628632 #[ inline]
@@ -638,7 +642,7 @@ impl<I: Idx, T> IndexVec<I, T> {
638642 & ' a mut self ,
639643 range : R ,
640644 ) -> impl Iterator < Item = ( I , T ) > + ' a {
641- self . raw . drain ( range) . enumerate ( ) . map ( IntoIdx { _marker : PhantomData } )
645+ self . raw . drain ( range) . enumerate ( ) . map ( | ( n , t ) | ( I :: new ( n ) , t ) )
642646 }
643647
644648 #[ inline]
@@ -832,36 +836,5 @@ impl<'a, I: Idx, T> IntoIterator for &'a mut IndexVec<I, T> {
832836 }
833837}
834838
835- pub struct IntoIdx < I : Idx > {
836- _marker : PhantomData < fn ( & I ) > ,
837- }
838- impl < I : Idx , T > FnOnce < ( ( usize , T ) , ) > for IntoIdx < I > {
839- type Output = ( I , T ) ;
840-
841- extern "rust-call" fn call_once ( self , ( ( n, t) , ) : ( ( usize , T ) , ) ) -> Self :: Output {
842- ( I :: new ( n) , t)
843- }
844- }
845-
846- impl < I : Idx , T > FnMut < ( ( usize , T ) , ) > for IntoIdx < I > {
847- extern "rust-call" fn call_mut ( & mut self , ( ( n, t) , ) : ( ( usize , T ) , ) ) -> Self :: Output {
848- ( I :: new ( n) , t)
849- }
850- }
851-
852- impl < I : Idx > FnOnce < ( usize , ) > for IntoIdx < I > {
853- type Output = I ;
854-
855- extern "rust-call" fn call_once ( self , ( n, ) : ( usize , ) ) -> Self :: Output {
856- I :: new ( n)
857- }
858- }
859-
860- impl < I : Idx > FnMut < ( usize , ) > for IntoIdx < I > {
861- extern "rust-call" fn call_mut ( & mut self , ( n, ) : ( usize , ) ) -> Self :: Output {
862- I :: new ( n)
863- }
864- }
865-
866839#[ cfg( test) ]
867840mod tests;
0 commit comments