pub use vec::{IndexBiEdgeSlice, IndexEdgeSlice, IndexNodeSlice};
pub use vec::{IndexBiEdgeVec, IndexEdgeVec, IndexNodeVec};
pub trait Node: Copy + Eq {}
pub trait NumberedNode: Node {
fn index(&self) -> usize;
}
pub trait Edge: Copy + Eq {}
pub trait NumberedEdge: Edge {
fn index(&self) -> usize;
}
pub trait BiNumberedEdge: Edge {
fn biindex(&self) -> usize;
}
pub trait Graph<'a>
where
Self: Sized,
{
type Node: 'a + Node;
type Edge: 'a + Edge;
type NodeIter: 'a + Iterator<Item = Self::Node>;
type EdgeIter: 'a + Iterator<Item = Self::Edge>;
type NeighIter: 'a + Iterator<Item = (Self::Edge, Self::Node)>;
fn num_nodes(&self) -> usize;
fn num_edges(&self) -> usize;
fn enodes(&'a self, e: Self::Edge) -> (Self::Node, Self::Node);
fn nodes(&'a self) -> Self::NodeIter;
fn edges(&'a self) -> Self::EdgeIter;
fn neighs(&'a self, u: Self::Node) -> Self::NeighIter;
}
pub trait Digraph<'a>: Graph<'a> {
type OutEdgeIter: 'a + Iterator<Item = (Self::Edge, Self::Node)>;
type InEdgeIter: 'a + Iterator<Item = (Self::Edge, Self::Node)>;
fn src(&'a self, e: Self::Edge) -> Self::Node;
fn snk(&'a self, e: Self::Edge) -> Self::Node;
fn outedges(&'a self, u: Self::Node) -> Self::OutEdgeIter;
fn inedges(&'a self, u: Self::Node) -> Self::InEdgeIter;
}
pub trait Network<'a>: Digraph<'a> {
fn is_reverse(&self, e: Self::Edge, f: Self::Edge) -> bool {
e == f && self.is_forward(e) != self.is_forward(f)
}
fn reverse(&'a self, e: Self::Edge) -> Self::Edge;
fn is_forward(&self, e: Self::Edge) -> bool;
fn forward(&'a self, e: Self::Edge) -> Self::Edge {
if self.is_forward(e) {
e
} else {
self.reverse(e)
}
}
fn is_backward(&self, e: Self::Edge) -> bool {
!self.is_forward(e)
}
fn backward(&'a self, e: Self::Edge) -> Self::Edge {
if self.is_backward(e) {
e
} else {
self.reverse(e)
}
}
fn bisrc(&'a self, e: Self::Edge) -> Self::Node {
if self.is_forward(e) {
self.src(e)
} else {
self.snk(e)
}
}
fn bisnk(&'a self, e: Self::Edge) -> Self::Node {
if self.is_forward(e) {
self.snk(e)
} else {
self.src(e)
}
}
}
pub trait IndexGraph<'a>: Graph<'a> {
fn node_id(&self, u: Self::Node) -> usize;
fn id2node(&'a self, id: usize) -> Self::Node;
fn edge_id(&self, e: Self::Edge) -> usize;
fn id2edge(&'a self, id: usize) -> Self::Edge;
}
pub trait IndexDigraph<'a>: IndexGraph<'a> + Digraph<'a> {}
impl<'a, T> IndexDigraph<'a> for T
where
T: IndexGraph<'a> + Digraph<'a>,
{
}
pub trait IndexNetwork<'a>: IndexGraph<'a> + Network<'a> {
fn biedge_id(&self, e: Self::Edge) -> usize;
fn id2biedge(&'a self, id: usize) -> Self::Edge;
}
pub trait NumberedGraph<'a>: Graph<'a>
where
<Self as Graph<'a>>::Node: NumberedNode,
<Self as Graph<'a>>::Edge: NumberedEdge,
{
}
impl<'a, G> NumberedGraph<'a> for G
where
G: Graph<'a>,
G::Node: NumberedNode,
G::Edge: NumberedEdge,
{
}
pub trait NumberedDigraph<'a>: NumberedGraph<'a> + Digraph<'a>
where
<Self as Graph<'a>>::Node: NumberedNode,
<Self as Graph<'a>>::Edge: NumberedEdge,
{
}
impl<'a, G> NumberedDigraph<'a> for G
where
G: Digraph<'a> + NumberedGraph<'a>,
G::Node: NumberedNode,
G::Edge: NumberedEdge,
{
}
pub trait NumberedNetwork<'a>: NumberedDigraph<'a> + Network<'a>
where
<Self as Graph<'a>>::Node: NumberedNode,
<Self as Graph<'a>>::Edge: NumberedEdge + BiNumberedEdge,
{
}
impl<'a, G> NumberedNetwork<'a> for G
where
G: Network<'a> + NumberedDigraph<'a>,
G::Node: NumberedNode,
G::Edge: NumberedEdge + BiNumberedEdge,
{
}
impl<'a, G> Graph<'a> for &'a G
where
G: Graph<'a>,
{
type Node = G::Node;
type Edge = G::Edge;
type NodeIter = G::NodeIter;
type EdgeIter = G::EdgeIter;
type NeighIter = G::NeighIter;
fn num_nodes(&self) -> usize {
(*self).num_nodes()
}
fn num_edges(&self) -> usize {
(*self).num_edges()
}
fn enodes(&'a self, e: Self::Edge) -> (Self::Node, Self::Node) {
(*self).enodes(e)
}
fn nodes(&'a self) -> Self::NodeIter {
(*self).nodes()
}
fn edges(&'a self) -> Self::EdgeIter {
(*self).edges()
}
fn neighs(&'a self, u: Self::Node) -> Self::NeighIter {
(*self).neighs(u)
}
}
impl<'a, G> Digraph<'a> for &'a G
where
G: Digraph<'a>,
{
type OutEdgeIter = G::OutEdgeIter;
type InEdgeIter = G::InEdgeIter;
fn src(&'a self, e: Self::Edge) -> Self::Node {
(*self).src(e)
}
fn snk(&'a self, e: Self::Edge) -> Self::Node {
(*self).snk(e)
}
fn outedges(&'a self, u: Self::Node) -> Self::OutEdgeIter {
(*self).outedges(u)
}
fn inedges(&'a self, u: Self::Node) -> Self::InEdgeIter {
(*self).inedges(u)
}
}
impl<'a, G> Network<'a> for &'a G
where
G: Network<'a>,
{
fn is_reverse(&self, e: Self::Edge, f: Self::Edge) -> bool {
(*self).is_reverse(e, f)
}
fn reverse(&'a self, e: Self::Edge) -> Self::Edge {
(*self).reverse(e)
}
fn is_forward(&self, e: Self::Edge) -> bool {
(*self).is_forward(e)
}
fn forward(&'a self, e: Self::Edge) -> Self::Edge {
(*self).forward(e)
}
fn is_backward(&self, e: Self::Edge) -> bool {
(*self).is_backward(e)
}
fn backward(&'a self, e: Self::Edge) -> Self::Edge {
(*self).backward(e)
}
fn bisrc(&'a self, e: Self::Edge) -> Self::Node {
(*self).bisrc(e)
}
fn bisnk(&'a self, e: Self::Edge) -> Self::Node {
(*self).bisnk(e)
}
}
impl<'a, G> IndexGraph<'a> for &'a G
where
G: IndexGraph<'a>,
{
fn node_id(&self, u: Self::Node) -> usize {
(*self).node_id(u)
}
fn id2node(&'a self, id: usize) -> Self::Node {
(*self).id2node(id)
}
fn edge_id(&self, e: Self::Edge) -> usize {
(*self).edge_id(e)
}
fn id2edge(&'a self, id: usize) -> Self::Edge {
(*self).id2edge(id)
}
}
impl<'a, G> IndexNetwork<'a> for &'a G
where
G: IndexNetwork<'a>,
{
fn biedge_id(&self, e: Self::Edge) -> usize {
(*self).biedge_id(e)
}
fn id2biedge(&'a self, id: usize) -> Self::Edge {
(*self).id2biedge(id)
}
}