evobench_tools/utillib/
invert_index.rs

1use std::collections::{BTreeMap, BTreeSet, btree_map::Entry};
2
3pub fn invert_index<T1: Ord + Clone, T2: Ord + Clone>(
4    k_vs: &BTreeMap<T1, BTreeSet<T2>>,
5) -> BTreeMap<T2, BTreeSet<T1>> {
6    let mut v_ks: BTreeMap<T2, BTreeSet<T1>> = BTreeMap::new();
7    for (k, vs) in k_vs {
8        for v in vs {
9            match v_ks.entry(v.clone()) {
10                Entry::Vacant(vacant_entry) => {
11                    let mut s = BTreeSet::new();
12                    s.insert(k.clone());
13                    vacant_entry.insert(s);
14                }
15                Entry::Occupied(mut occupied_entry) => {
16                    occupied_entry.get_mut().insert(k.clone());
17                }
18            }
19        }
20    }
21    v_ks
22}
23
24pub fn invert_index_by_ref<T1: Ord, T2: Ord>(
25    k_vs: &BTreeMap<T1, BTreeSet<T2>>,
26) -> BTreeMap<&T2, BTreeSet<&T1>> {
27    let mut v_ks: BTreeMap<&T2, BTreeSet<&T1>> = BTreeMap::new();
28    for (k, vs) in k_vs {
29        for v in vs {
30            match v_ks.entry(v) {
31                Entry::Vacant(vacant_entry) => {
32                    let mut s = BTreeSet::new();
33                    s.insert(k);
34                    vacant_entry.insert(s);
35                }
36                Entry::Occupied(mut occupied_entry) => {
37                    occupied_entry.get_mut().insert(k);
38                }
39            }
40        }
41    }
42    v_ks
43}