use geometry::convert::{FromGeometry, FromInteriorGeometry, IntoGeometry};
use geometry::{Attribute, Geometry};
use graph::storage::{EdgeKey, FaceKey, OpaqueKey, VertexKey};
pub trait Topological {
type Key: OpaqueKey;
type Attribute: Attribute;
}
#[derivative(Debug, Hash)]
#[derive(Clone, Derivative)]
pub struct Vertex<G>
where
G: Geometry,
{
#[derivative(Debug = "ignore", Hash = "ignore")]
pub geometry: G::Vertex,
pub(super) edge: Option<EdgeKey>,
}
impl<G> Vertex<G>
where
G: Geometry,
{
pub(in graph) fn new(geometry: G::Vertex) -> Self {
Vertex {
geometry,
edge: None,
}
}
}
impl<G, H> FromInteriorGeometry<Vertex<H>> for Vertex<G>
where
G: Geometry,
G::Vertex: FromGeometry<H::Vertex>,
H: Geometry,
{
fn from_interior_geometry(vertex: Vertex<H>) -> Self {
Vertex {
geometry: vertex.geometry.into_geometry(),
edge: vertex.edge,
}
}
}
impl<G> Topological for Vertex<G>
where
G: Geometry,
{
type Key = VertexKey;
type Attribute = G::Vertex;
}
#[derivative(Debug, Hash)]
#[derive(Clone, Derivative)]
pub struct Edge<G>
where
G: Geometry,
{
#[derivative(Debug = "ignore", Hash = "ignore")]
pub geometry: G::Edge,
pub(super) vertex: VertexKey,
pub(super) opposite: Option<EdgeKey>,
pub(super) next: Option<EdgeKey>,
pub(super) previous: Option<EdgeKey>,
pub(super) face: Option<FaceKey>,
}
impl<G> Edge<G>
where
G: Geometry,
{
pub(in graph) fn new(vertex: VertexKey, geometry: G::Edge) -> Self {
Edge {
geometry,
vertex,
opposite: None,
next: None,
previous: None,
face: None,
}
}
}
impl<G, H> FromInteriorGeometry<Edge<H>> for Edge<G>
where
G: Geometry,
G::Edge: FromGeometry<H::Edge>,
H: Geometry,
{
fn from_interior_geometry(edge: Edge<H>) -> Self {
Edge {
geometry: edge.geometry.into_geometry(),
vertex: edge.vertex,
opposite: edge.opposite,
next: edge.next,
previous: edge.previous,
face: edge.face,
}
}
}
impl<G> Topological for Edge<G>
where
G: Geometry,
{
type Key = EdgeKey;
type Attribute = G::Edge;
}
#[derivative(Debug, Hash)]
#[derive(Clone, Derivative)]
pub struct Face<G>
where
G: Geometry,
{
#[derivative(Debug = "ignore", Hash = "ignore")]
pub geometry: G::Face,
pub(super) edge: EdgeKey,
}
impl<G> Face<G>
where
G: Geometry,
{
pub(in graph) fn new(edge: EdgeKey, geometry: G::Face) -> Self {
Face { geometry, edge }
}
}
impl<G, H> FromInteriorGeometry<Face<H>> for Face<G>
where
G: Geometry,
G::Face: FromGeometry<H::Face>,
H: Geometry,
{
fn from_interior_geometry(face: Face<H>) -> Self {
Face {
geometry: face.geometry.into_geometry(),
edge: face.edge,
}
}
}
impl<G> Topological for Face<G>
where
G: Geometry,
{
type Key = FaceKey;
type Attribute = G::Face;
}