Skip to content

Commit bc2dd1d

Browse files
committed
Tweaks/additions to helpers on bgp::path_selection
1 parent 84ef2c8 commit bc2dd1d

File tree

1 file changed

+39
-20
lines changed

1 file changed

+39
-20
lines changed

src/bgp/path_selection.rs

+39-20
Original file line numberDiff line numberDiff line change
@@ -458,13 +458,23 @@ pub fn preferred<'a, OS: OrdStrat>(
458458
cmp::min(a,b)
459459
}
460460

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>
462462
where
463-
I: Iterator<Item = &'a OrdRoute<'a, OS>>
463+
I: Iterator<Item = OrdRoute<'a, OS>>
464464
{
465465
it.min()
466466
}
467467

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+
468478

469479
// XXX would this be convenient?
470480
pub fn best_alt<'a, OS: OrdStrat>(
@@ -475,8 +485,8 @@ pub fn best_alt<'a, OS: OrdStrat>(
475485
}
476486

477487
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>>)
480490
{
481491
let mut sorted = it.collect::<Vec<_>>();
482492
sorted.sort();
@@ -489,8 +499,8 @@ pub fn best_backup_vec<'a, OS: OrdStrat>(
489499
}
490500

491501
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>>)
494504
{
495505
let mut best = None;
496506
let mut backup = None;
@@ -524,20 +534,26 @@ pub fn best_backup<'a, OS: OrdStrat>(
524534
(best, backup)
525535
}
526536

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>)>
530540
where
531-
I: Iterator<Item = &'a OrdRoute<'a, OS1>>,
532-
I::Item: Copy
541+
I: Clone + Iterator<Item = OrdRoute<'a, OS1>>,
533542
{
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))
539555
}
540-
*/
556+
541557

542558
//------------ Tests ---------------------------------------------------------
543559

@@ -631,15 +647,18 @@ mod tests {
631647
OrdRoute::rfc4271(&c_pamap, tiebreakers).unwrap(),
632648
];
633649

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());
637653

638654
assert_eq!(best1, best2);
639655
assert_eq!(best2, best3);
640656
assert_eq!(backup2, backup3);
641657
assert_ne!(best2, backup2);
642658
assert_ne!(best3, backup3);
659+
660+
dbg!(&best1);
661+
dbg!(&backup2);
643662
}
644663

645664
}

0 commit comments

Comments
 (0)