use hashbrown::HashSet;
use petgraph::visit::{EdgeCount, EdgeRef, GraphBase, GraphProp, IntoEdgeReferences, Visitable};
use petgraph::{Directed, Undirected};
use std::hash::Hash;
pub trait HasParallelEdgesUndirected: GraphBase {
fn has_parallel_edges(&self) -> bool;
}
impl<G> HasParallelEdgesUndirected for G
where
G: GraphProp<EdgeType = Undirected> + Visitable + EdgeCount,
G::NodeId: Eq + Hash,
for<'b> &'b G: GraphBase<NodeId = G::NodeId> + IntoEdgeReferences,
{
fn has_parallel_edges(&self) -> bool {
let mut edges: HashSet<[Self::NodeId; 2]> = HashSet::with_capacity(2 * self.edge_count());
for edge in self.edge_references() {
let endpoints = [edge.source(), edge.target()];
let endpoints_rev = [edge.target(), edge.source()];
if edges.contains(&endpoints) || edges.contains(&endpoints_rev) {
return true;
}
edges.insert(endpoints);
edges.insert(endpoints_rev);
}
false
}
}
pub trait HasParallelEdgesDirected: GraphBase {
fn has_parallel_edges(&self) -> bool;
}
impl<G> HasParallelEdgesDirected for G
where
G: GraphProp<EdgeType = Directed> + Visitable + EdgeCount,
G::NodeId: Eq + Hash,
for<'b> &'b G: GraphBase<NodeId = G::NodeId> + IntoEdgeReferences,
{
fn has_parallel_edges(&self) -> bool {
let mut edges: HashSet<[Self::NodeId; 2]> = HashSet::with_capacity(self.edge_count());
for edge in self.edge_references() {
let endpoints = [edge.source(), edge.target()];
if edges.contains(&endpoints) {
return true;
}
edges.insert(endpoints);
}
false
}
}