use crate::s2::Point;
use crate::s2::builder::graph::{Graph, VertexId};
use crate::s2::shape::Dimension;
use crate::s2::shape::{Chain, ChainPosition, Edge, ReferencePoint, Shape};
#[derive(Debug)]
pub(crate) struct GraphShape {
vertices: Vec<Point>,
edges: Vec<(VertexId, VertexId)>,
}
impl GraphShape {
pub(crate) fn from_graph(graph: &Graph) -> Self {
GraphShape {
vertices: graph.vertices().to_vec(),
edges: graph.edges().to_vec(),
}
}
pub(crate) fn from_parts(vertices: Vec<Point>, edges: Vec<(VertexId, VertexId)>) -> Self {
GraphShape { vertices, edges }
}
}
impl Shape for GraphShape {
fn num_edges(&self) -> usize {
self.edges.len()
}
fn edge(&self, id: usize) -> Edge {
let (v0, v1) = self.edges[id];
Edge::new(self.vertices[v0.as_usize()], self.vertices[v1.as_usize()])
}
fn dimension(&self) -> Dimension {
Dimension::Polyline
}
fn reference_point(&self) -> ReferencePoint {
ReferencePoint::new(Point::origin(), false)
}
fn num_chains(&self) -> usize {
self.edges.len()
}
fn chain(&self, i: usize) -> Chain {
Chain::new(i, 1)
}
fn chain_edge(&self, i: usize, _j: usize) -> Edge {
self.edge(i)
}
fn chain_position(&self, e: usize) -> ChainPosition {
ChainPosition::new(e, 0)
}
}
#[cfg(test)]
#[path = "graph_shape_tests.rs"]
mod graph_shape_tests;