use crate::graph::*;
pub trait GrowableGraph {
fn new() -> Self;
fn add_vertex(&mut self) -> VertexId;
fn add_edge(&mut self, source: VertexId, sink: VertexId) -> EdgeId;
}
pub trait EdgeShrinkableGraph {
fn remove_edge(&mut self, edge: &EdgeId) -> Option<Edge>;
}
pub trait VertexShrinkableGraph: EdgeShrinkableGraph {
fn remove_vertex(&mut self, vertex: &VertexId) -> Box<dyn Iterator<Item = Edge> + 'static>;
}
pub trait QueryableGraph {
fn vertex_size(&self) -> usize;
fn iter_vertices(&self) -> Box<dyn Iterator<Item = VertexId> + '_>;
fn contains_vertex(&self, v: &VertexId) -> bool;
fn edge_size(&self) -> usize;
fn iter_edges(&self) -> Box<dyn Iterator<Item = Edge> + '_>;
fn contains_edge(&self, e: &EdgeId) -> bool;
fn find_edge(&self, e: &EdgeId) -> Option<Edge>;
fn edges_connecting(
&self,
source: &VertexId,
sink: &VertexId,
) -> Box<dyn Iterator<Item = Edge> + '_>;
fn in_edges(&self, v: &VertexId) -> Box<dyn Iterator<Item = Edge> + '_>;
fn out_edges(&self, v: &VertexId) -> Box<dyn Iterator<Item = Edge> + '_>;
fn debug(&self) -> Box<dyn std::fmt::Debug + '_>
where
Self: Sized,
{
self.debug_with_indent(0, 2)
}
fn debug_with_indent(
&self,
init_indent: usize,
indent_step: usize,
) -> Box<dyn std::fmt::Debug + '_>
where
Self: Sized,
{
Box::new(super::graph_debug::GraphDebug::new(
self,
init_indent,
indent_step,
))
}
}
pub trait DirectedOrNot {
const DIRECTED_OR_NOT: bool;
}
pub trait Subgraph {
type LowerGraph;
fn new(lower_graph: Self::LowerGraph) -> Self;
fn disclose_vertex(&mut self, v: VertexId) -> &mut Self;
fn disclose_edge(&mut self, v: EdgeId) -> &mut Self;
}
pub trait DumpInGraphviz: QueryableGraph + DirectedOrNot {
fn dump_in_graphviz<W>(&self, out: &mut W, graph_name: &str) -> std::io::Result<()>
where
W: std::io::Write,
{
if Self::DIRECTED_OR_NOT {
writeln!(out, "digraph {} {{", graph_name)?;
} else {
writeln!(out, "graph {} {{", graph_name)?;
}
for v in self.iter_vertices() {
writeln!(out, " {} ;", v.0)?;
}
for e in self.iter_edges() {
if Self::DIRECTED_OR_NOT {
writeln!(out, " {} -> {} ;", e.source.0, e.sink.0)?;
} else {
writeln!(out, " {} -- {} ;", e.source.0, e.sink.0)?;
}
}
writeln!(out, "}}")?;
Ok(())
}
}
impl<G: QueryableGraph + DirectedOrNot> DumpInGraphviz for G {}