@@ -26,6 +26,22 @@ pub enum Node {
26
26
} ,
27
27
}
28
28
29
+ #[ derive( Debug , Copy , Hash , Eq , Clone , PartialEq ) ]
30
+ pub struct Edge {
31
+ kind : EdgeKind ,
32
+ node : usize ,
33
+ }
34
+
35
+ impl Edge {
36
+ pub fn kind ( & self ) -> EdgeKind {
37
+ self . kind
38
+ }
39
+
40
+ pub fn node ( & self ) -> usize {
41
+ self . node
42
+ }
43
+ }
44
+
29
45
/// The kind of edge, for separating dependencies into different sections.
30
46
#[ derive( Debug , Copy , Hash , Eq , Clone , PartialEq ) ]
31
47
pub enum EdgeKind {
@@ -42,18 +58,18 @@ pub enum EdgeKind {
42
58
/// The value is a `Vec` because each edge kind can have multiple outgoing
43
59
/// edges. For example, package "foo" can have multiple normal dependencies.
44
60
#[ derive( Clone ) ]
45
- struct Edges ( HashMap < EdgeKind , Vec < usize > > ) ;
61
+ struct Edges ( HashMap < EdgeKind , Vec < Edge > > ) ;
46
62
47
63
impl Edges {
48
64
fn new ( ) -> Edges {
49
65
Edges ( HashMap :: new ( ) )
50
66
}
51
67
52
68
/// Adds an edge pointing to the given node.
53
- fn add_edge ( & mut self , kind : EdgeKind , index : usize ) {
54
- let indexes = self . 0 . entry ( kind) . or_default ( ) ;
55
- if !indexes. contains ( & index ) {
56
- indexes. push ( index )
69
+ fn add_edge ( & mut self , edge : Edge ) {
70
+ let indexes = self . 0 . entry ( edge . kind ( ) ) . or_default ( ) ;
71
+ if !indexes. contains ( & edge ) {
72
+ indexes. push ( edge )
57
73
}
58
74
}
59
75
}
@@ -104,13 +120,13 @@ impl<'a> Graph<'a> {
104
120
}
105
121
106
122
/// Returns a list of nodes the given node index points to for the given kind.
107
- pub fn connected_nodes ( & self , from : usize , kind : & EdgeKind ) -> Vec < usize > {
123
+ pub fn edges ( & self , from : usize , kind : & EdgeKind ) -> Vec < Edge > {
108
124
match self . edges [ from] . 0 . get ( kind) {
109
- Some ( indexes ) => {
125
+ Some ( edges ) => {
110
126
// Created a sorted list for consistent output.
111
- let mut indexes = indexes . clone ( ) ;
112
- indexes . sort_unstable_by ( |a, b| self . nodes [ * a ] . cmp ( & self . nodes [ * b ] ) ) ;
113
- indexes
127
+ let mut edges = edges . clone ( ) ;
128
+ edges . sort_unstable_by ( |a, b| self . nodes [ a . node ] . cmp ( & self . nodes [ b . node ] ) ) ;
129
+ edges
114
130
}
115
131
None => Vec :: new ( ) ,
116
132
}
@@ -184,10 +200,14 @@ impl<'a> Graph<'a> {
184
200
let new_from = new_graph. add_node ( node) ;
185
201
remap[ index] = Some ( new_from) ;
186
202
// Visit dependencies.
187
- for ( edge_kind, edge_indexes) in & graph. edges [ index] . 0 {
188
- for edge_index in edge_indexes {
189
- let new_to_index = visit ( graph, new_graph, remap, * edge_index) ;
190
- new_graph. edges [ new_from] . add_edge ( * edge_kind, new_to_index) ;
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) ;
191
211
}
192
212
}
193
213
new_from
@@ -205,9 +225,13 @@ impl<'a> Graph<'a> {
205
225
pub fn invert ( & mut self ) {
206
226
let mut new_edges = vec ! [ Edges :: new( ) ; self . edges. len( ) ] ;
207
227
for ( from_idx, node_edges) in self . edges . iter ( ) . enumerate ( ) {
208
- for ( edge_kind, edge_indexes) in & node_edges. 0 {
209
- for edge_index in edge_indexes {
210
- new_edges[ * edge_index] . add_edge ( * edge_kind, from_idx) ;
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) ;
211
235
}
212
236
}
213
237
}
@@ -454,10 +478,18 @@ fn add_pkg(
454
478
}
455
479
if !dep. uses_default_features ( ) && dep. features ( ) . is_empty ( ) {
456
480
// No features, use a direct connection.
457
- graph. edges [ from_index] . add_edge ( EdgeKind :: Dep ( dep. kind ( ) ) , dep_index) ;
481
+ let new_edge = Edge {
482
+ kind : EdgeKind :: Dep ( dep. kind ( ) ) ,
483
+ node : dep_index,
484
+ } ;
485
+ graph. edges [ from_index] . add_edge ( new_edge) ;
458
486
}
459
487
} else {
460
- graph. edges [ from_index] . add_edge ( EdgeKind :: Dep ( dep. kind ( ) ) , dep_index) ;
488
+ let new_edge = Edge {
489
+ kind : EdgeKind :: Dep ( dep. kind ( ) ) ,
490
+ node : dep_index,
491
+ } ;
492
+ graph. edges [ from_index] . add_edge ( new_edge) ;
461
493
}
462
494
}
463
495
}
@@ -500,9 +532,17 @@ fn add_feature(
500
532
None => ( true , graph. add_node ( node) ) ,
501
533
} ;
502
534
if let Some ( from) = from {
503
- graph. edges [ from] . add_edge ( kind, node_index) ;
535
+ let from_edge = Edge {
536
+ kind,
537
+ node : node_index,
538
+ } ;
539
+ graph. edges [ from] . add_edge ( from_edge) ;
504
540
}
505
- graph. edges [ node_index] . add_edge ( EdgeKind :: Feature , to) ;
541
+ let to_edge = Edge {
542
+ kind : EdgeKind :: Feature ,
543
+ node : to,
544
+ } ;
545
+ graph. edges [ node_index] . add_edge ( to_edge) ;
506
546
( missing, node_index)
507
547
}
508
548
0 commit comments