16
16
17
17
use super :: Graph ;
18
18
use super :: iterate:: reverse_post_order;
19
- use super :: node_vec:: NodeVec ;
20
- use super :: super :: indexed_vec:: Idx ;
19
+ use super :: super :: indexed_vec:: { IndexVec , Idx } ;
21
20
22
21
use std:: fmt;
23
22
@@ -40,13 +39,13 @@ pub fn dominators_given_rpo<G: Graph>(graph: &G,
40
39
assert_eq ! ( rpo[ 0 ] , start_node) ;
41
40
42
41
// compute the post order index (rank) for each node
43
- let mut post_order_rank: NodeVec < G , usize > = NodeVec :: from_default ( graph) ;
42
+ let mut post_order_rank: IndexVec < G :: Node , usize > = IndexVec :: from_elem_n ( usize :: default ( ) , graph. num_nodes ( ) ) ;
44
43
for ( index, node) in rpo. iter ( ) . rev ( ) . cloned ( ) . enumerate ( ) {
45
44
post_order_rank[ node] = index;
46
45
}
47
46
48
- let mut immediate_dominators: NodeVec < G , Option < G :: Node > > =
49
- NodeVec :: from_default ( graph) ;
47
+ let mut immediate_dominators: IndexVec < G :: Node , Option < G :: Node > > =
48
+ IndexVec :: from_elem_n ( Option :: default ( ) , graph. num_nodes ( ) ) ;
50
49
immediate_dominators[ start_node] = Some ( start_node) ;
51
50
52
51
let mut changed = true ;
@@ -58,7 +57,7 @@ pub fn dominators_given_rpo<G: Graph>(graph: &G,
58
57
for pred in graph. predecessors ( node) {
59
58
if immediate_dominators[ pred] . is_some ( ) { // (*)
60
59
// (*) dominators for `pred` have been calculated
61
- new_idom = intersect_opt ( & post_order_rank,
60
+ new_idom = intersect_opt :: < G > ( & post_order_rank,
62
61
& immediate_dominators,
63
62
new_idom,
64
63
Some ( pred) ) ;
@@ -78,24 +77,24 @@ pub fn dominators_given_rpo<G: Graph>(graph: &G,
78
77
}
79
78
}
80
79
81
- fn intersect_opt < G : Graph > ( post_order_rank : & NodeVec < G , usize > ,
82
- immediate_dominators : & NodeVec < G , Option < G :: Node > > ,
80
+ fn intersect_opt < G : Graph > ( post_order_rank : & IndexVec < G :: Node , usize > ,
81
+ immediate_dominators : & IndexVec < G :: Node , Option < G :: Node > > ,
83
82
node1 : Option < G :: Node > ,
84
83
node2 : Option < G :: Node > )
85
84
-> Option < G :: Node >
86
85
{
87
86
match ( node1, node2) {
88
87
( None , None ) => None ,
89
88
( Some ( n) , None ) | ( None , Some ( n) ) => Some ( n) ,
90
- ( Some ( n1) , Some ( n2) ) => Some ( intersect ( post_order_rank,
89
+ ( Some ( n1) , Some ( n2) ) => Some ( intersect :: < G > ( post_order_rank,
91
90
immediate_dominators,
92
91
n1,
93
92
n2) ) ,
94
93
}
95
94
}
96
95
97
- fn intersect < G : Graph > ( post_order_rank : & NodeVec < G , usize > ,
98
- immediate_dominators : & NodeVec < G , Option < G :: Node > > ,
96
+ fn intersect < G : Graph > ( post_order_rank : & IndexVec < G :: Node , usize > ,
97
+ immediate_dominators : & IndexVec < G :: Node , Option < G :: Node > > ,
99
98
mut node1 : G :: Node ,
100
99
mut node2 : G :: Node )
101
100
-> G :: Node
@@ -114,8 +113,8 @@ fn intersect<G: Graph>(post_order_rank: &NodeVec<G, usize>,
114
113
115
114
#[ derive( Clone , Debug ) ]
116
115
pub struct Dominators < G : Graph > {
117
- post_order_rank : NodeVec < G , usize > ,
118
- immediate_dominators : NodeVec < G , Option < G :: Node > > ,
116
+ post_order_rank : IndexVec < G :: Node , usize > ,
117
+ immediate_dominators : IndexVec < G :: Node , Option < G :: Node > > ,
119
118
}
120
119
121
120
impl < G : Graph > Dominators < G > {
@@ -141,7 +140,7 @@ impl<G: Graph> Dominators<G> {
141
140
pub fn mutual_dominator_node ( & self , node1 : G :: Node , node2 : G :: Node ) -> G :: Node {
142
141
assert ! ( self . is_reachable( node1) , "node {:?} is not reachable" , node1) ;
143
142
assert ! ( self . is_reachable( node2) , "node {:?} is not reachable" , node2) ;
144
- intersect ( & self . post_order_rank , & self . immediate_dominators , node1, node2)
143
+ intersect :: < G > ( & self . post_order_rank , & self . immediate_dominators , node1, node2)
145
144
}
146
145
147
146
pub fn mutual_dominator < I > ( & self , iter : I ) -> Option < G :: Node >
@@ -154,13 +153,14 @@ impl<G: Graph> Dominators<G> {
154
153
} )
155
154
}
156
155
157
- pub fn all_immediate_dominators ( & self ) -> & NodeVec < G , Option < G :: Node > > {
156
+ pub fn all_immediate_dominators ( & self ) -> & IndexVec < G :: Node , Option < G :: Node > > {
158
157
& self . immediate_dominators
159
158
}
160
159
161
160
pub fn dominator_tree ( & self ) -> DominatorTree < G > {
162
- let mut children: NodeVec < G , Vec < G :: Node > > =
163
- NodeVec :: from_default_with_len ( self . immediate_dominators . len ( ) ) ;
161
+ let elem: Vec < G :: Node > = Vec :: new ( ) ;
162
+ let mut children: IndexVec < G :: Node , Vec < G :: Node > > =
163
+ IndexVec :: from_elem_n ( elem, self . immediate_dominators . len ( ) ) ;
164
164
let mut root = None ;
165
165
for ( index, immed_dom) in self . immediate_dominators . iter ( ) . enumerate ( ) {
166
166
let node = G :: Node :: new ( index) ;
@@ -204,7 +204,7 @@ impl<'dom, G: Graph> Iterator for Iter<'dom, G> {
204
204
205
205
pub struct DominatorTree < G : Graph > {
206
206
root : G :: Node ,
207
- children : NodeVec < G , Vec < G :: Node > > ,
207
+ children : IndexVec < G :: Node , Vec < G :: Node > > ,
208
208
}
209
209
210
210
impl < G : Graph > DominatorTree < G > {
0 commit comments