@@ -458,13 +458,23 @@ pub fn preferred<'a, OS: OrdStrat>(
458
458
cmp:: min ( a, b)
459
459
}
460
460
461
- pub fn best < ' a , OS : ' a + OrdStrat , I > ( it : I ) -> Option < I :: Item >
461
+ pub fn best < ' a , OS : ' a + OrdStrat , I > ( it : I ) -> Option < I :: Item >
462
462
where
463
- I : Iterator < Item = & ' a OrdRoute < ' a , OS > >
463
+ I : Iterator < Item = OrdRoute < ' a , OS > >
464
464
{
465
465
it. min ( )
466
466
}
467
467
468
+ pub fn best_with_strat < ' a , OS , AltOS , I > ( it : I )
469
+ -> Option < OrdRoute < ' a , AltOS > >
470
+ where
471
+ OS : ' a + OrdStrat ,
472
+ AltOS : ' a + OrdStrat ,
473
+ I : Iterator < Item = OrdRoute < ' a , OS > > ,
474
+ {
475
+ it. map ( |r| r. into_strat ( ) ) . min ( )
476
+ }
477
+
468
478
469
479
// XXX would this be convenient?
470
480
pub fn best_alt < ' a , OS : OrdStrat > (
@@ -475,8 +485,8 @@ pub fn best_alt<'a, OS: OrdStrat>(
475
485
}
476
486
477
487
pub fn best_backup_vec < ' a , OS : OrdStrat > (
478
- it : impl Iterator < Item = & ' a OrdRoute < ' a , OS > >
479
- ) -> ( Option < & ' a OrdRoute < ' a , OS > > , Option < & ' a OrdRoute < ' a , OS > > )
488
+ it : impl Iterator < Item = OrdRoute < ' a , OS > >
489
+ ) -> ( Option < OrdRoute < ' a , OS > > , Option < OrdRoute < ' a , OS > > )
480
490
{
481
491
let mut sorted = it. collect :: < Vec < _ > > ( ) ;
482
492
sorted. sort ( ) ;
@@ -489,8 +499,8 @@ pub fn best_backup_vec<'a, OS: OrdStrat>(
489
499
}
490
500
491
501
pub fn best_backup < ' a , OS : OrdStrat > (
492
- it : impl Iterator < Item = & ' a OrdRoute < ' a , OS > >
493
- ) -> ( Option < & ' a OrdRoute < ' a , OS > > , Option < & ' a OrdRoute < ' a , OS > > )
502
+ it : impl Iterator < Item = OrdRoute < ' a , OS > >
503
+ ) -> ( Option < OrdRoute < ' a , OS > > , Option < OrdRoute < ' a , OS > > )
494
504
{
495
505
let mut best = None ;
496
506
let mut backup = None ;
@@ -524,20 +534,26 @@ pub fn best_backup<'a, OS: OrdStrat>(
524
534
( best, backup)
525
535
}
526
536
527
- /*
528
- pub fn best_multistrat<'a, OS1: OrdStrat, OS2: OrdStrat, I>(it: I)
529
- -> ( Option<&'a OrdRoute<'a, OS1>>, Option<&'a OrdRoute<'a, OS2>>)
537
+
538
+ pub fn best_multistrat < ' a , OS1 : ' a + OrdStrat , OS2 : ' a + OrdStrat , I > ( it : I )
539
+ -> Option < ( OrdRoute < ' a , OS1 > , OrdRoute < ' a , OS2 > ) >
530
540
where
531
- I: Iterator<Item = &'a OrdRoute<'a, OS1>>,
532
- I::Item: Copy
541
+ I : Clone + Iterator < Item = OrdRoute < ' a , OS1 > > ,
533
542
{
534
- let res1 = best(it);
535
- let it2 = it.copied().map(|r| r.into_strat());
536
- let res2 = best::<'a, OS2, _>(it2);
537
-
538
- (res1, res2)
543
+ let res1 = best ( it. clone ( ) ) ;
544
+ let res1 = match res1 {
545
+ Some ( r) => r,
546
+ None => return None
547
+ } ;
548
+
549
+ // Given that res1 is not None, `it` is non-empty.
550
+ // For a non-empty collection of OrdRoutes, there is always a best, so we
551
+ // can unwrap().
552
+ let res2 = best_with_strat :: < ' _ , _ , OS2 , _ > ( it) . unwrap ( ) ;
553
+
554
+ Some ( ( res1, res2) )
539
555
}
540
- */
556
+
541
557
542
558
//------------ Tests ---------------------------------------------------------
543
559
@@ -631,15 +647,18 @@ mod tests {
631
647
OrdRoute :: rfc4271 ( & c_pamap, tiebreakers) . unwrap ( ) ,
632
648
] ;
633
649
634
- let best1 = best ( candidates. iter ( ) ) ;
635
- let ( best2, backup2) = best_backup_vec ( candidates. iter ( ) ) ;
636
- let ( best3, backup3) = best_backup ( candidates. iter ( ) ) ;
650
+ let best1 = best ( candidates. into_iter ( ) ) ;
651
+ let ( best2, backup2) = best_backup_vec ( candidates. into_iter ( ) ) ;
652
+ let ( best3, backup3) = best_backup ( candidates. into_iter ( ) ) ;
637
653
638
654
assert_eq ! ( best1, best2) ;
639
655
assert_eq ! ( best2, best3) ;
640
656
assert_eq ! ( backup2, backup3) ;
641
657
assert_ne ! ( best2, backup2) ;
642
658
assert_ne ! ( best3, backup3) ;
659
+
660
+ dbg ! ( & best1) ;
661
+ dbg ! ( & backup2) ;
643
662
}
644
663
645
664
}
0 commit comments