use super::consts::DEFAULT_MIN_HOP_RANK_INCREASE;
#[derive(Debug, Clone, Copy, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct Rank {
pub(super) value: u16,
pub(super) min_hop_rank_increase: u16,
}
impl core::fmt::Display for Rank {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "Rank({})", self.dag_rank())
}
}
impl Rank {
pub const INFINITE: Self = Rank::new(0xffff, DEFAULT_MIN_HOP_RANK_INCREASE);
pub const ROOT: Self = Rank::new(DEFAULT_MIN_HOP_RANK_INCREASE, DEFAULT_MIN_HOP_RANK_INCREASE);
pub const fn new(value: u16, min_hop_rank_increase: u16) -> Self {
assert!(min_hop_rank_increase > 0);
Self {
value,
min_hop_rank_increase,
}
}
pub fn dag_rank(&self) -> u16 {
self.value / self.min_hop_rank_increase
}
pub fn raw_value(&self) -> u16 {
self.value
}
}
impl PartialEq for Rank {
fn eq(&self, other: &Self) -> bool {
self.dag_rank() == other.dag_rank()
}
}
impl PartialOrd for Rank {
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
self.dag_rank().partial_cmp(&other.dag_rank())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn calculate_rank() {
let r = Rank::new(27, 16);
assert_eq!(r.dag_rank(), 1)
}
#[test]
fn comparison() {
let r1 = Rank::ROOT;
let r2 = Rank::new(16, 16);
assert!(r1 == r2);
let r1 = Rank::new(16, 16);
let r2 = Rank::new(32, 16);
assert!(r1 < r2);
let r1 = Rank::ROOT;
let r2 = Rank::INFINITE;
assert!(r1 < r2);
}
}