use crate::{
prelude::*,
};
#[derive(Debug)]
pub struct ElementRef<'a, HandleT: Handle, MeshT: 'a + ?Sized> {
handle: HandleT,
mesh: &'a MeshT,
}
pub type EdgeRef<'a, MeshT> = ElementRef<'a, EdgeHandle, MeshT>;
pub type FaceRef<'a, MeshT> = ElementRef<'a, FaceHandle, MeshT>;
pub type VertexRef<'a, MeshT> = ElementRef<'a, VertexHandle, MeshT>;
impl<'a, HandleT: Handle, MeshT: 'a + ?Sized> ElementRef<'a, HandleT, MeshT> {
pub fn new(mesh: &'a MeshT, handle: HandleT) -> Self {
Self { mesh, handle }
}
}
impl<'a, HandleT: Handle, MeshT: 'a> Clone for ElementRef<'a, HandleT, MeshT> {
fn clone(&self) -> Self {
Self {
handle: self.handle,
mesh: self.mesh,
}
}
}
impl<'a, HandleT: Handle, MeshT: 'a> Copy for ElementRef<'a, HandleT, MeshT> {}
impl<'a, HandleT: Handle, MeshT: 'a> ElementRef<'a, HandleT, MeshT> {
pub fn handle(&self) -> HandleT {
self.handle
}
pub fn mesh(&self) -> &MeshT {
self.mesh
}
}
impl<'a, MeshT: 'a + FullAdj> VertexRef<'a, MeshT> {
pub fn is_isolated(&self) -> bool {
self.mesh.is_isolated_vertex(self.handle)
}
pub fn is_boundary(&self) -> bool {
self.mesh.is_boundary_vertex(self.handle)
}
pub fn adjacent_vertices(&self) -> impl Iterator<Item = VertexRef<'a, MeshT>> {
let mesh = self.mesh;
self.mesh.vertices_around_vertex(self.handle)
.map(move |h| VertexRef::new(mesh, h))
}
pub fn adjacent_faces(&self) -> impl Iterator<Item = FaceRef<'a, MeshT>> {
let mesh = self.mesh;
self.mesh.faces_around_vertex(self.handle)
.map(move |h| FaceRef::new(mesh, h))
}
}
impl<'a, MeshT: 'a + EdgeAdj> VertexRef<'a, MeshT> {
pub fn adjacent_edges(&self) -> impl Iterator<Item = EdgeRef<'a, MeshT>> {
let mesh = &*self.mesh;
self.mesh.edges_around_vertex(self.handle)
.map(move |h| EdgeRef::new(mesh, h))
}
}
impl<'a, MeshT: 'a + BasicAdj> FaceRef<'a, MeshT> {
pub fn adjacent_vertices(&self) -> impl Iterator<Item = VertexRef<'a, MeshT>> {
let mesh = self.mesh;
self.mesh.vertices_around_face(self.handle)
.map(move |h| VertexRef::new(mesh, h))
}
}
impl<'a, MeshT: 'a + FullAdj> FaceRef<'a, MeshT> {
pub fn adjacent_faces(&self) -> impl Iterator<Item = FaceRef<'a, MeshT>> {
let mesh = &*self.mesh;
self.mesh.faces_around_face(self.handle)
.map(move |h| FaceRef::new(mesh, h))
}
pub fn is_adjacent_to_face(&self, fh: FaceHandle) -> bool {
self.mesh.are_faces_adjacent(self.handle, fh)
}
pub fn is_boundary(&self) -> bool {
self.mesh.is_boundary_face(self.handle)
}
}
impl<'a, MeshT: 'a + EdgeAdj> FaceRef<'a, MeshT> {
pub fn adjacent_edges(&self) -> impl Iterator<Item = EdgeRef<'a, MeshT>> {
let mesh = &*self.mesh;
self.mesh.edges_around_face(self.handle)
.map(move |h| EdgeRef::new(mesh, h))
}
}
impl<'a, MeshT: 'a + EdgeAdj> EdgeRef<'a, MeshT> {
pub fn endpoints(&self) -> [VertexRef<'_, MeshT>; 2] {
let mesh = self.mesh;
let handles = self.mesh.endpoints_of_edge(self.handle);
[VertexRef::new(mesh, handles[0]), VertexRef::new(mesh, handles[1])]
}
pub fn opposite_endpoint_of(&self, vertex: VertexHandle) -> VertexRef<'a, MeshT> {
let endpoints = self.mesh.endpoints_of_edge(self.handle);
if endpoints[0] == vertex {
VertexRef::new(self.mesh, endpoints[1])
} else {
VertexRef::new(self.mesh, endpoints[0])
}
}
pub fn adjacent_faces(&self) -> impl Iterator<Item = FaceRef<'a, MeshT>> {
let mesh = &*self.mesh;
self.mesh.faces_of_edge(self.handle)
.into_iter()
.map(move |h| FaceRef::new(mesh, h))
}
pub fn is_boundary(&self) -> bool {
self.mesh.is_boundary_edge(self.handle)
}
}