evobench_tools/utillib/
invert_index.rs1use 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}