use crate::MeritRankError;
#[derive(Hash, PartialOrd, Ord, Clone, Copy, PartialEq, Eq)]
pub enum NodeId {
Int(i32),
UInt(usize),
None,
}
impl Default for NodeId {
fn default() -> Self {
NodeId::UInt(0)
}
}
impl NodeId {
pub fn is_none(&self) -> bool {
match self {
NodeId::None => true,
_ => false,
}
}
pub fn is_some(&self) -> bool {
match self {
NodeId::None => false,
NodeId::Int(id) => *id != 0,
NodeId::UInt(id) => *id != 0,
}
}
}
#[derive(Debug, Hash, Default, PartialOrd, Ord, Clone, PartialEq, Eq)]
pub struct Node {
id: NodeId,
}
impl Node {
pub fn new(id: NodeId) -> Self {
Node { id }
}
pub fn get_id(&self) -> NodeId {
self.id
}
}
impl<T> From<T> for Node
where
T: Into<NodeId>,
{
fn from(id: T) -> Self {
Node { id: id.into() }
}
}
impl From<i32> for NodeId {
fn from(id: i32) -> Self {
NodeId::Int(id)
}
}
impl From<usize> for NodeId {
fn from(id: usize) -> Self {
NodeId::UInt(id)
}
}
pub type Weight = f64;
impl From<NodeId> for Weight {
fn from(id: NodeId) -> Self {
match id {
NodeId::Int(id) => id as f64,
NodeId::UInt(id) => id as f64,
_ => 0.0,
}
}
}
impl From<Weight> for NodeId {
fn from(id: Weight) -> Self {
match id {
id if id < 0.0 => NodeId::Int(id as i32),
id if id >= 0.0 => NodeId::UInt(id as usize),
_ => NodeId::default(),
}
}
}
use std::str::FromStr;
impl FromStr for NodeId {
type Err = MeritRankError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.parse::<i32>() {
Ok(id) => Ok(NodeId::Int(id)),
Err(_) => match s.parse::<usize>() {
Ok(id) => Ok(NodeId::UInt(id)),
Err(_) => Err(MeritRankError::NodeIdParseError),
},
}
}
}