toolbox_rs/
edge.rs

1use bincode::{Decode, Encode};
2
3use crate::graph::NodeID;
4use core::mem::swap;
5
6pub trait Edge {
7    type ID;
8    fn source(&self) -> Self::ID;
9    fn target(&self) -> Self::ID;
10}
11
12pub trait EdgeData {
13    type DATA;
14    fn data(&self) -> &Self::DATA;
15}
16
17pub trait EdgeWithData: Edge<ID = usize> + EdgeData<DATA = i32> {}
18impl EdgeWithData for InputEdge<i32> {}
19
20#[derive(Clone, Copy, Debug, bincode::Decode, bincode::Encode)]
21pub struct TrivialEdge {
22    pub source: usize,
23    pub target: usize,
24}
25
26impl Edge for TrivialEdge {
27    type ID = NodeID;
28    fn source(&self) -> Self::ID {
29        self.source
30    }
31    fn target(&self) -> Self::ID {
32        self.target
33    }
34}
35
36#[derive(Clone, Copy, Debug, Default, Eq, PartialOrd, Ord, PartialEq, Decode, Encode)]
37pub struct InputEdge<EdgeDataT: Eq> {
38    pub source: NodeID,
39    pub target: NodeID,
40    pub data: EdgeDataT,
41}
42
43impl<EdgeDataT: std::cmp::Eq> Edge for InputEdge<EdgeDataT> {
44    type ID = NodeID;
45    fn source(&self) -> Self::ID {
46        self.source
47    }
48    fn target(&self) -> Self::ID {
49        self.target
50    }
51}
52
53impl<EdgeDataT: std::cmp::Eq> EdgeData for InputEdge<EdgeDataT> {
54    type DATA = EdgeDataT;
55    fn data(&self) -> &Self::DATA {
56        &self.data
57    }
58}
59
60impl<EdgeDataT: Eq> InputEdge<EdgeDataT> {
61    pub fn new(source: NodeID, target: NodeID, data: EdgeDataT) -> Self {
62        Self {
63            source,
64            target,
65            data,
66        }
67    }
68
69    pub fn is_parallel_to(&self, other: &Self) -> bool {
70        self.source == other.source && self.target == other.target
71    }
72
73    pub fn reverse(&mut self) {
74        swap(&mut self.source, &mut self.target);
75    }
76}
77pub type SimpleEdge = InputEdge<u32>;
78
79#[test]
80fn simple_edge_parallel() {
81    let edge1 = SimpleEdge::new(1, 2, 3);
82    let edge2 = SimpleEdge::new(1, 2, 6);
83
84    assert!(edge1.is_parallel_to(&edge1));
85    assert!(edge1.is_parallel_to(&edge2));
86    assert!(edge2.is_parallel_to(&edge1));
87    assert!(edge2.is_parallel_to(&edge2));
88}
89
90#[test]
91fn trivial_edge_accessor() {
92    let edge = TrivialEdge {
93        source: 1,
94        target: 2,
95    };
96
97    assert_eq!(edge.source(), 1);
98    assert_eq!(edge.target(), 2);
99}