diff --git a/src/edge.rs b/src/edge.rs index 6b2615d..4ddd0ce 100644 --- a/src/edge.rs +++ b/src/edge.rs @@ -1 +1,3 @@ -pub trait Edge {} +pub trait Edge { + type HANDLE; +} diff --git a/src/graph.rs b/src/graph.rs index 1fef4ea..c98238e 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -7,11 +7,11 @@ pub trait Graph { // TODO: figure out a way to modify self? is that even needed? // same for `disconnect()` // fn connect(vertex_1: &V, vertex_2: &V) -> E; - fn connect(&mut self, vertex_1: V::HANDLE, vertex_2: V::HANDLE); + fn connect(&mut self, vertex_1: V::HANDLE, vertex_2: V::HANDLE) -> E::HANDLE; // disconnect two nodes, and return the old edge // fn disconnect(vertex_1: &V, vertex_2: &V) -> E; - fn disconnect(&mut self, vertex_1: V::HANDLE, vertex_2: V::HANDLE); + fn disconnect(&mut self, edge: E::HANDLE); // get the degree of a given vertex - possibly put this in a GraphUtil trait? fn degree(vertex: V::HANDLE) -> usize; diff --git a/src/test.rs b/src/test.rs index 9ba1e2c..3db7551 100644 --- a/src/test.rs +++ b/src/test.rs @@ -8,7 +8,9 @@ struct SimpleEdge { v2: usize, } -impl Edge for SimpleEdge {} +impl Edge for SimpleEdge { + type HANDLE = usize; +} struct SimpleVertex { id: usize, @@ -32,16 +34,24 @@ struct SimpleGraph { impl SimpleGraph {} impl<'a> Graph for SimpleGraph { - fn connect(&mut self, vertex_1: usize, vertex_2: usize) { + fn connect(&mut self, vertex_1: usize, vertex_2: usize) -> usize { + let id = self.edges.len(); self.edges.push(SimpleEdge { - id: self.edges.len(), + id: id.clone(), v1: vertex_1, v2: vertex_2, }); + id } - fn disconnect(&mut self, vertex_1: usize, vertex_2: usize) { - todo!(); + // NOTE: this should probably be a failable function... and use a hashmap + fn disconnect(&mut self, edge: usize) { + for i in (0..self.edges.len()) { + if self.edges[i].id == edge { + self.edges.remove(i); + return; + } + } } fn degree(vertex: usize) -> usize { @@ -60,7 +70,7 @@ fn test_connect() { vertices: vec![v1, v2], edges: Vec::new(), }; - g.connect(0, 1); + let _e = g.connect(0, 1); assert_eq!(g.edges.len(), 1); assert_eq!(g.edges[0].id, 0); assert_eq!(g.edges[0].v1, 0); @@ -69,7 +79,20 @@ fn test_connect() { #[test] fn test_disconnect() { - todo!(); + let v1 = SimpleVertex { id: 0 }; + let v2 = SimpleVertex { id: 1 }; + let mut g = SimpleGraph { + vertices: vec![v1, v2], + edges: Vec::new(), + }; + let e = g.connect(0, 1); + assert_eq!(g.edges.len(), 1); + assert_eq!(g.edges[0].id, 0); + assert_eq!(g.edges[0].v1, 0); + assert_eq!(g.edges[0].v2, 1); + + g.disconnect(e); + assert_eq!(g.edges.len(), 0); } #[test]