use super::{GraphPath, GraphEdge, GraphEdgeRef};
use crate::geo::*;
impl GraphEdgeRef {
pub fn reversed(mut self) -> GraphEdgeRef {
self.reverse = !self.reverse;
self
}
}
impl<'a, Point: 'a+Coordinate, Label: 'a+Copy> From<GraphEdge<'a, Point, Label>> for GraphEdgeRef {
fn from(edge: GraphEdge<'a, Point, Label>) -> GraphEdgeRef {
edge.edge
}
}
impl<'a, 'b, Point: 'a+Coordinate, Label: 'a+Copy> From<&'b GraphEdge<'a, Point, Label>> for GraphEdgeRef {
fn from(edge: &'b GraphEdge<'a, Point, Label>) -> GraphEdgeRef {
edge.edge
}
}
impl<Point: Coordinate+Coordinate2D, Label> GraphPath<Point, Label> {
#[inline]
pub fn following_edge_ref(&self, edge_ref: GraphEdgeRef) -> GraphEdgeRef {
if edge_ref.reverse {
for connected_from in self.points[edge_ref.start_idx].connected_from.iter() {
for (edge_idx, edge) in self.points[*connected_from].forward_edges.iter().enumerate() {
if edge.end_idx == edge_ref.start_idx {
return GraphEdgeRef {
start_idx: *connected_from,
edge_idx: edge_idx,
reverse: true
}
}
}
}
panic!("Reverse edge could not be found")
} else {
let edge = &self.points[edge_ref.start_idx].forward_edges[edge_ref.edge_idx];
GraphEdgeRef {
start_idx: edge.end_idx,
edge_idx: edge.following_edge_idx,
reverse: false
}
}
}
}