pub trait Builder
where
Self: Sized,
{
type Graph;
type Node: Copy + Eq;
type Edge: Copy + Eq;
fn new() -> Self {
Self::with_capacities(0, 0)
}
fn with_capacities(nnodes: usize, nedges: usize) -> Self;
fn reserve(&mut self, nnodes: usize, nedges: usize);
fn num_nodes(&self) -> usize;
fn num_edges(&self) -> usize;
fn add_node(&mut self) -> Self::Node;
fn add_nodes(&mut self, n: usize) -> Vec<Self::Node> {
(0..n).map(|_| self.add_node()).collect()
}
fn add_edge(&mut self, u: Self::Node, v: Self::Node) -> Self::Edge;
fn node2id(&self, u: Self::Node) -> usize;
fn edge2id(&self, e: Self::Edge) -> usize;
fn id2node(&self, uid: usize) -> Self::Node;
fn id2edge(&self, eid: usize) -> Self::Edge;
fn into_graph(self) -> Self::Graph;
}
pub trait Buildable
where
Self: Sized,
{
type Builder: Builder<Graph = Self>;
fn new_builder() -> Self::Builder {
Self::Builder::new()
}
fn new_with<F>(f: F) -> Self
where
F: FnOnce(&mut Self::Builder),
{
let mut b = Self::new_builder();
f(&mut b);
b.into_graph()
}
}