use super::walk_item::WalkItem;
use super::GraphProperty;
pub struct NeighborIndices<N> {
pub(crate) iter: std::vec::IntoIter<N>,
}
impl<N> Iterator for NeighborIndices<N> {
type Item = N;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
}
pub struct NodeRefIter<'r, I, G>(pub(crate) &'r G, pub(crate) I)
where
G: GraphOperation<'r> + ?Sized,
I: Iterator<Item = G::NodeIx>;
impl<'r, I, G> Iterator for NodeRefIter<'r, I, G>
where
G: GraphOperation<'r> + ?Sized,
I: Iterator<Item = G::NodeIx>,
{
type Item = &'r G::Node;
fn next(&mut self) -> Option<Self::Item> {
self.1.next().map(|ix| {
unsafe { self.0.node_unchecked(ix) }
})
}
}
pub struct EdgeRefIter<'r, I, G>(pub(crate) &'r G, pub(crate) I)
where
G: GraphOperation<'r> + ?Sized,
I: Iterator<Item = G::EdgeIx>;
impl<'r, I, G> Iterator for EdgeRefIter<'r, I, G>
where
G: GraphOperation<'r> + ?Sized,
I: Iterator<Item = G::EdgeIx>,
{
type Item = &'r G::Edge;
fn next(&mut self) -> Option<Self::Item> {
self.1.next().map(|ix| {
unsafe { self.0.edge_unchecked(ix) }
})
}
}
pub trait GraphOperation<'r>: GraphProperty {
fn contains_node_index(&self, node_ix: Self::NodeIx) -> bool;
fn contains_edge_index(&self, edge_ix: Self::EdgeIx) -> bool;
fn len_node(&self) -> usize;
fn len_edge(&self) -> usize;
fn capacity_node(&self) -> Option<usize> {
None
}
fn capacity_edge(&self) -> Option<usize> {
None
}
type NodeIndices: Iterator<Item = Self::NodeIx>;
type EdgeIndices: Iterator<Item = Self::EdgeIx>;
fn node_indices(&'r self) -> Self::NodeIndices;
fn edge_indices(&'r self) -> Self::EdgeIndices;
unsafe fn node_unchecked(&self, node_ix: Self::NodeIx) -> &Self::Node;
unsafe fn edge_unchecked(&self, edge_ix: Self::EdgeIx) -> &Self::Edge;
unsafe fn endpoints_unchecked(&self, edge_ix: Self::EdgeIx) -> Self::Endpoints;
type EdgeIndicesFrom: Iterator<Item = Self::EdgeIx>;
unsafe fn edge_indices_from_unchecked(&'r self, node_ix: Self::NodeIx)
-> Self::EdgeIndicesFrom;
type EdgeIndicesOf: Iterator<Item = Self::EdgeIx>;
unsafe fn edge_indices_of_unchecked(&'r self, node_ix: Self::NodeIx) -> Self::EdgeIndicesOf;
type WalksFrom: Iterator<Item = WalkItem<'r, Self::EdgeIx, Self::Edge, Self::NodeIx>>;
unsafe fn walks_from_unchecked(&'r self, node_ix: Self::NodeIx) -> Self::WalksFrom;
type WalksOf: Iterator<Item = WalkItem<'r, Self::EdgeIx, Self::Edge, Self::NodeIx>>;
unsafe fn walks_of_unchecked(&'r self, node_ix: Self::NodeIx) -> Self::WalksOf;
type DrainNode: Iterator<Item = Self::Node>;
type DrainEdge: Iterator<Item = Self::Edge>;
fn drain(self) -> (Self::DrainNode, Self::DrainEdge)
where
Self: Sized;
fn reverse(&mut self);
}