use std::fmt;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct NodeId(pub(crate) usize);
impl NodeId {
#[must_use]
#[inline]
pub const fn new(index: usize) -> Self {
NodeId(index)
}
#[must_use]
#[inline]
pub const fn index(self) -> usize {
self.0
}
}
impl fmt::Debug for NodeId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "NodeId({})", self.0)
}
}
impl fmt::Display for NodeId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "n{}", self.0)
}
}
impl From<usize> for NodeId {
#[inline]
fn from(index: usize) -> Self {
NodeId(index)
}
}
impl From<NodeId> for usize {
#[inline]
fn from(node: NodeId) -> Self {
node.0
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::collections::{HashMap, HashSet};
#[test]
fn test_node_id_new() {
let node = NodeId::new(42);
assert_eq!(node.index(), 42);
}
#[test]
fn test_node_id_index() {
let node = NodeId::new(100);
assert_eq!(node.index(), 100);
}
#[test]
fn test_node_id_equality() {
let node1 = NodeId::new(5);
let node2 = NodeId::new(5);
let node3 = NodeId::new(10);
assert_eq!(node1, node2);
assert_ne!(node1, node3);
}
#[test]
fn test_node_id_ordering() {
let node1 = NodeId::new(1);
let node2 = NodeId::new(2);
let node3 = NodeId::new(3);
assert!(node1 < node2);
assert!(node2 < node3);
assert!(node1 < node3);
let mut nodes = vec![node3, node1, node2];
nodes.sort();
assert_eq!(nodes, vec![node1, node2, node3]);
}
#[test]
fn test_node_id_hash() {
let mut set: HashSet<NodeId> = HashSet::new();
let node1 = NodeId::new(1);
let node2 = NodeId::new(2);
let node1_dup = NodeId::new(1);
set.insert(node1);
set.insert(node2);
set.insert(node1_dup);
assert_eq!(set.len(), 2);
assert!(set.contains(&node1));
assert!(set.contains(&node2));
}
#[test]
fn test_node_id_as_map_key() {
let mut map: HashMap<NodeId, &str> = HashMap::new();
let node1 = NodeId::new(1);
let node2 = NodeId::new(2);
map.insert(node1, "first");
map.insert(node2, "second");
assert_eq!(map.get(&node1), Some(&"first"));
assert_eq!(map.get(&node2), Some(&"second"));
assert_eq!(map.get(&NodeId::new(3)), None);
}
#[test]
fn test_node_id_copy_semantics() {
let node1 = NodeId::new(42);
let node2 = node1;
assert_eq!(node1, node2);
assert_eq!(node1.index(), 42);
assert_eq!(node2.index(), 42);
}
#[test]
fn test_node_id_from_usize() {
let node: NodeId = 123usize.into();
assert_eq!(node.index(), 123);
}
#[test]
fn test_node_id_into_usize() {
let node = NodeId::new(789);
let value: usize = node.into();
assert_eq!(value, 789);
}
#[test]
fn test_node_id_debug_format() {
let node = NodeId::new(42);
let debug_str = format!("{node:?}");
assert_eq!(debug_str, "NodeId(42)");
}
#[test]
fn test_node_id_display_format() {
let node = NodeId::new(42);
let display_str = format!("{node}");
assert_eq!(display_str, "n42");
}
#[test]
fn test_node_id_boundary_values() {
let zero = NodeId::new(0);
assert_eq!(zero.index(), 0);
let large = NodeId::new(1_000_000);
assert_eq!(large.index(), 1_000_000);
}
#[test]
fn test_node_id_array_indexing() {
let data = ["zero", "one", "two", "three"];
let node = NodeId::new(2);
assert_eq!(data[node.index()], "two");
}
}