use rs_graph::classes;
use rs_graph::linkedlistgraph::*;
use rs_graph::traits::*;
use rs_graph_derive::Graph;
use std::marker::PhantomData;
#[derive(Graph)]
struct MyGraph<'a, I> {
#[graph]
graph: LinkedListGraph, balances: Vec<I>,
bounds: Vec<I>,
phantom: PhantomData<&'a I>,
}
impl<'a, T> From<LinkedListGraph> for MyGraph<'a, T>
where
T: Default + Clone,
{
fn from(g: LinkedListGraph) -> MyGraph<'a, T> {
let n = g.num_nodes();
let m = g.num_edges();
MyGraph {
graph: g,
balances: vec![T::default(); n],
bounds: vec![T::default(); m],
phantom: PhantomData,
}
}
}
impl<'a, T> MyGraph<'a, T> {
fn balance_mut(&mut self, u: Node) -> &mut T {
&mut self.balances[self.graph.node_id(u)]
}
fn bound_mut(&mut self, e: Edge) -> &mut T {
&mut self.bounds[self.graph.edge_id(e)]
}
}
#[test]
fn test_simple() -> Result<(), Box<dyn std::error::Error>> {
let mut g: MyGraph<f64> = classes::path::<LinkedListGraph>(5).into();
let (s, t) = (g.id2node(0), g.id2node(4));
*g.balance_mut(s) = 1.0;
*g.balance_mut(t) = -1.0;
for eid in 0..g.num_edges() {
*g.bound_mut(g.id2edge(eid)) = eid as f64;
}
Ok(())
}