diff options
Diffstat (limited to 'sem1/algo/graph')
-rw-r--r-- | sem1/algo/graph/Cargo.lock | 6 | ||||
-rw-r--r-- | sem1/algo/graph/Cargo.toml | 9 | ||||
-rw-r--r-- | sem1/algo/graph/src/graph.rs | 85 | ||||
-rw-r--r-- | sem1/algo/graph/src/main.rs | 23 |
4 files changed, 0 insertions, 123 deletions
diff --git a/sem1/algo/graph/Cargo.lock b/sem1/algo/graph/Cargo.lock deleted file mode 100644 index 74fba54..0000000 --- a/sem1/algo/graph/Cargo.lock +++ /dev/null @@ -1,6 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "graph" -version = "0.1.0" - diff --git a/sem1/algo/graph/Cargo.toml b/sem1/algo/graph/Cargo.toml deleted file mode 100644 index 896f437..0000000 --- a/sem1/algo/graph/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "graph" -version = "0.1.0" -authors = ["Julian T <julian@jtle.dk>"] -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] diff --git a/sem1/algo/graph/src/graph.rs b/sem1/algo/graph/src/graph.rs deleted file mode 100644 index cefd24f..0000000 --- a/sem1/algo/graph/src/graph.rs +++ /dev/null @@ -1,85 +0,0 @@ -use std::rc::{Rc, Weak}; -use std::cell::RefCell; -use std::vec::Vec; -use std::string::String; -use std::collections::HashMap; -use std::fmt; - -type EdgeRef = RefCell<Edge>; -type VertexRef = RefCell<Vertex>; - -pub struct Edge { - from: Weak<VertexRef>, - to: Weak<VertexRef>, - weight: i32, -} - -pub struct Vertex { - name: String, - pub adj: Vec<Rc<EdgeRef>>, -} - -pub struct Graph { - vertexes: HashMap<String, Rc<VertexRef>>, - edges: Vec<Rc<EdgeRef>>, -} - -impl Vertex { - pub fn new(name: &str) -> VertexRef { - RefCell::new( Vertex { name: String::from(name), adj: Vec::new() }) - } -} - -impl Graph { - pub fn new() -> Graph { - Graph { vertexes: HashMap::new(), edges: Vec::new() } - } - - pub fn edge(&mut self, from: &str, to: &str, weight: i32) { - let from = match self.vertexes.get(from) { - Some(rc) => Rc::clone(rc), - None => self.add_vertex(from), - }; - - let to = match self.vertexes.get(to) { - Some(rc) => Rc::clone(rc), - None => self.add_vertex(to), - }; - - // Create edge - let e = Rc::new(RefCell::new( Edge { from: Rc::downgrade(&from), to: Rc::downgrade(&to), weight } )); - - // Add to stuff - from.borrow_mut().adj.push(Rc::clone(&e)); - self.edges.push(e); - - } - - pub fn borrow_vertex(&self, name: &str) -> Option<Rc<VertexRef>> { - self.vertexes.get(name).and_then(|rc| Some(Rc::clone(rc))) - } - - fn add_vertex(&mut self, name: &str) -> Rc<VertexRef> { - let v = Rc::new( Vertex::new(name) ); - - // Insert in hashmap - self.vertexes.insert(String::from(name), Rc::clone(&v)); - - // Return vertex - v - } - -} - -impl fmt::Display for Edge { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let rc = self.to.upgrade().unwrap(); - write!(f, "{}", Rc::clone(&rc).borrow()) - } -} - -impl fmt::Display for Vertex { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.name) - } -} diff --git a/sem1/algo/graph/src/main.rs b/sem1/algo/graph/src/main.rs deleted file mode 100644 index 4f732e7..0000000 --- a/sem1/algo/graph/src/main.rs +++ /dev/null @@ -1,23 +0,0 @@ - -mod graph; - -use graph::Graph; - -fn main() { - - let mut g = Graph::new(); - - g.edge("a", "b", 10); - g.edge("a", "c", 10); - g.edge("a", "d", 10); - - // Ahh this is hard - let v = g.borrow_vertex("a").unwrap(); - let v23 = v.borrow(); - let mut it = v23.adj.iter(); - for e in it { - println!("{}", e.borrow()); - } - - println!("Hello, world!"); -} |