@@ -72,6 +72,18 @@ impl Edges {
72
72
indexes. push ( edge)
73
73
}
74
74
}
75
+
76
+ fn all ( & self ) -> impl Iterator < Item = & Edge > + ' _ {
77
+ self . 0 . values ( ) . flatten ( )
78
+ }
79
+
80
+ fn of_kind ( & self , kind : & EdgeKind ) -> & [ Edge ] {
81
+ self . 0 . get ( kind) . map ( Vec :: as_slice) . unwrap_or_default ( )
82
+ }
83
+
84
+ fn is_empty ( & self ) -> bool {
85
+ self . 0 . is_empty ( )
86
+ }
75
87
}
76
88
77
89
/// A graph of dependencies.
@@ -121,20 +133,16 @@ impl<'a> Graph<'a> {
121
133
122
134
/// Returns a list of nodes the given node index points to for the given kind.
123
135
pub fn edges ( & self , from : usize , kind : & EdgeKind ) -> Vec < Edge > {
124
- match self . edges [ from] . 0 . get ( kind) {
125
- Some ( edges) => {
126
- // Created a sorted list for consistent output.
127
- let mut edges = edges. clone ( ) ;
128
- edges. sort_unstable_by ( |a, b| self . nodes [ a. node ] . cmp ( & self . nodes [ b. node ] ) ) ;
129
- edges
130
- }
131
- None => Vec :: new ( ) ,
132
- }
136
+ let edges = self . edges [ from] . of_kind ( kind) ;
137
+ // Created a sorted list for consistent output.
138
+ let mut edges = edges. to_owned ( ) ;
139
+ edges. sort_unstable_by ( |a, b| self . nodes [ a. node ( ) ] . cmp ( & self . nodes [ b. node ( ) ] ) ) ;
140
+ edges
133
141
}
134
142
135
143
/// Returns `true` if the given node has any outgoing edges.
136
144
pub fn has_outgoing_edges ( & self , index : usize ) -> bool {
137
- !self . edges [ index] . 0 . is_empty ( )
145
+ !self . edges [ index] . is_empty ( )
138
146
}
139
147
140
148
/// Gets a node by index.
@@ -200,15 +208,13 @@ impl<'a> Graph<'a> {
200
208
let new_from = new_graph. add_node ( node) ;
201
209
remap[ index] = Some ( new_from) ;
202
210
// Visit dependencies.
203
- for ( _, edges) in & graph. edges [ index] . 0 {
204
- for edge in edges {
205
- let new_to_index = visit ( graph, new_graph, remap, edge. node ( ) ) ;
206
- let new_edge = Edge {
207
- kind : edge. kind ( ) ,
208
- node : new_to_index,
209
- } ;
210
- new_graph. edges [ new_from] . add_edge ( new_edge) ;
211
- }
211
+ for edge in graph. edges [ index] . all ( ) {
212
+ let new_to_index = visit ( graph, new_graph, remap, edge. node ( ) ) ;
213
+ let new_edge = Edge {
214
+ kind : edge. kind ( ) ,
215
+ node : new_to_index,
216
+ } ;
217
+ new_graph. edges [ new_from] . add_edge ( new_edge) ;
212
218
}
213
219
new_from
214
220
}
@@ -225,14 +231,12 @@ impl<'a> Graph<'a> {
225
231
pub fn invert ( & mut self ) {
226
232
let mut new_edges = vec ! [ Edges :: new( ) ; self . edges. len( ) ] ;
227
233
for ( from_idx, node_edges) in self . edges . iter ( ) . enumerate ( ) {
228
- for ( _, edges) in & node_edges. 0 {
229
- for edge in edges {
230
- let new_edge = Edge {
231
- kind : edge. kind ( ) ,
232
- node : from_idx,
233
- } ;
234
- new_edges[ edge. node ( ) ] . add_edge ( new_edge) ;
235
- }
234
+ for edge in node_edges. all ( ) {
235
+ let new_edge = Edge {
236
+ kind : edge. kind ( ) ,
237
+ node : from_idx,
238
+ } ;
239
+ new_edges[ edge. node ( ) ] . add_edge ( new_edge) ;
236
240
}
237
241
}
238
242
self . edges = new_edges;
0 commit comments