grafos_tools/
edge.rs

1use std::fmt::Debug;
2
3use crate::Vertice;
4
5pub trait Edge<T: PartialOrd + Debug + Debug> {
6    fn ver_a(&self) -> &Vertice<T>; // vertice a
7
8    fn ver_b(&self) -> &Vertice<T>; // vertice b
9
10    fn distance(&self) -> &usize;
11
12    fn is_loop(&self) -> bool {
13        self.ver_a() == self.ver_b()
14    }
15}
16
17/**
18# For *undirected* graphs
19
20Symmetric edges uses `ver_a` for the vertice
21with the littler id and `ver_b` for the one
22with the bigger, this is only used
23to facilitate retrieving and modifying
24values on a graph
25*/
26#[derive(PartialEq, Eq, Hash)]
27pub struct SymmetricEdge<T: PartialOrd + Debug + Debug> {
28    // The littler value
29    ver_a: Vertice<T>,
30
31    // The bigger value
32    ver_b: Vertice<T>,
33
34    distance: usize,
35}
36
37impl<T: PartialOrd + Debug + Debug> SymmetricEdge<T> {
38    pub fn new(a: Vertice<T>, b: Vertice<T>) -> Self {
39        if a.0 < b.0 {
40            Self {
41                ver_a: a,
42                ver_b: b,
43                distance: 1,
44            }
45        } else {
46            Self {
47                ver_a: b,
48                ver_b: a,
49                distance: 1,
50            }
51        }
52    }
53}
54
55impl<T: PartialOrd + Debug + Debug> Edge<T> for SymmetricEdge<T> {
56    fn ver_a(&self) -> &Vertice<T> {
57        &self.ver_a
58    }
59
60    fn ver_b(&self) -> &Vertice<T> {
61        &self.ver_b
62    }
63
64    fn distance(&self) -> &usize {
65        &self.distance
66    }
67}
68
69/**
70# For *directed* graphs
71
72Asymmetric edges uses `ver_a` for the
73*from*-vertice and `ver_b` for the
74*to*-vertice.
75
76Because this edges are one-way, paths
77can only be build from `ver_a` to `ver_b`
78
79*/
80#[derive(PartialEq, Eq, Hash)]
81pub struct AsymmetricEdge<T: PartialOrd + Debug> {
82    ver_a: Vertice<T>,
83    ver_b: Vertice<T>,
84    distance: usize,
85}
86
87impl<T: PartialOrd + Debug> AsymmetricEdge<T> {
88    pub fn new(from: Vertice<T>, to: Vertice<T>) -> Self {
89        Self {
90            ver_a: from,
91            ver_b: to,
92            distance: 1,
93        }
94    }
95
96    pub fn with_distance(distance: usize, from: Vertice<T>, to: Vertice<T>) -> Self {
97        Self {
98            ver_a: from,
99            ver_b: to,
100            distance,
101        }
102    }
103}
104
105impl<T: PartialOrd + Debug> Edge<T> for AsymmetricEdge<T> {
106    fn ver_a(&self) -> &Vertice<T> {
107        &self.ver_a
108    }
109
110    fn ver_b(&self) -> &Vertice<T> {
111        &self.ver_b
112    }
113
114    fn distance(&self) -> &usize {
115        &self.distance
116    }
117}