1use std::cmp;
7use std::fmt;
8use std::iter;
9use std::marker::PhantomData;
10use std::mem::replace;
11use std::mem::size_of;
12use std::ops::{Index, IndexMut};
13use std::slice;
14
15use fixedbitset::FixedBitSet;
16
17use crate::{Directed, Direction, EdgeType, Graph, Incoming, Outgoing, Undirected};
18
19use crate::iter_format::{DebugMap, IterFormatExt, NoPretty};
20use crate::iter_utils::IterUtilsExt;
21
22use super::{index_twice, Edge, Frozen, Node, Pair, DIRECTIONS};
23use crate::visit;
24use crate::visit::{EdgeIndexable, EdgeRef, IntoEdgeReferences, NodeIndexable};
25use crate::IntoWeightedEdge;
26
27#[doc(no_inline)]
29pub use crate::graph::{
30 edge_index, node_index, DefaultIx, EdgeIndex, GraphIndex, IndexType, NodeIndex,
31};
32
33use crate::util::enumerate;
34
35#[cfg(feature = "serde-1")]
36mod serialization;
37
38pub struct StableGraph<N, E, Ty = Directed, Ix = DefaultIx> {
75 g: Graph<Option<N>, Option<E>, Ty, Ix>,
76 node_count: usize,
77 edge_count: usize,
78
79 free_node: NodeIndex<Ix>,
91 free_edge: EdgeIndex<Ix>,
92}
93
94pub type StableDiGraph<N, E, Ix = DefaultIx> = StableGraph<N, E, Directed, Ix>;
99
100pub type StableUnGraph<N, E, Ix = DefaultIx> = StableGraph<N, E, Undirected, Ix>;
105
106impl<N, E, Ty, Ix> fmt::Debug for StableGraph<N, E, Ty, Ix>
107where
108 N: fmt::Debug,
109 E: fmt::Debug,
110 Ty: EdgeType,
111 Ix: IndexType,
112{
113 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
114 let etype = if self.is_directed() {
115 "Directed"
116 } else {
117 "Undirected"
118 };
119 let mut fmt_struct = f.debug_struct("StableGraph");
120 fmt_struct.field("Ty", &etype);
121 fmt_struct.field("node_count", &self.node_count);
122 fmt_struct.field("edge_count", &self.edge_count);
123 if self.g.edges.iter().any(|e| e.weight.is_some()) {
124 fmt_struct.field(
125 "edges",
126 &self
127 .g
128 .edges
129 .iter()
130 .filter(|e| e.weight.is_some())
131 .map(|e| NoPretty((e.source().index(), e.target().index())))
132 .format(", "),
133 );
134 }
135 if size_of::<N>() != 0 {
137 fmt_struct.field(
138 "node weights",
139 &DebugMap(|| {
140 self.g
141 .nodes
142 .iter()
143 .map(|n| n.weight.as_ref())
144 .enumerate()
145 .filter_map(|(i, wo)| wo.map(move |w| (i, w)))
146 }),
147 );
148 }
149 if size_of::<E>() != 0 {
150 fmt_struct.field(
151 "edge weights",
152 &DebugMap(|| {
153 self.g
154 .edges
155 .iter()
156 .map(|n| n.weight.as_ref())
157 .enumerate()
158 .filter_map(|(i, wo)| wo.map(move |w| (i, w)))
159 }),
160 );
161 }
162 fmt_struct.field("free_node", &self.free_node);
163 fmt_struct.field("free_edge", &self.free_edge);
164 fmt_struct.finish()
165 }
166}
167
168impl<N, E> StableGraph<N, E, Directed> {
169 pub fn new() -> Self {
175 Self::with_capacity(0, 0)
176 }
177}
178
179impl<N, E, Ty, Ix> StableGraph<N, E, Ty, Ix>
180where
181 Ty: EdgeType,
182 Ix: IndexType,
183{
184 pub fn with_capacity(nodes: usize, edges: usize) -> Self {
186 StableGraph {
187 g: Graph::with_capacity(nodes, edges),
188 node_count: 0,
189 edge_count: 0,
190 free_node: NodeIndex::end(),
191 free_edge: EdgeIndex::end(),
192 }
193 }
194
195 pub fn capacity(&self) -> (usize, usize) {
197 self.g.capacity()
198 }
199
200 pub fn reverse(&mut self) {
202 for edge in &mut self.g.edges {
206 edge.node.swap(0, 1);
207 edge.next.swap(0, 1);
208 }
209 for node in &mut self.g.nodes {
210 node.next.swap(0, 1);
211 }
212 }
213
214 pub fn clear(&mut self) {
216 self.node_count = 0;
217 self.edge_count = 0;
218 self.free_node = NodeIndex::end();
219 self.free_edge = EdgeIndex::end();
220 self.g.clear();
221 }
222
223 pub fn clear_edges(&mut self) {
225 self.edge_count = 0;
226 self.free_edge = EdgeIndex::end();
227 self.g.edges.clear();
228 for node in &mut self.g.nodes {
230 if node.weight.is_some() {
231 node.next = [EdgeIndex::end(), EdgeIndex::end()];
232 }
233 }
234 }
235
236 pub fn node_count(&self) -> usize {
240 self.node_count
241 }
242
243 pub fn edge_count(&self) -> usize {
247 self.edge_count
248 }
249
250 #[inline]
252 pub fn is_directed(&self) -> bool {
253 Ty::is_directed()
254 }
255
256 pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix> {
265 if self.free_node != NodeIndex::end() {
266 let node_idx = self.free_node;
267 self.occupy_vacant_node(node_idx, weight);
268 node_idx
269 } else {
270 self.node_count += 1;
271 self.g.add_node(Some(weight))
272 }
273 }
274
275 fn add_vacant_node(&mut self, free_node: &mut NodeIndex<Ix>) {
277 let node_idx = self.g.add_node(None);
278 let node_slot = &mut self.g.nodes[node_idx.index()];
280 node_slot.next = [free_node._into_edge(), EdgeIndex::end()];
281 if *free_node != NodeIndex::end() {
282 self.g.nodes[free_node.index()].next[1] = node_idx._into_edge();
283 }
284 *free_node = node_idx;
285 }
286
287 pub fn remove_node(&mut self, a: NodeIndex<Ix>) -> Option<N> {
298 let node_weight = self.g.nodes.get_mut(a.index())?.weight.take()?;
299 for d in &DIRECTIONS {
300 let k = d.index();
301
302 loop {
304 let next = self.g.nodes[a.index()].next[k];
305 if next == EdgeIndex::end() {
306 break;
307 }
308 let ret = self.remove_edge(next);
309 debug_assert!(ret.is_some());
310 let _ = ret;
311 }
312 }
313
314 let node_slot = &mut self.g.nodes[a.index()];
315 node_slot.next = [self.free_node._into_edge(), EdgeIndex::end()];
318 if self.free_node != NodeIndex::end() {
319 self.g.nodes[self.free_node.index()].next[1] = a._into_edge();
320 }
321 self.free_node = a;
322 self.node_count -= 1;
323
324 Some(node_weight)
325 }
326
327 pub fn contains_node(&self, a: NodeIndex<Ix>) -> bool {
328 self.get_node(a).is_some()
329 }
330
331 fn get_node(&self, a: NodeIndex<Ix>) -> Option<&Node<Option<N>, Ix>> {
333 self.g
334 .nodes
335 .get(a.index())
336 .and_then(|node| node.weight.as_ref().map(move |_| node))
337 }
338
339 pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> {
352 let edge_idx;
353 let mut new_edge = None::<Edge<_, _>>;
354 {
355 let edge: &mut Edge<_, _>;
356
357 if self.free_edge != EdgeIndex::end() {
358 edge_idx = self.free_edge;
359 edge = &mut self.g.edges[edge_idx.index()];
360 let _old = replace(&mut edge.weight, Some(weight));
361 debug_assert!(_old.is_none());
362 self.free_edge = edge.next[0];
363 edge.node = [a, b];
364 } else {
365 edge_idx = EdgeIndex::new(self.g.edges.len());
366 assert!(<Ix as IndexType>::max().index() == !0 || EdgeIndex::end() != edge_idx);
367 new_edge = Some(Edge {
368 weight: Some(weight),
369 node: [a, b],
370 next: [EdgeIndex::end(); 2],
371 });
372 edge = new_edge.as_mut().unwrap();
373 }
374
375 let wrong_index = match index_twice(&mut self.g.nodes, a.index(), b.index()) {
376 Pair::None => Some(cmp::max(a.index(), b.index())),
377 Pair::One(an) => {
378 if an.weight.is_none() {
379 Some(a.index())
380 } else {
381 edge.next = an.next;
382 an.next[0] = edge_idx;
383 an.next[1] = edge_idx;
384 None
385 }
386 }
387 Pair::Both(an, bn) => {
388 if an.weight.is_none() {
390 Some(a.index())
391 } else if bn.weight.is_none() {
392 Some(b.index())
393 } else {
394 edge.next = [an.next[0], bn.next[1]];
395 an.next[0] = edge_idx;
396 bn.next[1] = edge_idx;
397 None
398 }
399 }
400 };
401 if let Some(i) = wrong_index {
402 panic!(
403 "StableGraph::add_edge: node index {} is not a node in the graph",
404 i
405 );
406 }
407 self.edge_count += 1;
408 }
409 if let Some(edge) = new_edge {
410 self.g.edges.push(edge);
411 }
412 edge_idx
413 }
414
415 fn add_vacant_edge(&mut self, free_edge: &mut EdgeIndex<Ix>) {
417 let edge_idx = EdgeIndex::new(self.g.edges.len());
418 debug_assert!(edge_idx != EdgeIndex::end());
419 let mut edge = Edge {
420 weight: None,
421 node: [NodeIndex::end(); 2],
422 next: [EdgeIndex::end(); 2],
423 };
424 edge.next[0] = *free_edge;
425 *free_edge = edge_idx;
426 self.g.edges.push(edge);
427 }
428
429 pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> {
439 if let Some(ix) = self.find_edge(a, b) {
440 self[ix] = weight;
441 return ix;
442 }
443 self.add_edge(a, b, weight)
444 }
445
446 pub fn remove_edge(&mut self, e: EdgeIndex<Ix>) -> Option<E> {
453 let (is_edge, edge_node, edge_next) = match self.g.edges.get(e.index()) {
457 None => return None,
458 Some(x) => (x.weight.is_some(), x.node, x.next),
459 };
460 if !is_edge {
461 return None;
462 }
463
464 self.g.change_edge_links(edge_node, e, edge_next);
467
468 let edge = &mut self.g.edges[e.index()];
470 edge.next = [self.free_edge, EdgeIndex::end()];
471 edge.node = [NodeIndex::end(), NodeIndex::end()];
472 self.free_edge = e;
473 self.edge_count -= 1;
474 edge.weight.take()
475 }
476
477 pub fn node_weight(&self, a: NodeIndex<Ix>) -> Option<&N> {
481 match self.g.nodes.get(a.index()) {
482 Some(no) => no.weight.as_ref(),
483 None => None,
484 }
485 }
486
487 pub fn node_weight_mut(&mut self, a: NodeIndex<Ix>) -> Option<&mut N> {
491 match self.g.nodes.get_mut(a.index()) {
492 Some(no) => no.weight.as_mut(),
493 None => None,
494 }
495 }
496
497 pub fn node_weights(&self) -> impl Iterator<Item = &N> {
502 self.g
503 .node_weights()
504 .filter_map(|maybe_node| maybe_node.as_ref())
505 }
506 pub fn node_weights_mut(&mut self) -> impl Iterator<Item = &mut N> {
511 self.g
512 .node_weights_mut()
513 .filter_map(|maybe_node| maybe_node.as_mut())
514 }
515
516 pub fn node_indices(&self) -> NodeIndices<N, Ix> {
518 NodeIndices {
519 iter: enumerate(self.raw_nodes()),
520 }
521 }
522
523 pub fn edge_weight(&self, e: EdgeIndex<Ix>) -> Option<&E> {
527 match self.g.edges.get(e.index()) {
528 Some(ed) => ed.weight.as_ref(),
529 None => None,
530 }
531 }
532
533 pub fn edge_weight_mut(&mut self, e: EdgeIndex<Ix>) -> Option<&mut E> {
537 match self.g.edges.get_mut(e.index()) {
538 Some(ed) => ed.weight.as_mut(),
539 None => None,
540 }
541 }
542
543 pub fn edge_weights(&self) -> impl Iterator<Item = &E> {
548 self.g
549 .edge_weights()
550 .filter_map(|maybe_edge| maybe_edge.as_ref())
551 }
552 pub fn edge_weights_mut(&mut self) -> impl Iterator<Item = &mut E> {
557 self.g
558 .edge_weights_mut()
559 .filter_map(|maybe_edge| maybe_edge.as_mut())
560 }
561
562 pub fn edge_endpoints(&self, e: EdgeIndex<Ix>) -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)> {
564 match self.g.edges.get(e.index()) {
565 Some(ed) if ed.weight.is_some() => Some((ed.source(), ed.target())),
566 _otherwise => None,
567 }
568 }
569
570 pub fn edge_indices(&self) -> EdgeIndices<E, Ix> {
572 EdgeIndices {
573 iter: enumerate(self.raw_edges()),
574 }
575 }
576
577 pub fn edges_connecting(
584 &self,
585 a: NodeIndex<Ix>,
586 b: NodeIndex<Ix>,
587 ) -> EdgesConnecting<E, Ty, Ix> {
588 EdgesConnecting {
589 target_node: b,
590 edges: self.edges_directed(a, Direction::Outgoing),
591 ty: PhantomData,
592 }
593 }
594
595 pub fn contains_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool {
600 self.find_edge(a, b).is_some()
601 }
602
603 pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>> {
608 if !self.is_directed() {
609 self.find_edge_undirected(a, b).map(|(ix, _)| ix)
610 } else {
611 match self.get_node(a) {
612 None => None,
613 Some(node) => self.g.find_edge_directed_from_node(node, b),
614 }
615 }
616 }
617
618 pub fn find_edge_undirected(
626 &self,
627 a: NodeIndex<Ix>,
628 b: NodeIndex<Ix>,
629 ) -> Option<(EdgeIndex<Ix>, Direction)> {
630 match self.get_node(a) {
631 None => None,
632 Some(node) => self.g.find_edge_undirected_from_node(node, b),
633 }
634 }
635
636 pub fn neighbors(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> {
649 self.neighbors_directed(a, Outgoing)
650 }
651
652 pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Neighbors<E, Ix> {
668 let mut iter = self.neighbors_undirected(a);
669 if self.is_directed() {
670 let k = dir.index();
671 iter.next[1 - k] = EdgeIndex::end();
672 iter.skip_start = NodeIndex::end();
673 }
674 iter
675 }
676
677 pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> {
691 Neighbors {
692 skip_start: a,
693 edges: &self.g.edges,
694 next: match self.get_node(a) {
695 None => [EdgeIndex::end(), EdgeIndex::end()],
696 Some(n) => n.next,
697 },
698 }
699 }
700
701 pub fn edges(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> {
709 self.edges_directed(a, Outgoing)
710 }
711
712 pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix> {
724 Edges {
725 skip_start: a,
726 edges: &self.g.edges,
727 direction: dir,
728 next: match self.get_node(a) {
729 None => [EdgeIndex::end(), EdgeIndex::end()],
730 Some(n) => n.next,
731 },
732 ty: PhantomData,
733 }
734 }
735
736 pub fn externals(&self, dir: Direction) -> Externals<N, Ty, Ix> {
748 Externals {
749 iter: self.raw_nodes().iter().enumerate(),
750 dir,
751 ty: PhantomData,
752 }
753 }
754
755 pub fn index_twice_mut<T, U>(
760 &mut self,
761 i: T,
762 j: U,
763 ) -> (
764 &mut <Self as Index<T>>::Output,
765 &mut <Self as Index<U>>::Output,
766 )
767 where
768 Self: IndexMut<T> + IndexMut<U>,
769 T: GraphIndex,
770 U: GraphIndex,
771 {
772 assert!(T::is_node_index() != U::is_node_index() || i.index() != j.index());
773
774 unsafe {
776 let self_mut = self as *mut _;
777 (
778 <Self as IndexMut<T>>::index_mut(&mut *self_mut, i),
779 <Self as IndexMut<U>>::index_mut(&mut *self_mut, j),
780 )
781 }
782 }
783
784 pub fn retain_nodes<F>(&mut self, mut visit: F)
800 where
801 F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool,
802 {
803 for i in 0..self.node_bound() {
804 let ix = node_index(i);
805 if self.contains_node(ix) && !visit(Frozen(self), ix) {
806 self.remove_node(ix);
807 }
808 }
809 self.check_free_lists();
810 }
811
812 pub fn retain_edges<F>(&mut self, mut visit: F)
825 where
826 F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool,
827 {
828 for i in 0..self.edge_bound() {
829 let ix = edge_index(i);
830 if self.edge_weight(ix).is_some() && !visit(Frozen(self), ix) {
831 self.remove_edge(ix);
832 }
833 }
834 self.check_free_lists();
835 }
836
837 pub fn from_edges<I>(iterable: I) -> Self
855 where
856 I: IntoIterator,
857 I::Item: IntoWeightedEdge<E>,
858 <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
859 N: Default,
860 {
861 let mut g = Self::with_capacity(0, 0);
862 g.extend_with_edges(iterable);
863 g
864 }
865
866 pub fn map<'a, F, G, N2, E2>(
872 &'a self,
873 mut node_map: F,
874 mut edge_map: G,
875 ) -> StableGraph<N2, E2, Ty, Ix>
876 where
877 F: FnMut(NodeIndex<Ix>, &'a N) -> N2,
878 G: FnMut(EdgeIndex<Ix>, &'a E) -> E2,
879 {
880 let g = self.g.map(
881 move |i, w| w.as_ref().map(|w| node_map(i, w)),
882 move |i, w| w.as_ref().map(|w| edge_map(i, w)),
883 );
884 StableGraph {
885 g,
886 node_count: self.node_count,
887 edge_count: self.edge_count,
888 free_node: self.free_node,
889 free_edge: self.free_edge,
890 }
891 }
892
893 pub fn filter_map<'a, F, G, N2, E2>(
905 &'a self,
906 mut node_map: F,
907 mut edge_map: G,
908 ) -> StableGraph<N2, E2, Ty, Ix>
909 where
910 F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>,
911 G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>,
912 {
913 let node_bound = self.node_bound();
914 let edge_bound = self.edge_bound();
915 let mut result_g = StableGraph::with_capacity(node_bound, edge_bound);
916 let mut free_node = NodeIndex::end();
919 let mut free_edge = EdgeIndex::end();
920
921 for (i, node) in enumerate(self.raw_nodes()) {
924 if i >= node_bound {
925 break;
926 }
927 if let Some(node_weight) = node.weight.as_ref() {
928 if let Some(new_weight) = node_map(NodeIndex::new(i), node_weight) {
929 result_g.add_node(new_weight);
930 continue;
931 }
932 }
933 result_g.add_vacant_node(&mut free_node);
934 }
935 for (i, edge) in enumerate(self.raw_edges()) {
936 if i >= edge_bound {
937 break;
938 }
939 let source = edge.source();
940 let target = edge.target();
941 if let Some(edge_weight) = edge.weight.as_ref() {
942 if result_g.contains_node(source) && result_g.contains_node(target) {
943 if let Some(new_weight) = edge_map(EdgeIndex::new(i), edge_weight) {
944 result_g.add_edge(source, target, new_weight);
945 continue;
946 }
947 }
948 }
949 result_g.add_vacant_edge(&mut free_edge);
950 }
951 result_g.free_node = free_node;
952 result_g.free_edge = free_edge;
953 result_g.check_free_lists();
954 result_g
955 }
956
957 pub fn extend_with_edges<I>(&mut self, iterable: I)
965 where
966 I: IntoIterator,
967 I::Item: IntoWeightedEdge<E>,
968 <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
969 N: Default,
970 {
971 let iter = iterable.into_iter();
972
973 for elt in iter {
974 let (source, target, weight) = elt.into_weighted_edge();
975 let (source, target) = (source.into(), target.into());
976 self.ensure_node_exists(source);
977 self.ensure_node_exists(target);
978 self.add_edge(source, target, weight);
979 }
980 }
981
982 fn raw_nodes(&self) -> &[Node<Option<N>, Ix>] {
986 self.g.raw_nodes()
987 }
988
989 fn raw_edges(&self) -> &[Edge<Option<E>, Ix>] {
990 self.g.raw_edges()
991 }
992
993 fn occupy_vacant_node(&mut self, node_idx: NodeIndex<Ix>, weight: N) {
996 let node_slot = &mut self.g.nodes[node_idx.index()];
997 let _old = replace(&mut node_slot.weight, Some(weight));
998 debug_assert!(_old.is_none());
999 let previous_node = node_slot.next[1];
1000 let next_node = node_slot.next[0];
1001 node_slot.next = [EdgeIndex::end(), EdgeIndex::end()];
1002 if previous_node != EdgeIndex::end() {
1003 self.g.nodes[previous_node.index()].next[0] = next_node;
1004 }
1005 if next_node != EdgeIndex::end() {
1006 self.g.nodes[next_node.index()].next[1] = previous_node;
1007 }
1008 if self.free_node == node_idx {
1009 self.free_node = next_node._into_node();
1010 }
1011 self.node_count += 1;
1012 }
1013
1014 fn ensure_node_exists(&mut self, node_ix: NodeIndex<Ix>)
1017 where
1018 N: Default,
1019 {
1020 if let Some(Some(_)) = self.g.node_weight(node_ix) {
1021 return;
1022 }
1023 while node_ix.index() >= self.g.node_count() {
1024 let mut free_node = self.free_node;
1025 self.add_vacant_node(&mut free_node);
1026 self.free_node = free_node;
1027 }
1028 self.occupy_vacant_node(node_ix, N::default());
1029 }
1030
1031 #[cfg(feature = "serde-1")]
1032 fn link_edges(&mut self) -> Result<(), NodeIndex<Ix>> {
1034 self.node_count = 0;
1036 self.edge_count = 0;
1037 let mut free_node = NodeIndex::end();
1038 for node_index in 0..self.g.node_count() {
1039 let node = &mut self.g.nodes[node_index];
1040 if node.weight.is_some() {
1041 self.node_count += 1;
1042 } else {
1043 node.next = [free_node._into_edge(), EdgeIndex::end()];
1045 if free_node != NodeIndex::end() {
1046 self.g.nodes[free_node.index()].next[1] = EdgeIndex::new(node_index);
1047 }
1048 free_node = NodeIndex::new(node_index);
1049 }
1050 }
1051 self.free_node = free_node;
1052
1053 let mut free_edge = EdgeIndex::end();
1054 for (edge_index, edge) in enumerate(&mut self.g.edges) {
1055 if edge.weight.is_none() {
1056 edge.next = [free_edge, EdgeIndex::end()];
1058 free_edge = EdgeIndex::new(edge_index);
1059 continue;
1060 }
1061 let a = edge.source();
1062 let b = edge.target();
1063 let edge_idx = EdgeIndex::new(edge_index);
1064 match index_twice(&mut self.g.nodes, a.index(), b.index()) {
1065 Pair::None => return Err(if a > b { a } else { b }),
1066 Pair::One(an) => {
1067 edge.next = an.next;
1068 an.next[0] = edge_idx;
1069 an.next[1] = edge_idx;
1070 }
1071 Pair::Both(an, bn) => {
1072 edge.next = [an.next[0], bn.next[1]];
1074 an.next[0] = edge_idx;
1075 bn.next[1] = edge_idx;
1076 }
1077 }
1078 self.edge_count += 1;
1079 }
1080 self.free_edge = free_edge;
1081 Ok(())
1082 }
1083
1084 #[cfg(not(debug_assertions))]
1085 fn check_free_lists(&self) {}
1086 #[cfg(debug_assertions)]
1087 fn check_free_lists(&self) {
1090 let mut free_node = self.free_node;
1091 let mut prev_free_node = NodeIndex::end();
1092 let mut free_node_len = 0;
1093 while free_node != NodeIndex::end() {
1094 if let Some(n) = self.g.nodes.get(free_node.index()) {
1095 if n.weight.is_none() {
1096 debug_assert_eq!(n.next[1]._into_node(), prev_free_node);
1097 prev_free_node = free_node;
1098 free_node = n.next[0]._into_node();
1099 free_node_len += 1;
1100 continue;
1101 }
1102 debug_assert!(
1103 false,
1104 "Corrupt free list: pointing to existing {:?}",
1105 free_node.index()
1106 );
1107 }
1108 debug_assert!(false, "Corrupt free list: missing {:?}", free_node.index());
1109 }
1110 debug_assert_eq!(self.node_count(), self.raw_nodes().len() - free_node_len);
1111
1112 let mut free_edge_len = 0;
1113 let mut free_edge = self.free_edge;
1114 while free_edge != EdgeIndex::end() {
1115 if let Some(n) = self.g.edges.get(free_edge.index()) {
1116 if n.weight.is_none() {
1117 free_edge = n.next[0];
1118 free_edge_len += 1;
1119 continue;
1120 }
1121 debug_assert!(
1122 false,
1123 "Corrupt free list: pointing to existing {:?}",
1124 free_node.index()
1125 );
1126 }
1127 debug_assert!(false, "Corrupt free list: missing {:?}", free_edge.index());
1128 }
1129 debug_assert_eq!(self.edge_count(), self.raw_edges().len() - free_edge_len);
1130 }
1131}
1132
1133impl<N, E, Ty, Ix: IndexType> Clone for StableGraph<N, E, Ty, Ix>
1135where
1136 N: Clone,
1137 E: Clone,
1138{
1139 fn clone(&self) -> Self {
1140 StableGraph {
1141 g: self.g.clone(),
1142 node_count: self.node_count,
1143 edge_count: self.edge_count,
1144 free_node: self.free_node,
1145 free_edge: self.free_edge,
1146 }
1147 }
1148
1149 fn clone_from(&mut self, rhs: &Self) {
1150 self.g.clone_from(&rhs.g);
1151 self.node_count = rhs.node_count;
1152 self.edge_count = rhs.edge_count;
1153 self.free_node = rhs.free_node;
1154 self.free_edge = rhs.free_edge;
1155 }
1156}
1157
1158impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
1162where
1163 Ty: EdgeType,
1164 Ix: IndexType,
1165{
1166 type Output = N;
1167 fn index(&self, index: NodeIndex<Ix>) -> &N {
1168 self.node_weight(index).unwrap()
1169 }
1170}
1171
1172impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
1176where
1177 Ty: EdgeType,
1178 Ix: IndexType,
1179{
1180 fn index_mut(&mut self, index: NodeIndex<Ix>) -> &mut N {
1181 self.node_weight_mut(index).unwrap()
1182 }
1183}
1184
1185impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
1189where
1190 Ty: EdgeType,
1191 Ix: IndexType,
1192{
1193 type Output = E;
1194 fn index(&self, index: EdgeIndex<Ix>) -> &E {
1195 self.edge_weight(index).unwrap()
1196 }
1197}
1198
1199impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
1203where
1204 Ty: EdgeType,
1205 Ix: IndexType,
1206{
1207 fn index_mut(&mut self, index: EdgeIndex<Ix>) -> &mut E {
1208 self.edge_weight_mut(index).unwrap()
1209 }
1210}
1211
1212impl<N, E, Ty, Ix> Default for StableGraph<N, E, Ty, Ix>
1214where
1215 Ty: EdgeType,
1216 Ix: IndexType,
1217{
1218 fn default() -> Self {
1219 Self::with_capacity(0, 0)
1220 }
1221}
1222
1223impl<N, E, Ty, Ix> From<Graph<N, E, Ty, Ix>> for StableGraph<N, E, Ty, Ix>
1230where
1231 Ty: EdgeType,
1232 Ix: IndexType,
1233{
1234 fn from(g: Graph<N, E, Ty, Ix>) -> Self {
1235 let nodes = g.nodes.into_iter().map(|e| Node {
1236 weight: Some(e.weight),
1237 next: e.next,
1238 });
1239 let edges = g.edges.into_iter().map(|e| Edge {
1240 weight: Some(e.weight),
1241 node: e.node,
1242 next: e.next,
1243 });
1244 StableGraph {
1245 node_count: nodes.len(),
1246 edge_count: edges.len(),
1247 g: Graph {
1248 edges: edges.collect(),
1249 nodes: nodes.collect(),
1250 ty: g.ty,
1251 },
1252 free_node: NodeIndex::end(),
1253 free_edge: EdgeIndex::end(),
1254 }
1255 }
1256}
1257
1258impl<N, E, Ty, Ix> From<StableGraph<N, E, Ty, Ix>> for Graph<N, E, Ty, Ix>
1269where
1270 Ty: EdgeType,
1271 Ix: IndexType,
1272{
1273 fn from(graph: StableGraph<N, E, Ty, Ix>) -> Self {
1274 let mut result_g = Graph::with_capacity(graph.node_count(), graph.edge_count());
1275 let mut node_index_map = vec![NodeIndex::end(); graph.node_bound()];
1277
1278 for (i, node) in enumerate(graph.g.nodes) {
1279 if let Some(nw) = node.weight {
1280 node_index_map[i] = result_g.add_node(nw);
1281 }
1282 }
1283 for edge in graph.g.edges {
1284 let source_index = edge.source().index();
1285 let target_index = edge.target().index();
1286 if let Some(ew) = edge.weight {
1287 let source = node_index_map[source_index];
1288 let target = node_index_map[target_index];
1289 debug_assert!(source != NodeIndex::end());
1290 debug_assert!(target != NodeIndex::end());
1291 result_g.add_edge(source, target, ew);
1292 }
1293 }
1294 result_g
1295 }
1296}
1297
1298#[derive(Debug, Clone)]
1300pub struct NodeReferences<'a, N: 'a, Ix: IndexType = DefaultIx> {
1301 iter: iter::Enumerate<slice::Iter<'a, Node<Option<N>, Ix>>>,
1302}
1303
1304impl<'a, N, Ix> Iterator for NodeReferences<'a, N, Ix>
1305where
1306 Ix: IndexType,
1307{
1308 type Item = (NodeIndex<Ix>, &'a N);
1309
1310 fn next(&mut self) -> Option<Self::Item> {
1311 self.iter
1312 .ex_find_map(|(i, node)| node.weight.as_ref().map(move |w| (node_index(i), w)))
1313 }
1314
1315 fn size_hint(&self) -> (usize, Option<usize>) {
1316 let (_, hi) = self.iter.size_hint();
1317 (0, hi)
1318 }
1319}
1320
1321impl<'a, N, Ix> DoubleEndedIterator for NodeReferences<'a, N, Ix>
1322where
1323 Ix: IndexType,
1324{
1325 fn next_back(&mut self) -> Option<Self::Item> {
1326 self.iter
1327 .ex_rfind_map(|(i, node)| node.weight.as_ref().map(move |w| (node_index(i), w)))
1328 }
1329}
1330
1331#[derive(Debug)]
1333pub struct EdgeReference<'a, E: 'a, Ix = DefaultIx> {
1334 index: EdgeIndex<Ix>,
1335 node: [NodeIndex<Ix>; 2],
1336 weight: &'a E,
1337}
1338
1339impl<'a, E, Ix: IndexType> Clone for EdgeReference<'a, E, Ix> {
1340 fn clone(&self) -> Self {
1341 *self
1342 }
1343}
1344
1345impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> {}
1346
1347impl<'a, E, Ix: IndexType> PartialEq for EdgeReference<'a, E, Ix>
1348where
1349 E: PartialEq,
1350{
1351 fn eq(&self, rhs: &Self) -> bool {
1352 self.index == rhs.index && self.weight == rhs.weight
1353 }
1354}
1355
1356impl<'a, Ix, E> EdgeReference<'a, E, Ix>
1357where
1358 Ix: IndexType,
1359{
1360 pub fn weight(&self) -> &'a E {
1365 self.weight
1366 }
1367}
1368
1369#[derive(Debug, Clone)]
1371pub struct Edges<'a, E: 'a, Ty, Ix: 'a = DefaultIx>
1372where
1373 Ty: EdgeType,
1374 Ix: IndexType,
1375{
1376 skip_start: NodeIndex<Ix>,
1378 edges: &'a [Edge<Option<E>, Ix>],
1379
1380 next: [EdgeIndex<Ix>; 2],
1382
1383 direction: Direction,
1386 ty: PhantomData<Ty>,
1387}
1388
1389impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix>
1390where
1391 Ty: EdgeType,
1392 Ix: IndexType,
1393{
1394 type Item = EdgeReference<'a, E, Ix>;
1395
1396 fn next(&mut self) -> Option<Self::Item> {
1397 let (iterate_over, reverse) = if Ty::is_directed() {
1407 (Some(self.direction), None)
1408 } else {
1409 (None, Some(self.direction.opposite()))
1410 };
1411
1412 if iterate_over.unwrap_or(Outgoing) == Outgoing {
1413 let i = self.next[0].index();
1414 if let Some(Edge {
1415 node,
1416 weight: Some(weight),
1417 next,
1418 }) = self.edges.get(i)
1419 {
1420 self.next[0] = next[0];
1421 return Some(EdgeReference {
1422 index: edge_index(i),
1423 node: if reverse == Some(Outgoing) {
1424 swap_pair(*node)
1425 } else {
1426 *node
1427 },
1428 weight,
1429 });
1430 }
1431 }
1432
1433 if iterate_over.unwrap_or(Incoming) == Incoming {
1434 while let Some(Edge { node, weight, next }) = self.edges.get(self.next[1].index()) {
1435 debug_assert!(weight.is_some());
1436 let edge_index = self.next[1];
1437 self.next[1] = next[1];
1438 if iterate_over.is_none() && node[0] == self.skip_start {
1441 continue;
1442 }
1443
1444 return Some(EdgeReference {
1445 index: edge_index,
1446 node: if reverse == Some(Incoming) {
1447 swap_pair(*node)
1448 } else {
1449 *node
1450 },
1451 weight: weight.as_ref().unwrap(),
1452 });
1453 }
1454 }
1455
1456 None
1457 }
1458}
1459
1460#[derive(Debug, Clone)]
1462pub struct EdgesConnecting<'a, E: 'a, Ty, Ix: 'a = DefaultIx>
1463where
1464 Ty: EdgeType,
1465 Ix: IndexType,
1466{
1467 target_node: NodeIndex<Ix>,
1468 edges: Edges<'a, E, Ty, Ix>,
1469 ty: PhantomData<Ty>,
1470}
1471
1472impl<'a, E, Ty, Ix> Iterator for EdgesConnecting<'a, E, Ty, Ix>
1473where
1474 Ty: EdgeType,
1475 Ix: IndexType,
1476{
1477 type Item = EdgeReference<'a, E, Ix>;
1478
1479 fn next(&mut self) -> Option<EdgeReference<'a, E, Ix>> {
1480 let target_node = self.target_node;
1481 self.edges
1482 .by_ref()
1483 .find(|&edge| edge.node[1] == target_node)
1484 }
1485 fn size_hint(&self) -> (usize, Option<usize>) {
1486 let (_, upper) = self.edges.size_hint();
1487 (0, upper)
1488 }
1489}
1490
1491fn swap_pair<T>(mut x: [T; 2]) -> [T; 2] {
1492 x.swap(0, 1);
1493 x
1494}
1495
1496#[derive(Debug, Clone)]
1498pub struct EdgeReferences<'a, E: 'a, Ix: 'a = DefaultIx> {
1499 iter: iter::Enumerate<slice::Iter<'a, Edge<Option<E>, Ix>>>,
1500}
1501
1502impl<'a, E, Ix> Iterator for EdgeReferences<'a, E, Ix>
1503where
1504 Ix: IndexType,
1505{
1506 type Item = EdgeReference<'a, E, Ix>;
1507
1508 fn next(&mut self) -> Option<Self::Item> {
1509 self.iter.ex_find_map(|(i, edge)| {
1510 edge.weight.as_ref().map(move |weight| EdgeReference {
1511 index: edge_index(i),
1512 node: edge.node,
1513 weight,
1514 })
1515 })
1516 }
1517}
1518
1519impl<'a, E, Ix> DoubleEndedIterator for EdgeReferences<'a, E, Ix>
1520where
1521 Ix: IndexType,
1522{
1523 fn next_back(&mut self) -> Option<Self::Item> {
1524 self.iter.ex_rfind_map(|(i, edge)| {
1525 edge.weight.as_ref().map(move |weight| EdgeReference {
1526 index: edge_index(i),
1527 node: edge.node,
1528 weight,
1529 })
1530 })
1531 }
1532}
1533
1534#[derive(Debug, Clone)]
1536pub struct Externals<'a, N: 'a, Ty, Ix: IndexType = DefaultIx> {
1537 iter: iter::Enumerate<slice::Iter<'a, Node<Option<N>, Ix>>>,
1538 dir: Direction,
1539 ty: PhantomData<Ty>,
1540}
1541
1542impl<'a, N: 'a, Ty, Ix> Iterator for Externals<'a, N, Ty, Ix>
1543where
1544 Ty: EdgeType,
1545 Ix: IndexType,
1546{
1547 type Item = NodeIndex<Ix>;
1548 fn next(&mut self) -> Option<NodeIndex<Ix>> {
1549 let k = self.dir.index();
1550 loop {
1551 match self.iter.next() {
1552 None => return None,
1553 Some((index, node)) => {
1554 if node.weight.is_some()
1555 && node.next[k] == EdgeIndex::end()
1556 && (Ty::is_directed() || node.next[1 - k] == EdgeIndex::end())
1557 {
1558 return Some(NodeIndex::new(index));
1559 } else {
1560 continue;
1561 }
1562 }
1563 }
1564 }
1565 }
1566 fn size_hint(&self) -> (usize, Option<usize>) {
1567 let (_, upper) = self.iter.size_hint();
1568 (0, upper)
1569 }
1570}
1571
1572#[derive(Debug, Clone)]
1576pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx> {
1577 skip_start: NodeIndex<Ix>,
1579 edges: &'a [Edge<Option<E>, Ix>],
1580 next: [EdgeIndex<Ix>; 2],
1581}
1582
1583impl<'a, E, Ix> Neighbors<'a, E, Ix>
1584where
1585 Ix: IndexType,
1586{
1587 pub fn detach(&self) -> WalkNeighbors<Ix> {
1593 WalkNeighbors {
1594 inner: super::WalkNeighbors {
1595 skip_start: self.skip_start,
1596 next: self.next,
1597 },
1598 }
1599 }
1600}
1601
1602impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix>
1603where
1604 Ix: IndexType,
1605{
1606 type Item = NodeIndex<Ix>;
1607
1608 fn next(&mut self) -> Option<NodeIndex<Ix>> {
1609 match self.edges.get(self.next[0].index()) {
1611 None => {}
1612 Some(edge) => {
1613 debug_assert!(edge.weight.is_some());
1614 self.next[0] = edge.next[0];
1615 return Some(edge.node[1]);
1616 }
1617 }
1618 while let Some(edge) = self.edges.get(self.next[1].index()) {
1623 debug_assert!(edge.weight.is_some());
1624 self.next[1] = edge.next[1];
1625 if edge.node[0] != self.skip_start {
1626 return Some(edge.node[0]);
1627 }
1628 }
1629 None
1630 }
1631}
1632
1633pub struct WalkNeighbors<Ix> {
1670 inner: super::WalkNeighbors<Ix>,
1671}
1672
1673impl<Ix: IndexType> Clone for WalkNeighbors<Ix> {
1674 clone_fields!(WalkNeighbors, inner);
1675}
1676
1677impl<Ix: IndexType> WalkNeighbors<Ix> {
1678 pub fn next<N, E, Ty: EdgeType>(
1685 &mut self,
1686 g: &StableGraph<N, E, Ty, Ix>,
1687 ) -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> {
1688 self.inner.next(&g.g)
1689 }
1690
1691 pub fn next_node<N, E, Ty: EdgeType>(
1692 &mut self,
1693 g: &StableGraph<N, E, Ty, Ix>,
1694 ) -> Option<NodeIndex<Ix>> {
1695 self.next(g).map(|t| t.1)
1696 }
1697
1698 pub fn next_edge<N, E, Ty: EdgeType>(
1699 &mut self,
1700 g: &StableGraph<N, E, Ty, Ix>,
1701 ) -> Option<EdgeIndex<Ix>> {
1702 self.next(g).map(|t| t.0)
1703 }
1704}
1705
1706#[derive(Debug, Clone)]
1708pub struct NodeIndices<'a, N: 'a, Ix: 'a = DefaultIx> {
1709 iter: iter::Enumerate<slice::Iter<'a, Node<Option<N>, Ix>>>,
1710}
1711
1712impl<'a, N, Ix: IndexType> Iterator for NodeIndices<'a, N, Ix> {
1713 type Item = NodeIndex<Ix>;
1714
1715 fn next(&mut self) -> Option<Self::Item> {
1716 self.iter.ex_find_map(|(i, node)| {
1717 if node.weight.is_some() {
1718 Some(node_index(i))
1719 } else {
1720 None
1721 }
1722 })
1723 }
1724 fn size_hint(&self) -> (usize, Option<usize>) {
1725 let (_, upper) = self.iter.size_hint();
1726 (0, upper)
1727 }
1728}
1729
1730impl<'a, N, Ix: IndexType> DoubleEndedIterator for NodeIndices<'a, N, Ix> {
1731 fn next_back(&mut self) -> Option<Self::Item> {
1732 self.iter.ex_rfind_map(|(i, node)| {
1733 if node.weight.is_some() {
1734 Some(node_index(i))
1735 } else {
1736 None
1737 }
1738 })
1739 }
1740}
1741
1742#[derive(Debug, Clone)]
1744pub struct EdgeIndices<'a, E: 'a, Ix: 'a = DefaultIx> {
1745 iter: iter::Enumerate<slice::Iter<'a, Edge<Option<E>, Ix>>>,
1746}
1747
1748impl<'a, E, Ix: IndexType> Iterator for EdgeIndices<'a, E, Ix> {
1749 type Item = EdgeIndex<Ix>;
1750
1751 fn next(&mut self) -> Option<Self::Item> {
1752 self.iter.ex_find_map(|(i, node)| {
1753 if node.weight.is_some() {
1754 Some(edge_index(i))
1755 } else {
1756 None
1757 }
1758 })
1759 }
1760 fn size_hint(&self) -> (usize, Option<usize>) {
1761 let (_, upper) = self.iter.size_hint();
1762 (0, upper)
1763 }
1764}
1765
1766impl<'a, E, Ix: IndexType> DoubleEndedIterator for EdgeIndices<'a, E, Ix> {
1767 fn next_back(&mut self) -> Option<Self::Item> {
1768 self.iter.ex_rfind_map(|(i, node)| {
1769 if node.weight.is_some() {
1770 Some(edge_index(i))
1771 } else {
1772 None
1773 }
1774 })
1775 }
1776}
1777
1778impl<N, E, Ty, Ix> visit::GraphBase for StableGraph<N, E, Ty, Ix>
1779where
1780 Ix: IndexType,
1781{
1782 type NodeId = NodeIndex<Ix>;
1783 type EdgeId = EdgeIndex<Ix>;
1784}
1785
1786impl<N, E, Ty, Ix> visit::Visitable for StableGraph<N, E, Ty, Ix>
1787where
1788 Ty: EdgeType,
1789 Ix: IndexType,
1790{
1791 type Map = FixedBitSet;
1792 fn visit_map(&self) -> FixedBitSet {
1793 FixedBitSet::with_capacity(self.node_bound())
1794 }
1795 fn reset_map(&self, map: &mut Self::Map) {
1796 map.clear();
1797 map.grow(self.node_bound());
1798 }
1799}
1800
1801impl<N, E, Ty, Ix> visit::Data for StableGraph<N, E, Ty, Ix>
1802where
1803 Ty: EdgeType,
1804 Ix: IndexType,
1805{
1806 type NodeWeight = N;
1807 type EdgeWeight = E;
1808}
1809
1810impl<N, E, Ty, Ix> visit::GraphProp for StableGraph<N, E, Ty, Ix>
1811where
1812 Ty: EdgeType,
1813 Ix: IndexType,
1814{
1815 type EdgeType = Ty;
1816}
1817
1818impl<'a, N, E: 'a, Ty, Ix> visit::IntoNodeIdentifiers for &'a StableGraph<N, E, Ty, Ix>
1819where
1820 Ty: EdgeType,
1821 Ix: IndexType,
1822{
1823 type NodeIdentifiers = NodeIndices<'a, N, Ix>;
1824 fn node_identifiers(self) -> Self::NodeIdentifiers {
1825 StableGraph::node_indices(self)
1826 }
1827}
1828
1829impl<N, E, Ty, Ix> visit::NodeCount for StableGraph<N, E, Ty, Ix>
1830where
1831 Ty: EdgeType,
1832 Ix: IndexType,
1833{
1834 fn node_count(&self) -> usize {
1835 self.node_count()
1836 }
1837}
1838
1839impl<'a, N, E, Ty, Ix> visit::IntoNodeReferences for &'a StableGraph<N, E, Ty, Ix>
1840where
1841 Ty: EdgeType,
1842 Ix: IndexType,
1843{
1844 type NodeRef = (NodeIndex<Ix>, &'a N);
1845 type NodeReferences = NodeReferences<'a, N, Ix>;
1846 fn node_references(self) -> Self::NodeReferences {
1847 NodeReferences {
1848 iter: enumerate(self.raw_nodes()),
1849 }
1850 }
1851}
1852
1853impl<N, E, Ty, Ix> visit::NodeIndexable for StableGraph<N, E, Ty, Ix>
1854where
1855 Ty: EdgeType,
1856 Ix: IndexType,
1857{
1858 fn node_bound(&self) -> usize {
1860 self.node_indices().next_back().map_or(0, |i| i.index() + 1)
1861 }
1862 fn to_index(&self, ix: NodeIndex<Ix>) -> usize {
1863 ix.index()
1864 }
1865 fn from_index(&self, ix: usize) -> Self::NodeId {
1866 NodeIndex::new(ix)
1867 }
1868}
1869
1870impl<'a, N, E: 'a, Ty, Ix> visit::IntoNeighbors for &'a StableGraph<N, E, Ty, Ix>
1871where
1872 Ty: EdgeType,
1873 Ix: IndexType,
1874{
1875 type Neighbors = Neighbors<'a, E, Ix>;
1876 fn neighbors(self, n: Self::NodeId) -> Self::Neighbors {
1877 (*self).neighbors(n)
1878 }
1879}
1880
1881impl<'a, N, E: 'a, Ty, Ix> visit::IntoNeighborsDirected for &'a StableGraph<N, E, Ty, Ix>
1882where
1883 Ty: EdgeType,
1884 Ix: IndexType,
1885{
1886 type NeighborsDirected = Neighbors<'a, E, Ix>;
1887 fn neighbors_directed(self, n: NodeIndex<Ix>, d: Direction) -> Self::NeighborsDirected {
1888 StableGraph::neighbors_directed(self, n, d)
1889 }
1890}
1891
1892impl<'a, N, E, Ty, Ix> visit::IntoEdges for &'a StableGraph<N, E, Ty, Ix>
1893where
1894 Ty: EdgeType,
1895 Ix: IndexType,
1896{
1897 type Edges = Edges<'a, E, Ty, Ix>;
1898 fn edges(self, a: Self::NodeId) -> Self::Edges {
1899 self.edges(a)
1900 }
1901}
1902
1903impl<'a, Ix, E> visit::EdgeRef for EdgeReference<'a, E, Ix>
1904where
1905 Ix: IndexType,
1906{
1907 type NodeId = NodeIndex<Ix>;
1908 type EdgeId = EdgeIndex<Ix>;
1909 type Weight = E;
1910
1911 fn source(&self) -> Self::NodeId {
1912 self.node[0]
1913 }
1914 fn target(&self) -> Self::NodeId {
1915 self.node[1]
1916 }
1917 fn weight(&self) -> &E {
1918 self.weight
1919 }
1920 fn id(&self) -> Self::EdgeId {
1921 self.index
1922 }
1923}
1924
1925impl<N, E, Ty, Ix> visit::EdgeIndexable for StableGraph<N, E, Ty, Ix>
1926where
1927 Ty: EdgeType,
1928 Ix: IndexType,
1929{
1930 fn edge_bound(&self) -> usize {
1931 self.edge_references()
1932 .next_back()
1933 .map_or(0, |edge| edge.id().index() + 1)
1934 }
1935
1936 fn to_index(&self, ix: EdgeIndex<Ix>) -> usize {
1937 ix.index()
1938 }
1939
1940 fn from_index(&self, ix: usize) -> Self::EdgeId {
1941 EdgeIndex::new(ix)
1942 }
1943}
1944
1945impl<'a, N, E, Ty, Ix> visit::IntoEdgesDirected for &'a StableGraph<N, E, Ty, Ix>
1946where
1947 Ty: EdgeType,
1948 Ix: IndexType,
1949{
1950 type EdgesDirected = Edges<'a, E, Ty, Ix>;
1951 fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected {
1952 self.edges_directed(a, dir)
1953 }
1954}
1955
1956impl<'a, N: 'a, E: 'a, Ty, Ix> visit::IntoEdgeReferences for &'a StableGraph<N, E, Ty, Ix>
1957where
1958 Ty: EdgeType,
1959 Ix: IndexType,
1960{
1961 type EdgeRef = EdgeReference<'a, E, Ix>;
1962 type EdgeReferences = EdgeReferences<'a, E, Ix>;
1963
1964 fn edge_references(self) -> Self::EdgeReferences {
1968 EdgeReferences {
1969 iter: self.g.edges.iter().enumerate(),
1970 }
1971 }
1972}
1973
1974impl<N, E, Ty, Ix> visit::EdgeCount for StableGraph<N, E, Ty, Ix>
1975where
1976 Ty: EdgeType,
1977 Ix: IndexType,
1978{
1979 #[inline]
1980 fn edge_count(&self) -> usize {
1981 self.edge_count()
1982 }
1983}
1984
1985#[test]
1986fn stable_graph() {
1987 let mut gr = StableGraph::<_, _>::with_capacity(0, 0);
1988 let a = gr.add_node(0);
1989 let b = gr.add_node(1);
1990 let c = gr.add_node(2);
1991 let _ed = gr.add_edge(a, b, 1);
1992 println!("{:?}", gr);
1993 gr.remove_node(b);
1994 println!("{:?}", gr);
1995 let d = gr.add_node(3);
1996 println!("{:?}", gr);
1997 gr.check_free_lists();
1998 gr.remove_node(a);
1999 gr.check_free_lists();
2000 gr.remove_node(c);
2001 gr.check_free_lists();
2002 println!("{:?}", gr);
2003 gr.add_edge(d, d, 2);
2004 println!("{:?}", gr);
2005
2006 let e = gr.add_node(4);
2007 gr.add_edge(d, e, 3);
2008 println!("{:?}", gr);
2009 for neigh in gr.neighbors(d) {
2010 println!("edge {:?} -> {:?}", d, neigh);
2011 }
2012 gr.check_free_lists();
2013}
2014
2015#[test]
2016fn dfs() {
2017 use crate::visit::Dfs;
2018
2019 let mut gr = StableGraph::<_, _>::with_capacity(0, 0);
2020 let a = gr.add_node("a");
2021 let b = gr.add_node("b");
2022 let c = gr.add_node("c");
2023 let d = gr.add_node("d");
2024 gr.add_edge(a, b, 1);
2025 gr.add_edge(a, c, 2);
2026 gr.add_edge(b, c, 3);
2027 gr.add_edge(b, d, 4);
2028 gr.add_edge(c, d, 5);
2029 gr.add_edge(d, b, 6);
2030 gr.add_edge(c, b, 7);
2031 println!("{:?}", gr);
2032
2033 let mut dfs = Dfs::new(&gr, a);
2034 while let Some(next) = dfs.next(&gr) {
2035 println!("dfs visit => {:?}, weight={:?}", next, &gr[next]);
2036 }
2037}
2038
2039#[test]
2040fn test_retain_nodes() {
2041 let mut gr = StableGraph::<_, _>::with_capacity(6, 6);
2042 let a = gr.add_node("a");
2043 let f = gr.add_node("f");
2044 let b = gr.add_node("b");
2045 let c = gr.add_node("c");
2046 let d = gr.add_node("d");
2047 let e = gr.add_node("e");
2048 gr.add_edge(a, b, 1);
2049 gr.add_edge(a, c, 2);
2050 gr.add_edge(b, c, 3);
2051 gr.add_edge(b, d, 4);
2052 gr.add_edge(c, d, 5);
2053 gr.add_edge(d, b, 6);
2054 gr.add_edge(c, b, 7);
2055 gr.add_edge(d, e, 8);
2056 gr.remove_node(f);
2057
2058 assert_eq!(gr.node_count(), 5);
2059 assert_eq!(gr.edge_count(), 8);
2060 gr.retain_nodes(|frozen_gr, ix| frozen_gr[ix] >= "c");
2061 assert_eq!(gr.node_count(), 3);
2062 assert_eq!(gr.edge_count(), 2);
2063
2064 gr.check_free_lists();
2065}
2066
2067#[test]
2068fn extend_with_edges() {
2069 let mut gr = StableGraph::<_, _>::default();
2070 let a = gr.add_node("a");
2071 let b = gr.add_node("b");
2072 let c = gr.add_node("c");
2073 let _d = gr.add_node("d");
2074 gr.remove_node(a);
2075 gr.remove_node(b);
2076 gr.remove_node(c);
2077
2078 gr.extend_with_edges(vec![(0, 1, ())]);
2079 assert_eq!(gr.node_count(), 3);
2080 assert_eq!(gr.edge_count(), 1);
2081 gr.check_free_lists();
2082
2083 gr.extend_with_edges(vec![(5, 1, ())]);
2084 assert_eq!(gr.node_count(), 4);
2085 assert_eq!(gr.edge_count(), 2);
2086 gr.check_free_lists();
2087}
2088
2089#[test]
2090fn test_reverse() {
2091 let mut gr = StableGraph::<_, _>::default();
2092 let a = gr.add_node("a");
2093 let b = gr.add_node("b");
2094
2095 gr.add_edge(a, b, 0);
2096
2097 let mut reversed_gr = gr.clone();
2098 reversed_gr.reverse();
2099
2100 for i in gr.node_indices() {
2101 itertools::assert_equal(gr.edges_directed(i, Incoming), reversed_gr.edges(i));
2102 }
2103}