use graph::{Graph, Digraph, Network, IndexGraph, IndexNetwork};
use builder::Builder;
use std::marker::PhantomData;
pub trait WrappedGraph {
type Graph;
fn from_graph(g: Self::Graph) -> Self;
fn as_graph(&self) -> &Self::Graph;
}
pub trait WrappedGraphMut: WrappedGraph {
fn as_mut_graph(&mut self) -> &mut Self::Graph;
}
pub struct WrappedBuilder<G,B>(B, PhantomData<G>) where G: WrappedGraph;
impl<G,B> Builder for WrappedBuilder<G,B>
where G: WrappedGraph,
B: Builder<Graph=G::Graph>,
{
type Graph = G;
type Node = B::Node;
type Edge = B::Edge;
fn new() -> Self {
WrappedBuilder(B::new(), PhantomData)
}
fn with_capacities(nnodes: usize, nedges: usize) -> Self {
WrappedBuilder(B::with_capacities(nnodes, nedges), PhantomData)
}
fn reserve(&mut self, nnodes: usize, nedges: usize) {
self.0.reserve(nnodes, nedges)
}
fn add_node(&mut self) -> Self::Node {
self.0.add_node()
}
fn add_nodes(&mut self, n: usize) -> Vec<Self::Node> {
self.0.add_nodes(n)
}
fn add_edge(&mut self, u: Self::Node, v: Self::Node) -> Self::Edge {
self.0.add_edge(u, v)
}
fn node2id(&self, u: Self::Node) -> usize {
self.0.node2id(u)
}
fn edge2id(&self, e: Self::Edge) -> usize {
self.0.edge2id(e)
}
fn to_graph(self) -> Self::Graph {
WrappedGraph::from_graph(self.0.to_graph())
}
}
impl<'a,T> Graph<'a> for T
where T: WrappedGraph,
T::Graph: Graph<'a>
{
type Node = <T::Graph as Graph<'a>>::Node;
type Edge = <T::Graph as Graph<'a>>::Edge;
type NodeIter = <T::Graph as Graph<'a>>::NodeIter;
type EdgeIter = <T::Graph as Graph<'a>>::EdgeIter;
type NeighIter = <T::Graph as Graph<'a>>::NeighIter;
type Builder = WrappedBuilder<T, <T::Graph as Graph<'a>>::Builder>;
fn num_nodes(&self) -> usize {
self.as_graph().num_nodes()
}
fn num_edges(&self) -> usize {
self.as_graph().num_edges()
}
fn enodes(&'a self, e: Self::Edge) -> (Self::Node, Self::Node) {
self.as_graph().enodes(e)
}
fn nodes(&'a self) -> Self::NodeIter {
self.as_graph().nodes()
}
fn edges(&'a self) -> Self::EdgeIter {
self.as_graph().edges()
}
fn neighs(&'a self, u: Self::Node) -> Self::NeighIter {
self.as_graph().neighs(u)
}
}
impl<'a,T> Digraph<'a> for T
where T: WrappedGraph,
T::Graph: Digraph<'a>
{
type OutEdgeIter = <T::Graph as Digraph<'a>>::OutEdgeIter;
type InEdgeIter = <T::Graph as Digraph<'a>>::InEdgeIter;
fn src(&'a self, e: Self::Edge) -> Self::Node {
self.as_graph().src(e)
}
fn snk(&'a self, e: Self::Edge) -> Self::Node {
self.as_graph().snk(e)
}
fn outedges(&'a self, u: Self::Node) -> Self::OutEdgeIter {
self.as_graph().outedges(u)
}
fn inedges(&'a self, u: Self::Node) -> Self::InEdgeIter {
self.as_graph().inedges(u)
}
}
impl<'a,T> Network<'a> for T
where T: WrappedGraph,
T::Graph: Network<'a>
{
fn is_reverse(&self, e: Self::Edge, f: Self::Edge) -> bool {
self.as_graph().is_reverse(e, f)
}
fn reverse(&'a self, e: Self::Edge) -> Self::Edge {
self.as_graph().reverse(e)
}
fn is_forward(&self, e: Self::Edge) -> bool {
self.as_graph().is_forward(e)
}
fn forward(&'a self, e: Self::Edge) -> Self::Edge {
self.as_graph().forward(e)
}
fn is_backward(&self, e: Self::Edge) -> bool {
self.as_graph().is_backward(e)
}
fn backward(&'a self, e: Self::Edge) -> Self::Edge {
self.as_graph().backward(e)
}
fn bisrc(&'a self, e: Self::Edge) -> Self::Node {
self.as_graph().bisrc(e)
}
fn bisnk(&'a self, e: Self::Edge) -> Self::Node {
self.as_graph().bisnk(e)
}
}
impl <'a,T> IndexGraph<'a> for T
where T: WrappedGraph,
T::Graph: IndexGraph<'a>
{
fn node_id(&self, u: Self::Node) -> usize {
self.as_graph().node_id(u)
}
fn id2node(&'a self, id: usize) -> Self::Node {
self.as_graph().id2node(id)
}
fn edge_id(&self, e: Self::Edge) -> usize {
self.as_graph().edge_id(e)
}
fn id2edge(&'a self, id: usize) -> Self::Edge {
self.as_graph().id2edge(id)
}
}
impl <'a,T> IndexNetwork<'a> for T
where T: WrappedGraph,
T::Graph: IndexNetwork<'a>
{
fn biedge_id(&self, e: Self::Edge) -> usize {
self.as_graph().biedge_id(e)
}
fn id2biedge(&'a self, id: usize) -> Self::Edge {
self.as_graph().id2biedge(id)
}
}
impl<T> Builder for T
where T: WrappedGraphMut,
T::Graph: Builder,
{
type Graph = T;
type Node = <T::Graph as Builder>::Node;
type Edge = <T::Graph as Builder>::Edge;
fn new() -> Self {
Self::from_graph(<T::Graph as Builder>::new())
}
fn with_capacities(nnodes: usize, nedges: usize) -> Self {
Self::from_graph(<T::Graph as Builder>::with_capacities(nnodes, nedges))
}
fn reserve(&mut self, nnodes: usize, nedges: usize) {
self.as_mut_graph().reserve(nnodes, nedges)
}
fn add_node(&mut self) -> Self::Node {
self.as_mut_graph().add_node()
}
fn add_nodes(&mut self, n: usize) -> Vec<Self::Node> {
self.as_mut_graph().add_nodes(n)
}
fn add_edge(&mut self, u: Self::Node, v: Self::Node) -> Self::Edge {
self.as_mut_graph().add_edge(u, v)
}
fn node2id(&self, u: Self::Node) -> usize {
self.as_graph().node2id(u)
}
fn edge2id(&self, e: Self::Edge) -> usize {
self.as_graph().edge2id(e)
}
fn to_graph(self) -> Self::Graph {
self
}
}