use crate::{
math::{HasPosition, Scalar, Vector},
mesh::MeshType,
};
pub trait VertexBasics<T: MeshType>: std::fmt::Debug + Clone {
fn id(&self) -> T::V;
fn payload(&self) -> &T::VP;
fn pos<S: Scalar, const D: usize, Vec: Vector<S, D>>(&self) -> Vec
where
T::VP: HasPosition<D, Vec, S = S>,
{
*self.payload().pos()
}
fn payload_mut(&mut self) -> &mut T::VP;
fn edge_id(&self, mesh: &T::Mesh) -> T::E;
fn edge(&self, mesh: &T::Mesh) -> Option<T::Edge>;
fn is_boundary(&self, mesh: &T::Mesh) -> bool;
fn has_only_one_edge(&self, mesh: &T::Mesh) -> bool;
fn vertices<'a>(&'a self, mesh: &'a T::Mesh) -> impl Iterator<Item = T::Vertex> + 'a;
fn faces<'a>(&'a self, mesh: &'a T::Mesh) -> impl Iterator<Item = T::Face> + 'a
where
T: 'a;
fn neighbor_ids<'a>(&'a self, mesh: &'a T::Mesh) -> impl Iterator<Item = T::V> + 'a {
self.vertices(mesh).map(|v| v.id())
}
fn degree(&self, mesh: &T::Mesh) -> usize {
self.edges_out(mesh).count()
}
fn edges_out<'a>(&'a self, mesh: &'a T::Mesh) -> impl Iterator<Item = T::Edge> + 'a;
fn edges_in<'a>(&'a self, mesh: &'a T::Mesh) -> impl Iterator<Item = T::Edge> + 'a;
}