From 81bee2f7698b92a06716d5604a43f87a4e796724 Mon Sep 17 00:00:00 2001 From: sigil-03 Date: Tue, 20 May 2025 23:18:38 -0600 Subject: [PATCH] WIP: working on test graph traits and stuck on lifetimes --- .gitignore | 1 + Cargo.lock | 7 +++++ Cargo.toml | 6 ++++ src/edge.rs | 1 + src/graph.rs | 16 +++++++++++ src/lib.rs | 6 ++++ src/test.rs | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/vertex.rs | 1 + 8 files changed, 114 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/edge.rs create mode 100644 src/graph.rs create mode 100644 src/lib.rs create mode 100644 src/test.rs create mode 100644 src/vertex.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..b36dca9 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "graph-rs" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..42133f6 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "graph-rs" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/src/edge.rs b/src/edge.rs new file mode 100644 index 0000000..6b2615d --- /dev/null +++ b/src/edge.rs @@ -0,0 +1 @@ +pub trait Edge {} diff --git a/src/graph.rs b/src/graph.rs new file mode 100644 index 0000000..8e03c00 --- /dev/null +++ b/src/graph.rs @@ -0,0 +1,16 @@ +use crate::edge::Edge; +use crate::vertex::Vertex; + +/// operations you might want to do on a graph or on nodes in a graph +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; + + // disconnect two nodes, and return the old edge + fn disconnect(vertex_1: &V, vertex_2: &V) -> E; + + // get the degree of a given vertex - possibly put this in a GraphUtil trait? + fn degree(vertex: V) -> usize; +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..b92411d --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,6 @@ +mod edge; +mod graph; +mod vertex; + +#[cfg(test)] +mod test; diff --git a/src/test.rs b/src/test.rs new file mode 100644 index 0000000..027e68b --- /dev/null +++ b/src/test.rs @@ -0,0 +1,76 @@ +use std::marker::PhantomData; + +use crate::{edge::Edge, graph::Graph, vertex::Vertex}; + +struct TestEdge<'a> { + v1: &'a TestVertex<'a>, + v2: &'a TestVertex<'a>, +} + +impl<'a> Edge for TestEdge<'a> {} + +struct TestVertex<'a> { + _phantom: PhantomData<&'a Self>, +} + +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<'a> Graph, TestEdge<'a>> for TestGraph<'a> { + fn connect(vertex_1: &TestVertex<'a>, vertex_2: &TestVertex<'a>) -> TestEdge<'a> { + TestEdge { + v1: vertex_1, + v2: vertex_2, + } + } + + fn disconnect(vertex_1: &TestVertex, vertex_2: &TestVertex) -> TestEdge<'a> { + todo!(); + } + + fn degree(vertex: TestVertex) -> usize { + todo!(); + } +} + +#[test] +fn it_works() {} + +#[test] +fn test_connect() { + let v1 = TestVertex {}; + let v2 = TestVertex {}; + let mut g = TestGraph { + 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); +} + +#[test] +fn test_disconnect() { + todo!(); +} + +#[test] +fn test_degree() { + todo!() +} diff --git a/src/vertex.rs b/src/vertex.rs new file mode 100644 index 0000000..5284304 --- /dev/null +++ b/src/vertex.rs @@ -0,0 +1 @@ +pub trait Vertex {}