use doublets::data::LinkReference;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct GenericLink<T> {
pub index: T,
pub source: T,
pub target: T,
}
impl<T> GenericLink<T> {
pub const fn new(index: T, source: T, target: T) -> Self {
Self {
index,
source,
target,
}
}
}
impl<T: LinkReference> GenericLink<T> {
pub fn null() -> Self {
let zero = T::from_byte(0);
Self::new(zero, zero, zero)
}
pub fn is_null(&self) -> bool {
let zero = T::from_byte(0);
self.index == zero && self.source == zero && self.target == zero
}
pub fn is_full_point(&self) -> bool {
self.index == self.source && self.source == self.target
}
pub fn is_partial_point(&self) -> bool {
self.index == self.source || self.index == self.target
}
pub fn format(&self) -> String {
format!("({} {} {})", self.index, self.source, self.target)
}
}
pub type Link = GenericLink<u32>;
pub type DoubletsLink = doublets::Link<u32>;
impl<T: LinkReference> From<doublets::Link<T>> for GenericLink<T> {
fn from(link: doublets::Link<T>) -> Self {
Self::new(link.index, link.source, link.target)
}
}
impl<T: LinkReference> From<GenericLink<T>> for doublets::Link<T> {
fn from(link: GenericLink<T>) -> Self {
Self::new(link.index, link.source, link.target)
}
}