Merge pull request #286 from petgraph/graphmap-neighbors-directed
Include self loops in incoming edges
diff --git a/src/graphmap.rs b/src/graphmap.rs
index 8a4d97c..bb76e5e 100644
--- a/src/graphmap.rs
+++ b/src/graphmap.rs
@@ -348,6 +348,7 @@
Some(neigh) => neigh.iter(),
None => [].iter(),
},
+ start_node: a,
dir: dir,
ty: self.ty,
}
@@ -531,6 +532,7 @@
Ty: EdgeType,
{
iter: Iter<'a, (N, CompactDirection)>,
+ start_node: N,
dir: Direction,
ty: PhantomData<Ty>,
}
@@ -543,8 +545,9 @@
fn next(&mut self) -> Option<N> {
if Ty::is_directed() {
let self_dir = self.dir;
+ let start_node = self.start_node;
(&mut self.iter)
- .filter_map(move |&(n, dir)| if dir == self_dir {
+ .filter_map(move |&(n, dir)| if dir == self_dir || n == start_node {
Some(n)
} else { None })
.next()
diff --git a/tests/graphmap.rs b/tests/graphmap.rs
index 51b37e6..02362ef 100644
--- a/tests/graphmap.rs
+++ b/tests/graphmap.rs
@@ -298,4 +298,41 @@
for (start, end, weight) in graph.all_edges() {
assert_eq!((start + end) * 2, *weight);
}
-}
\ No newline at end of file
+}
+
+#[test]
+fn neighbors_incoming_includes_self_loops() {
+ let mut graph = DiGraphMap::new();
+
+ let node = graph.add_node(());
+ graph.add_edge(node, node, ());
+
+ let mut neighbors = graph.neighbors_directed(node, Incoming);
+ assert_eq!(neighbors.next(), Some(node));
+ assert_eq!(neighbors.next(), None);
+}
+
+#[test]
+fn undirected_neighbors_includes_self_loops() {
+ let mut graph = UnGraphMap::new();
+
+ let node = graph.add_node(());
+ graph.add_edge(node, node, ());
+
+ let mut neighbors = graph.neighbors(node);
+ assert_eq!(neighbors.next(), Some(node));
+ assert_eq!(neighbors.next(), None);
+}
+
+#[test]
+fn self_loops_can_be_removed() {
+ let mut graph = DiGraphMap::new();
+
+ let node = graph.add_node(());
+ graph.add_edge(node, node, ());
+
+ graph.remove_edge(node, node);
+
+ assert_eq!(graph.neighbors_directed(node, Outgoing).next(), None);
+ assert_eq!(graph.neighbors_directed(node, Incoming).next(), None);
+}