1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#![deny(missing_docs)]
use super::*;
use indexmap::{IndexMap, IndexSet};
#[derive(Clone, Debug)]
pub struct MultipleInfo<Lbl: Hash + Ord> {
multiples: IndexMap<
BTreeSet<Lbl>,
(
Lbl,
IndexMap<Lbl, IndexSet<Lbl>>,
),
>,
}
impl<Lbl: Hash + Ord + Clone> MultipleInfo<Lbl> {
#[allow(missing_docs)]
pub fn new() -> Self {
MultipleInfo {
multiples: IndexMap::new(),
}
}
pub fn absorb(&mut self, other: MultipleInfo<Lbl>) {
self.multiples.extend(other.multiples);
}
pub fn rewrite_blocks(&mut self, rewrites: &IndexMap<Lbl, Lbl>) -> () {
self.multiples = self
.multiples
.iter()
.filter_map(|(entries, &(ref join_lbl, ref arms))| {
let entries: BTreeSet<Lbl> = entries
.iter()
.map(|lbl| rewrites.get(lbl).unwrap_or(lbl).clone())
.collect();
let join_lbl: Lbl = rewrites.get(join_lbl).unwrap_or(join_lbl).clone();
let arms: IndexMap<Lbl, IndexSet<Lbl>> = arms
.iter()
.map(|(arm_lbl, arm_body)| {
let arm_lbl: Lbl = rewrites.get(arm_lbl).unwrap_or(arm_lbl).clone();
let arm_body: IndexSet<Lbl> = arm_body
.iter()
.map(|lbl| rewrites.get(lbl).unwrap_or(lbl).clone())
.collect();
(arm_lbl, arm_body)
})
.collect();
if arms.len() > 1 {
Some((entries, (join_lbl, arms)))
} else {
None
}
})
.collect();
}
pub fn add_multiple(&mut self, join: Lbl, arms: Vec<(Lbl, IndexSet<Lbl>)>) -> () {
let entry_set: BTreeSet<Lbl> = arms.iter().map(|&(ref l, _)| l.clone()).collect();
let arm_map: IndexMap<Lbl, IndexSet<Lbl>> = arms.into_iter().collect();
if arm_map.len() > 1 {
self.multiples.insert(entry_set, (join, arm_map));
}
}
pub fn get_multiple<'a>(
&'a self,
entries: &BTreeSet<Lbl>,
) -> Option<&'a (Lbl, IndexMap<Lbl, IndexSet<Lbl>>)> {
self.multiples.get(entries)
}
}