use crate::ArcInfo;
mod forward_star;
pub use self::forward_star::ForwardAndReverseStar;
mod hash_map;
pub use self::hash_map::HashMapStorage;
pub trait ArcStorage<I, A>: Default {
fn with_capacity(n_nodes: usize, n_arcs: usize) -> Self;
fn m_arcs(&self) -> usize;
fn arc(&self, tail: &I, head: &I) -> Option<&A>;
fn arc_mut(&mut self, tail: &I, head: &I) -> Option<&mut A>;
fn contains_arc(&self, tail: &I, head: &I) -> bool;
fn add_arc<T: Into<ArcInfo<I, A>>>(&mut self, arc: T);
fn remove_arc(&mut self, tail: &I, head: &I) -> Option<A>;
fn remove_arcs_with_node(&mut self, id: &I);
fn add_arcs<E: IntoIterator<Item = T>, T: Into<ArcInfo<I, A>>>(&mut self, to_add: E) {
to_add.into_iter().for_each(|arc| self.add_arc(arc));
}
fn remove_arcs<'a, T: IntoIterator<Item = (&'a I, &'a I)>>(
&mut self,
to_remove: T,
) -> Vec<Option<A>>
where
I: 'a,
{
to_remove
.into_iter()
.map(|arc| self.remove_arc(arc.0, arc.1))
.collect()
}
fn has_forward_arcs(&self, node: &I) -> bool;
fn has_reverse_arcs(&self, node: &I) -> bool;
fn arc_iter<'a>(&'a self) -> impl Iterator<Item = &'a ArcInfo<I, A>> + 'a
where
A: 'a,
I: 'a;
fn arc_iter_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut ArcInfo<I, A>> + 'a
where
A: 'a,
I: 'a;
fn forward_arcs<'a>(&'a self, node: &'a I) -> impl Iterator<Item = &'a ArcInfo<I, A>> + 'a
where
A: 'a,
I: 'a;
fn reverse_arcs<'a>(&'a self, node: &'a I) -> impl Iterator<Item = &'a ArcInfo<I, A>> + 'a
where
A: 'a,
I: 'a;
fn all_arcs<'a>(&'a self, node: &'a I) -> impl Iterator<Item = &'a ArcInfo<I, A>> + 'a
where
A: 'a,
I: 'a,
{
self.forward_arcs(node).chain(self.reverse_arcs(node))
}
}