@@ -330,6 +330,59 @@ quickcheck! {
330
330
map. sort_by( |_, v1, _, v2| Ord :: cmp( v1, v2) ) ;
331
331
assert_sorted_by_key( map, |t| t. 1 ) ;
332
332
}
333
+
334
+ fn reverse( keyvals: Large <Vec <( i8 , i8 ) >>) -> ( ) {
335
+ let mut map: IndexMap <_, _> = IndexMap :: from_iter( keyvals. to_vec( ) ) ;
336
+
337
+ fn generate_answer( input: & Vec <( i8 , i8 ) >) -> Vec <( i8 , i8 ) > {
338
+ // to mimic what `IndexMap::from_iter` does:
339
+ // need to get (A) the unique keys in forward order, and (B) the
340
+ // last value of each of those keys.
341
+
342
+ // create (A): an iterable that yields the unique keys in ltr order
343
+ let mut seen_keys = HashSet :: new( ) ;
344
+ let unique_keys_forward = input. iter( ) . filter_map( move |( k, _) | {
345
+ if seen_keys. contains( k) { None }
346
+ else { seen_keys. insert( * k) ; Some ( * k) }
347
+ } ) ;
348
+
349
+ // create (B): a mapping of keys to the last value seen for that key
350
+ // this is the same as reversing the input and taking the first
351
+ // value seen for that key!
352
+ let mut last_val_per_key = HashMap :: new( ) ;
353
+ for & ( k, v) in input. iter( ) . rev( ) {
354
+ if !last_val_per_key. contains_key( & k) {
355
+ last_val_per_key. insert( k, v) ;
356
+ }
357
+ }
358
+
359
+ // iterate over the keys in (A) in order, and match each one with
360
+ // the corresponding last value from (B)
361
+ let mut ans: Vec <_> = unique_keys_forward
362
+ . map( |k| ( k, * last_val_per_key. get( & k) . unwrap( ) ) )
363
+ . collect( ) ;
364
+
365
+ // finally, since this test is testing `.reverse()`, reverse the
366
+ // answer in-place
367
+ ans. reverse( ) ;
368
+
369
+ ans
370
+ }
371
+
372
+ let answer = generate_answer( & keyvals. 0 ) ;
373
+
374
+ // perform the work
375
+ map. reverse( ) ;
376
+
377
+ // check it contains all the values it should
378
+ for & ( key, val) in & answer {
379
+ assert_eq!( map[ & key] , val) ;
380
+ }
381
+
382
+ // check the order
383
+ let mapv = Vec :: from_iter( map) ;
384
+ assert_eq!( answer, mapv) ;
385
+ }
333
386
}
334
387
335
388
fn assert_sorted_by_key < I , Key , X > ( iterable : I , key : Key )
0 commit comments