From f8d75ee7fa188bb6169108e95d18fea038a30ace Mon Sep 17 00:00:00 2001 From: sigil-03 Date: Fri, 23 May 2025 22:29:47 -0600 Subject: [PATCH] add SimpleVertex SimpleEdge SimpleGraph plus connection test --- src/graph.rs | 8 +++--- src/test.rs | 70 ++++++++++++++++++++++++++------------------------- src/vertex.rs | 4 ++- 3 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/graph.rs b/src/graph.rs index 8e03c00..1fef4ea 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -6,11 +6,13 @@ pub trait Graph { // Connect two nodes, and return the edge // 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(vertex_1: &V, vertex_2: &V) -> E; + fn connect(&mut self, vertex_1: V::HANDLE, vertex_2: V::HANDLE); // 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); // get the degree of a given vertex - possibly put this in a GraphUtil trait? - fn degree(vertex: V) -> usize; + fn degree(vertex: V::HANDLE) -> usize; } diff --git a/src/test.rs b/src/test.rs index 027e68b..9ba1e2c 100644 --- a/src/test.rs +++ b/src/test.rs @@ -2,44 +2,49 @@ use std::marker::PhantomData; use crate::{edge::Edge, graph::Graph, vertex::Vertex}; -struct TestEdge<'a> { - v1: &'a TestVertex<'a>, - v2: &'a TestVertex<'a>, +struct SimpleEdge { + id: usize, + v1: usize, + v2: usize, } -impl<'a> Edge for TestEdge<'a> {} +impl Edge for SimpleEdge {} -struct TestVertex<'a> { - _phantom: PhantomData<&'a Self>, +struct SimpleVertex { + id: usize, } -impl<'a> Vertex for TestVertex<'a> {} - -struct TestGraph<'a> { - vertices: Vec>, - edges: Vec>, -} - -impl<'a> TestGraph<'a> { - pub fn get_vertex(&self, index: usize) -> &TestVertex { - assert!(index < self.vertices.len()); - &self.vertices[index] +impl SimpleVertex { + pub fn get_id(&self) -> usize { + self.id.clone() } } -impl<'a> Graph, TestEdge<'a>> for TestGraph<'a> { - fn connect(vertex_1: &TestVertex<'a>, vertex_2: &TestVertex<'a>) -> TestEdge<'a> { - TestEdge { +impl Vertex for SimpleVertex { + type HANDLE = usize; +} + +struct SimpleGraph { + vertices: Vec, + edges: Vec, +} + +impl SimpleGraph {} + +impl<'a> Graph for SimpleGraph { + fn connect(&mut self, vertex_1: usize, vertex_2: usize) { + self.edges.push(SimpleEdge { + id: self.edges.len(), v1: vertex_1, v2: vertex_2, - } + }); } - fn disconnect(vertex_1: &TestVertex, vertex_2: &TestVertex) -> TestEdge<'a> { + fn disconnect(&mut self, vertex_1: usize, vertex_2: usize) { todo!(); } - fn degree(vertex: TestVertex) -> usize { + fn degree(vertex: usize) -> usize { todo!(); } } @@ -49,20 +54,17 @@ fn it_works() {} #[test] fn test_connect() { - let v1 = TestVertex {}; - let v2 = TestVertex {}; - let mut g = TestGraph { + let v1 = SimpleVertex { id: 0 }; + let v2 = SimpleVertex { id: 1 }; + let mut g = SimpleGraph { vertices: vec![v1, v2], edges: Vec::new(), }; - - let v1 = g.get_vertex(0); - let v2 = g.get_vertex(1); - // TODO: because g is immutable borrowed above, the trait can't have a &mut self here, which leads to this - // not so great syntax. but maybe that's OK because since this is a trait library, we don't care about the - // overall implementation, and the graph class might not store the edge... but it does still feel like - // the graph has changed... but idk. - let e: TestEdge = TestGraph::connect(v1, v2); + 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); } #[test] diff --git a/src/vertex.rs b/src/vertex.rs index 5284304..9ad334b 100644 --- a/src/vertex.rs +++ b/src/vertex.rs @@ -1 +1,3 @@ -pub trait Vertex {} +pub trait Vertex { + type HANDLE; +}