49 lines
1 KiB
Rust
49 lines
1 KiB
Rust
pub mod adjacency_list;
|
|
pub mod shortest_path;
|
|
|
|
pub trait WheightedGraph: Sized {
|
|
type Node;
|
|
fn num_edges(&self, node: &Self::Node) -> usize {
|
|
self.edge_iter(node).count()
|
|
}
|
|
|
|
fn edge(&self, node: &Self::Node, num: usize) -> Option<(Self::Node, f64)>;
|
|
|
|
fn edge_iter<'a, 'b>(&'a self, node: &'b Self::Node) -> WheightedGraphEdgeIter<'a, 'b, Self> {
|
|
WheightedGraphEdgeIter::new(self, node)
|
|
}
|
|
}
|
|
|
|
pub struct WheightedGraphEdgeIter<'a, 'b, G>
|
|
where
|
|
G: WheightedGraph,
|
|
{
|
|
graph: &'a G,
|
|
node: &'b G::Node,
|
|
count: usize,
|
|
}
|
|
|
|
impl<'a, 'b, G> WheightedGraphEdgeIter<'a, 'b, G>
|
|
where
|
|
G: WheightedGraph,
|
|
{
|
|
pub fn new(graph: &'a G, node: &'b G::Node) -> Self {
|
|
Self {
|
|
graph,
|
|
node,
|
|
count: 0,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<'a, 'b, G> Iterator for WheightedGraphEdgeIter<'a, 'b, G>
|
|
where
|
|
G: WheightedGraph,
|
|
{
|
|
type Item = (G::Node, f64);
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
self.count += 1;
|
|
self.graph.edge(self.node, self.count - 1)
|
|
}
|
|
}
|