2121//! be indexed by the direction (see the type `Direction`).
2222
2323use std:: fmt:: Debug ;
24- use std:: mem;
25- use std:: ops:: Deref ;
2624
2725use rustc_index:: bit_set:: DenseBitSet ;
2826use rustc_index:: { Idx , IndexVec } ;
@@ -47,32 +45,18 @@ mod tests;
4745/// This graph implementation predates the later [graph traits](crate::graph),
4846/// and does not implement those traits, so it has its own implementations of a
4947/// few basic graph algorithms.
50- #[ derive( Clone ) ]
5148pub struct LinkedGraph < I : Idx , N , E > {
5249 nodes : IndexVec < I , Option < Node < N > > > ,
5350 edges : Vec < Edge < I , E > > ,
51+ linked_edges : usize ,
5452}
5553
56- #[ derive( Clone ) ]
57- pub struct FrozenLinkedGraph < I : Idx , N , E > {
58- inner : LinkedGraph < I , N , E > ,
59- }
60-
61- impl < I : Idx , N , E > Deref for FrozenLinkedGraph < I , N , E > {
62- type Target = LinkedGraph < I , N , E > ;
63-
64- fn deref ( & self ) -> & Self :: Target {
65- & self . inner
66- }
67- }
68-
69- #[ derive( Clone ) ]
7054pub struct Node < N > {
7155 first_edge : [ EdgeIndex ; 2 ] , // see module comment
7256 pub data : N ,
7357}
7458
75- #[ derive( Debug , Clone ) ]
59+ #[ derive( Debug ) ]
7660pub struct Edge < I , E > {
7761 next_edge : [ EdgeIndex ; 2 ] , // see module comment
7862 source : I ,
@@ -97,18 +81,26 @@ pub const INCOMING: Direction = Direction { repr: 1 };
9781
9882impl < I : Idx , N , E > LinkedGraph < I , N , E > {
9983 pub fn new ( ) -> Self {
100- Self { nodes : IndexVec :: new ( ) , edges : Vec :: new ( ) }
84+ Self { nodes : IndexVec :: new ( ) , edges : Vec :: new ( ) , linked_edges : 0 }
10185 }
10286
10387 pub fn from_node_n ( data : N , n : usize ) -> Self
10488 where
10589 N : Copy ,
10690 {
107- Self { nodes : IndexVec :: from_fn_n ( |_| Some ( Node :: new ( data) ) , n) , edges : Vec :: new ( ) }
91+ Self {
92+ nodes : IndexVec :: from_fn_n ( |_| Some ( Node :: new ( data) ) , n) ,
93+ edges : Vec :: new ( ) ,
94+ linked_edges : 0 ,
95+ }
10896 }
10997
11098 pub fn with_capacity ( nodes : usize , edges : usize ) -> Self {
111- Self { nodes : IndexVec :: with_capacity ( nodes) , edges : Vec :: with_capacity ( edges) }
99+ Self {
100+ nodes : IndexVec :: with_capacity ( nodes) ,
101+ edges : Vec :: with_capacity ( edges) ,
102+ linked_edges : 0 ,
103+ }
112104 }
113105
114106 // # Simple accessors
@@ -152,10 +144,6 @@ impl<I: Idx, N, E> LinkedGraph<I, N, E> {
152144 self . nodes [ idx] . as_ref ( ) . unwrap ( )
153145 }
154146
155- pub fn node_mut ( & mut self , idx : I ) -> & mut Node < N > {
156- self . nodes [ idx] . as_mut ( ) . unwrap ( )
157- }
158-
159147 // # Edge construction and queries
160148
161149 pub fn next_edge_index ( & self ) -> EdgeIndex {
@@ -186,49 +174,32 @@ impl<I: Idx, N, E> LinkedGraph<I, N, E> {
186174 self . enumerated_edges ( ) . all ( |( edge_idx, edge) | f ( edge_idx, edge) )
187175 }
188176
189- fn generate_lists ( & mut self ) {
190- for ( idx, edge) in self . edges . iter_mut ( ) . enumerate ( ) {
191- // read and adjust current first of the list of edges from each node
192- let source_first = mem :: replace (
193- & mut self . nodes [ edge. source ] . as_mut ( ) . unwrap ( ) . first_edge [ OUTGOING . repr ] ,
194- EdgeIndex ( idx ) ,
195- ) ;
196- let target_first = mem :: replace (
197- & mut self . nodes [ edge . target ] . as_mut ( ) . unwrap ( ) . first_edge [ INCOMING . repr ] ,
198- EdgeIndex ( idx ) ,
199- ) ;
177+ fn link_edges ( & mut self ) {
178+ for ( idx, edge) in self . edges . iter_mut ( ) . enumerate ( ) . skip ( self . linked_edges ) {
179+ // read current first of the list of edges from each node
180+ let ( Some ( Some ( source_node ) ) , Some ( Some ( target_node ) ) ) =
181+ ( self . nodes . get ( edge. source ) , self . nodes . get ( edge . target ) )
182+ else {
183+ return ;
184+ } ;
185+ let source_first = source_node . first_edge [ OUTGOING . repr ] ;
186+ let target_first = target_node . first_edge [ INCOMING . repr ] ;
187+ self . linked_edges += 1 ;
200188
201- // populate edges lists , with the previous firsts from each node
189+ // create the new edge , with the previous firsts from each node
202190 // as the next pointers
203191 edge. next_edge = [ source_first, target_first] ;
204- }
205- }
206192
207- pub fn freeze ( mut self ) -> FrozenLinkedGraph < I , N , E > {
208- self . generate_lists ( ) ;
209- FrozenLinkedGraph { inner : self }
210- }
211- }
212-
213- impl < I : Idx , N : Debug , E : Debug > LinkedGraph < I , N , E > {
214- pub fn add_edge ( & mut self , source : I , target : I , data : E ) -> EdgeIndex {
215- debug ! ( "graph: add_edge({:?}, {:?}, {:?})" , source, target, data) ;
216-
217- let idx = self . next_edge_index ( ) ;
218- self . edges . push ( Edge {
219- next_edge : [ INVALID_EDGE_INDEX , INVALID_EDGE_INDEX ] ,
220- source,
221- target,
222- data,
223- } ) ;
224- idx
193+ // adjust the firsts for each node target be the next object.
194+ self . nodes [ edge. source ] . as_mut ( ) . unwrap ( ) . first_edge [ OUTGOING . repr ] = EdgeIndex ( idx) ;
195+ self . nodes [ edge. target ] . as_mut ( ) . unwrap ( ) . first_edge [ INCOMING . repr ] = EdgeIndex ( idx) ;
196+ }
225197 }
226- }
227198
228- impl < I : Idx , N , E > FrozenLinkedGraph < I , N , E > {
229199 pub fn adjacent_edges ( & self , source : I , direction : Direction ) -> AdjacentEdges < ' _ , I , N , E > {
230- let first_edge = self . inner . node ( source) . first_edge [ direction. repr ] ;
231- AdjacentEdges { graph : & self . inner , direction, next : first_edge }
200+ assert_eq ! ( self . linked_edges, self . edges. len( ) , "linked graph is incomplete" ) ;
201+ let first_edge = self . node ( source) . first_edge [ direction. repr ] ;
202+ AdjacentEdges { graph : & self , direction, next : first_edge }
232203 }
233204
234205 pub fn outgoing_edges ( & self , source : I ) -> AdjacentEdges < ' _ , I , N , E > {
@@ -288,6 +259,22 @@ impl<I: Idx, N, E> FrozenLinkedGraph<I, N, E> {
288259 }
289260}
290261
262+ impl < I : Idx , N : Debug , E : Debug > LinkedGraph < I , N , E > {
263+ pub fn add_edge ( & mut self , source : I , target : I , data : E ) -> EdgeIndex {
264+ debug ! ( "graph: add_edge({:?}, {:?}, {:?})" , source, target, data) ;
265+
266+ let idx = self . next_edge_index ( ) ;
267+ self . edges . push ( Edge {
268+ next_edge : [ INVALID_EDGE_INDEX , INVALID_EDGE_INDEX ] ,
269+ source,
270+ target,
271+ data,
272+ } ) ;
273+ self . link_edges ( ) ;
274+ idx
275+ }
276+ }
277+
291278impl < N > Node < N > {
292279 #[ inline]
293280 const fn new ( data : N ) -> Node < N > {
@@ -334,15 +321,15 @@ impl<'g, I: Idx, N, E> Iterator for AdjacentEdges<'g, I, N, E> {
334321}
335322
336323pub struct DepthFirstTraversal < ' g , I : Idx , N , E > {
337- graph : & ' g FrozenLinkedGraph < I , N , E > ,
324+ graph : & ' g LinkedGraph < I , N , E > ,
338325 stack : Vec < I > ,
339326 visited : DenseBitSet < usize > ,
340327 direction : Direction ,
341328}
342329
343330impl < ' g , I : Idx , N , E > DepthFirstTraversal < ' g , I , N , E > {
344331 pub fn with_start_node (
345- graph : & ' g FrozenLinkedGraph < I , N , E > ,
332+ graph : & ' g LinkedGraph < I , N , E > ,
346333 start_node : I ,
347334 direction : Direction ,
348335 ) -> Self {
0 commit comments