@@ -2,6 +2,7 @@ use indexmap::map::Iter as MapIter;
22use indexmap:: map:: Keys as MapKeys ;
33use indexmap:: map:: Values as MapValues ;
44use indexmap:: IndexMap as Map ;
5+ use ouroboros:: self_referencing;
56use std:: borrow:: Borrow ;
67use std:: fmt;
78use std:: hash:: Hash ;
@@ -308,8 +309,8 @@ impl<'a, K: Eq + Hash + ImplicitClone + 'static, V: PartialEq + ImplicitClone +
308309 }
309310}
310311
311- impl < ' a , K : Eq + Hash + ImplicitClone + ' static , V : PartialEq + ImplicitClone + ' static >
312- DoubleEndedIterator for IMapIter < ' a , K , V >
312+ impl < K : Eq + Hash + ImplicitClone + ' static , V : PartialEq + ImplicitClone + ' static >
313+ DoubleEndedIterator for IMapIter < ' _ , K , V >
313314{
314315 fn next_back ( & mut self ) -> Option < Self :: Item > {
315316 match self {
@@ -319,6 +320,51 @@ impl<'a, K: Eq + Hash + ImplicitClone + 'static, V: PartialEq + ImplicitClone +
319320 }
320321}
321322
323+ #[ self_referencing]
324+ struct IMapIntoIterInternal <
325+ K : Eq + Hash + ImplicitClone + ' static ,
326+ V : PartialEq + ImplicitClone + ' static ,
327+ > {
328+ map : IMap < K , V > ,
329+ #[ covariant]
330+ #[ borrows( map) ]
331+ iter : IMapIter < ' this , K , V > ,
332+ }
333+
334+ #[ allow( missing_docs, missing_debug_implementations) ]
335+ pub struct IMapIntoIter <
336+ K : Eq + Hash + ImplicitClone + ' static ,
337+ V : PartialEq + ImplicitClone + ' static ,
338+ > ( IMapIntoIterInternal < K , V > ) ;
339+
340+ impl < K : Eq + Hash + ImplicitClone + ' static , V : PartialEq + ImplicitClone + ' static > IntoIterator
341+ for IMap < K , V >
342+ {
343+ type Item = ( K , V ) ;
344+ type IntoIter = IMapIntoIter < K , V > ;
345+
346+ fn into_iter ( self ) -> Self :: IntoIter {
347+ IMapIntoIter (
348+ IMapIntoIterInternalBuilder {
349+ map : self ,
350+ iter_builder : |a| a. iter ( ) ,
351+ }
352+ . build ( ) ,
353+ )
354+ }
355+ }
356+
357+ impl < K : Eq + Hash + ImplicitClone + ' static , V : PartialEq + ImplicitClone + ' static > Iterator
358+ for IMapIntoIter < K , V >
359+ {
360+ type Item = ( K , V ) ;
361+
362+ fn next ( & mut self ) -> Option < Self :: Item > {
363+ self . 0
364+ . with_iter_mut ( |iter| iter. next ( ) . map ( |( k, v) | ( k. clone ( ) , v. clone ( ) ) ) )
365+ }
366+ }
367+
322368#[ allow( missing_docs, missing_debug_implementations) ]
323369pub enum IMapKeys < ' a , K , V > {
324370 Slice ( std:: slice:: Iter < ' a , ( K , V ) > ) ,
@@ -338,8 +384,8 @@ impl<'a, K: Eq + Hash + ImplicitClone + 'static, V: PartialEq + ImplicitClone +
338384 }
339385}
340386
341- impl < ' a , K : Eq + Hash + ImplicitClone + ' static , V : PartialEq + ImplicitClone + ' static >
342- DoubleEndedIterator for IMapKeys < ' a , K , V >
387+ impl < K : Eq + Hash + ImplicitClone + ' static , V : PartialEq + ImplicitClone + ' static >
388+ DoubleEndedIterator for IMapKeys < ' _ , K , V >
343389{
344390 fn next_back ( & mut self ) -> Option < Self :: Item > {
345391 match self {
@@ -368,8 +414,8 @@ impl<'a, K: Eq + Hash + ImplicitClone + 'static, V: PartialEq + ImplicitClone +
368414 }
369415}
370416
371- impl < ' a , K : Eq + Hash + ImplicitClone + ' static , V : PartialEq + ImplicitClone + ' static >
372- DoubleEndedIterator for IMapValues < ' a , K , V >
417+ impl < K : Eq + Hash + ImplicitClone + ' static , V : PartialEq + ImplicitClone + ' static >
418+ DoubleEndedIterator for IMapValues < ' _ , K , V >
373419{
374420 fn next_back ( & mut self ) -> Option < Self :: Item > {
375421 match self {
@@ -472,4 +518,13 @@ mod test_map {
472518 let x: IMap < u32 , u32 > = IMap :: Static ( & [ ] ) ;
473519 let _out = IMap :: from ( & x) ;
474520 }
521+
522+ #[ test]
523+ fn iterators ( ) {
524+ let map = IMap :: Static ( & [ ( 1 , 10 ) , ( 2 , 20 ) , ( 3 , 30 ) ] ) ;
525+ assert_eq ! ( map. iter( ) . next( ) . unwrap( ) , ( & 1 , & 10 ) ) ;
526+ assert_eq ! ( map. keys( ) . next( ) . unwrap( ) , & 1 ) ;
527+ assert_eq ! ( map. values( ) . next( ) . unwrap( ) , & 10 ) ;
528+ assert_eq ! ( map. into_iter( ) . next( ) . unwrap( ) , ( 1 , 10 ) ) ;
529+ }
475530}
0 commit comments