terrain_graph/
edge_attributed_directed.rs1#[derive(Clone)]
3pub struct EdgeAttributedDirectedGraph<Attr: Copy + Clone + Default> {
4 adjacency_list: Vec<Vec<(usize, Attr)>>,
5 edge_count: usize,
6}
7
8impl<Attr: Copy + Clone + Default> EdgeAttributedDirectedGraph<Attr> {
9 pub fn new(order: usize) -> Self {
11 EdgeAttributedDirectedGraph {
12 adjacency_list: vec![vec![]; order],
13 edge_count: 0,
14 }
15 }
16
17 pub fn add_edge(&mut self, v: usize, w: usize, attr: Attr) {
19 self.adjacency_list[v].push((w, attr));
20 self.edge_count += 1;
21 }
22
23 pub fn delete_edge(&mut self, v: usize, w: usize) {
25 self.adjacency_list[v].retain(|&(x, _)| x != w);
26 self.edge_count -= 1;
27 }
28
29 pub fn has_edge(&self, v: usize, w: usize) -> (bool, Attr) {
31 for &(x, attr) in self.adjacency_list[v].iter() {
32 if x == w {
33 return (true, attr);
34 }
35 }
36 (false, Default::default())
37 }
38
39 pub fn order(&self) -> usize {
41 self.adjacency_list.len()
42 }
43
44 pub fn neighbors_of(&self, v: usize) -> &Vec<(usize, Attr)> {
46 self.adjacency_list[v].as_ref()
47 }
48
49 pub fn size(&self) -> usize {
51 self.edge_count
52 }
53
54 pub fn clear(&mut self) {
56 for v in self.adjacency_list.iter_mut() {
57 v.clear();
58 }
59 self.edge_count = 0;
60 }
61
62 pub fn outdegree(&self, v: usize) -> usize {
64 self.adjacency_list[v].len()
65 }
66
67 pub fn indegree(&self, v: usize) -> usize {
71 self.adjacency_list
72 .iter()
73 .filter(|&adj| adj.iter().any(|&(x, _)| x == v))
74 .count()
75 }
76}