@@ -2,6 +2,7 @@ use indexmap::map::Iter as MapIter;
2
2
use indexmap:: map:: Keys as MapKeys ;
3
3
use indexmap:: map:: Values as MapValues ;
4
4
use indexmap:: IndexMap as Map ;
5
+ use ouroboros:: self_referencing;
5
6
use std:: borrow:: Borrow ;
6
7
use std:: fmt;
7
8
use std:: hash:: Hash ;
@@ -308,8 +309,8 @@ impl<'a, K: Eq + Hash + ImplicitClone + 'static, V: PartialEq + ImplicitClone +
308
309
}
309
310
}
310
311
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 >
313
314
{
314
315
fn next_back ( & mut self ) -> Option < Self :: Item > {
315
316
match self {
@@ -319,6 +320,51 @@ impl<'a, K: Eq + Hash + ImplicitClone + 'static, V: PartialEq + ImplicitClone +
319
320
}
320
321
}
321
322
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
+
322
368
#[ allow( missing_docs, missing_debug_implementations) ]
323
369
pub enum IMapKeys < ' a , K , V > {
324
370
Slice ( std:: slice:: Iter < ' a , ( K , V ) > ) ,
@@ -338,8 +384,8 @@ impl<'a, K: Eq + Hash + ImplicitClone + 'static, V: PartialEq + ImplicitClone +
338
384
}
339
385
}
340
386
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 >
343
389
{
344
390
fn next_back ( & mut self ) -> Option < Self :: Item > {
345
391
match self {
@@ -368,8 +414,8 @@ impl<'a, K: Eq + Hash + ImplicitClone + 'static, V: PartialEq + ImplicitClone +
368
414
}
369
415
}
370
416
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 >
373
419
{
374
420
fn next_back ( & mut self ) -> Option < Self :: Item > {
375
421
match self {
@@ -472,4 +518,13 @@ mod test_map {
472
518
let x: IMap < u32 , u32 > = IMap :: Static ( & [ ] ) ;
473
519
let _out = IMap :: from ( & x) ;
474
520
}
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
+ }
475
530
}
0 commit comments