add disconnect function to SimpleGraph
This commit is contained in:
parent
f8d75ee7fa
commit
68b80f5b98
3 changed files with 35 additions and 10 deletions
|
|
@ -1 +1,3 @@
|
||||||
pub trait Edge {}
|
pub trait Edge {
|
||||||
|
type HANDLE;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,11 @@ pub trait Graph<V: Vertex, E: Edge> {
|
||||||
// TODO: figure out a way to modify self? is that even needed?
|
// TODO: figure out a way to modify self? is that even needed?
|
||||||
// same for `disconnect()`
|
// same for `disconnect()`
|
||||||
// fn connect(vertex_1: &V, vertex_2: &V) -> E;
|
// 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
|
// disconnect two nodes, and return the old edge
|
||||||
// fn disconnect(vertex_1: &V, vertex_2: &V) -> E;
|
// 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?
|
// get the degree of a given vertex - possibly put this in a GraphUtil trait?
|
||||||
fn degree(vertex: V::HANDLE) -> usize;
|
fn degree(vertex: V::HANDLE) -> usize;
|
||||||
|
|
|
||||||
37
src/test.rs
37
src/test.rs
|
|
@ -8,7 +8,9 @@ struct SimpleEdge {
|
||||||
v2: usize,
|
v2: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Edge for SimpleEdge {}
|
impl Edge for SimpleEdge {
|
||||||
|
type HANDLE = usize;
|
||||||
|
}
|
||||||
|
|
||||||
struct SimpleVertex {
|
struct SimpleVertex {
|
||||||
id: usize,
|
id: usize,
|
||||||
|
|
@ -32,16 +34,24 @@ struct SimpleGraph {
|
||||||
impl SimpleGraph {}
|
impl SimpleGraph {}
|
||||||
|
|
||||||
impl<'a> Graph<SimpleVertex, SimpleEdge> for SimpleGraph {
|
impl<'a> Graph<SimpleVertex, SimpleEdge> 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 {
|
self.edges.push(SimpleEdge {
|
||||||
id: self.edges.len(),
|
id: id.clone(),
|
||||||
v1: vertex_1,
|
v1: vertex_1,
|
||||||
v2: vertex_2,
|
v2: vertex_2,
|
||||||
});
|
});
|
||||||
|
id
|
||||||
}
|
}
|
||||||
|
|
||||||
fn disconnect(&mut self, vertex_1: usize, vertex_2: usize) {
|
// NOTE: this should probably be a failable function... and use a hashmap
|
||||||
todo!();
|
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 {
|
fn degree(vertex: usize) -> usize {
|
||||||
|
|
@ -60,7 +70,7 @@ fn test_connect() {
|
||||||
vertices: vec![v1, v2],
|
vertices: vec![v1, v2],
|
||||||
edges: Vec::new(),
|
edges: Vec::new(),
|
||||||
};
|
};
|
||||||
g.connect(0, 1);
|
let _e = g.connect(0, 1);
|
||||||
assert_eq!(g.edges.len(), 1);
|
assert_eq!(g.edges.len(), 1);
|
||||||
assert_eq!(g.edges[0].id, 0);
|
assert_eq!(g.edges[0].id, 0);
|
||||||
assert_eq!(g.edges[0].v1, 0);
|
assert_eq!(g.edges[0].v1, 0);
|
||||||
|
|
@ -69,7 +79,20 @@ fn test_connect() {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_disconnect() {
|
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]
|
#[test]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue