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}