use std::hash::BuildHasher;
use petgraph::graph::IndexType;
use petgraph::graphmap::{GraphMap, NodeTrait};
use petgraph::matrix_graph::{MatrixGraph, Nullable};
use petgraph::stable_graph::StableGraph;
use petgraph::visit::{Data, IntoNodeIdentifiers};
use petgraph::{EdgeType, Graph};
pub mod contraction;
pub mod multigraph;
pub use contraction::{
can_contract, ContractNodesDirected, ContractNodesSimpleDirected,
ContractNodesSimpleUndirected, ContractNodesUndirected,
};
pub use multigraph::{HasParallelEdgesDirected, HasParallelEdgesUndirected};
pub trait NodeRemovable: Data {
type Output;
fn remove_node(&mut self, node: Self::NodeId) -> Self::Output;
}
impl<N, E, Ty, Ix> NodeRemovable for StableGraph<N, E, Ty, Ix>
where
Ty: EdgeType,
Ix: IndexType,
{
type Output = Option<Self::NodeWeight>;
fn remove_node(&mut self, node: Self::NodeId) -> Option<Self::NodeWeight> {
self.remove_node(node)
}
}
impl<N, E, Ty, Ix> NodeRemovable for Graph<N, E, Ty, Ix>
where
Ty: EdgeType,
Ix: IndexType,
{
type Output = Option<Self::NodeWeight>;
fn remove_node(&mut self, node: Self::NodeId) -> Option<Self::NodeWeight> {
self.remove_node(node)
}
}
impl<N, E, Ty> NodeRemovable for GraphMap<N, E, Ty>
where
N: NodeTrait,
Ty: EdgeType,
{
type Output = bool;
fn remove_node(&mut self, node: Self::NodeId) -> Self::Output {
self.remove_node(node)
}
}
impl<N, E, S: BuildHasher, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> NodeRemovable
for MatrixGraph<N, E, S, Ty, Null, Ix>
{
type Output = Option<Self::NodeWeight>;
fn remove_node(&mut self, node: Self::NodeId) -> Self::Output {
for n in self.node_identifiers() {
if node == n {
return Some(self.remove_node(node));
}
}
None
}
}
pub trait EdgeRemovable: Data {
type Output;
fn remove_edge(&mut self, edge: Self::EdgeId) -> Self::Output;
}
impl<N, E, Ty, Ix> EdgeRemovable for StableGraph<N, E, Ty, Ix>
where
Ty: EdgeType,
Ix: IndexType,
{
type Output = Option<Self::EdgeWeight>;
fn remove_edge(&mut self, edge: Self::EdgeId) -> Option<Self::EdgeWeight> {
self.remove_edge(edge)
}
}
impl<N, E, Ty, Ix> EdgeRemovable for Graph<N, E, Ty, Ix>
where
Ty: EdgeType,
Ix: IndexType,
{
type Output = Option<Self::EdgeWeight>;
fn remove_edge(&mut self, edge: Self::EdgeId) -> Option<Self::EdgeWeight> {
self.remove_edge(edge)
}
}
pub trait EdgeFindable: Data {
fn edge_find(&self, a: Self::NodeId, b: Self::NodeId) -> Option<Self::EdgeId>;
}
impl<N, E, Ty, Ix> EdgeFindable for &StableGraph<N, E, Ty, Ix>
where
Ty: EdgeType,
Ix: IndexType,
{
fn edge_find(&self, a: Self::NodeId, b: Self::NodeId) -> Option<Self::EdgeId> {
self.find_edge(a, b)
}
}
impl<N, E, Ty, Ix> EdgeFindable for &Graph<N, E, Ty, Ix>
where
Ty: EdgeType,
Ix: IndexType,
{
fn edge_find(&self, a: Self::NodeId, b: Self::NodeId) -> Option<Self::EdgeId> {
self.find_edge(a, b)
}
}