blob: ee5c7728ab9de215da76fd65c5be1ef6d47a8a39 [file] [log] [blame]
use crate::{
Direction,
Incoming,
};
use crate::visit::{
GraphBase,
GraphRef,
IntoEdges,
IntoEdgesDirected,
IntoNodeIdentifiers,
IntoNodeReferences,
IntoNeighbors,
IntoNeighborsDirected,
IntoEdgeReferences,
NodeCompactIndexable,
NodeCount,
NodeIndexable,
Visitable,
EdgeRef,
Data,
GraphProp,
};
/// An edge-reversing graph adaptor.
///
/// All edges have the opposite direction with `Reversed`.
#[derive(Copy, Clone, Debug)]
pub struct Reversed<G>(pub G);
impl<G: GraphBase> GraphBase for Reversed<G> {
type NodeId = G::NodeId;
type EdgeId = G::EdgeId;
}
impl<G: GraphRef> GraphRef for Reversed<G> { }
Data!{delegate_impl [[G], G, Reversed<G>, access0]}
impl<G> IntoNeighbors for Reversed<G>
where G: IntoNeighborsDirected
{
type Neighbors = G::NeighborsDirected;
fn neighbors(self, n: G::NodeId) -> G::NeighborsDirected
{
self.0.neighbors_directed(n, Incoming)
}
}
impl<G> IntoNeighborsDirected for Reversed<G>
where G: IntoNeighborsDirected
{
type NeighborsDirected = G::NeighborsDirected;
fn neighbors_directed(self, n: G::NodeId, d: Direction)
-> G::NeighborsDirected
{
self.0.neighbors_directed(n, d.opposite())
}
}
impl<G> IntoEdges for Reversed<G>
where G: IntoEdgesDirected
{
type Edges = ReversedEdges<G::EdgesDirected>;
fn edges(self, a: Self::NodeId) -> Self::Edges {
ReversedEdges {
iter: self.0.edges_directed(a, Incoming),
}
}
}
impl<G> IntoEdgesDirected for Reversed<G>
where G: IntoEdgesDirected
{
type EdgesDirected = ReversedEdges<G::EdgesDirected>;
fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::Edges {
ReversedEdges {
iter: self.0.edges_directed(a, dir.opposite()),
}
}
}
impl<G: Visitable> Visitable for Reversed<G>
{
type Map = G::Map;
fn visit_map(&self) -> G::Map {
self.0.visit_map()
}
fn reset_map(&self, map: &mut Self::Map) {
self.0.reset_map(map);
}
}
/// A reversed edges iterator.
pub struct ReversedEdges<I> {
iter: I,
}
impl<I> Iterator for ReversedEdges<I>
where I: Iterator, I::Item: EdgeRef
{
type Item = ReversedEdgeReference<I::Item>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(ReversedEdgeReference)
}
}
/// A reversed edge reference
#[derive(Copy, Clone, Debug)]
pub struct ReversedEdgeReference<R>(R);
/// An edge reference
impl<R> EdgeRef for ReversedEdgeReference<R>
where R: EdgeRef,
{
type NodeId = R::NodeId;
type EdgeId = R::EdgeId;
type Weight = R::Weight;
fn source(&self) -> Self::NodeId {
self.0.target()
}
fn target(&self) -> Self::NodeId {
self.0.source()
}
fn weight(&self) -> &Self::Weight {
self.0.weight()
}
fn id(&self) -> Self::EdgeId {
self.0.id()
}
}
impl<G> IntoEdgeReferences for Reversed<G>
where G: IntoEdgeReferences
{
type EdgeRef = ReversedEdgeReference<G::EdgeRef>;
type EdgeReferences = ReversedEdgeReferences<G::EdgeReferences>;
fn edge_references(self) -> Self::EdgeReferences {
ReversedEdgeReferences {
iter: self.0.edge_references(),
}
}
}
/// A reversed edge references iterator.
pub struct ReversedEdgeReferences<I> {
iter: I,
}
impl<I> Iterator for ReversedEdgeReferences<I>
where I: Iterator,
I::Item: EdgeRef,
{
type Item = ReversedEdgeReference<I::Item>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(ReversedEdgeReference)
}
}
macro_rules! access0 {
($e:expr) => ($e.0)
}
NodeIndexable!{delegate_impl [[G], G, Reversed<G>, access0]}
NodeCompactIndexable!{delegate_impl [[G], G, Reversed<G>, access0]}
IntoNodeIdentifiers!{delegate_impl [[G], G, Reversed<G>, access0]}
IntoNodeReferences!{delegate_impl [[G], G, Reversed<G>, access0]}
GraphProp!{delegate_impl [[G], G, Reversed<G>, access0]}
NodeCount!{delegate_impl [[G], G, Reversed<G>, access0]}