use std::fmt;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct EdgeId(pub(crate) usize);
impl EdgeId {
#[must_use]
#[inline]
pub const fn new(index: usize) -> Self {
EdgeId(index)
}
#[must_use]
#[inline]
pub const fn index(self) -> usize {
self.0
}
}
impl fmt::Debug for EdgeId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "EdgeId({})", self.0)
}
}
impl fmt::Display for EdgeId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "e{}", self.0)
}
}
impl From<usize> for EdgeId {
#[inline]
fn from(index: usize) -> Self {
EdgeId(index)
}
}
impl From<EdgeId> for usize {
#[inline]
fn from(edge: EdgeId) -> Self {
edge.0
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::utils::graph::NodeId;
use std::collections::{HashMap, HashSet};
#[test]
fn test_edge_id_new() {
let edge = EdgeId::new(42);
assert_eq!(edge.index(), 42);
}
#[test]
fn test_edge_id_index() {
let edge = EdgeId::new(100);
assert_eq!(edge.index(), 100);
}
#[test]
fn test_edge_id_equality() {
let edge1 = EdgeId::new(5);
let edge2 = EdgeId::new(5);
let edge3 = EdgeId::new(10);
assert_eq!(edge1, edge2);
assert_ne!(edge1, edge3);
}
#[test]
fn test_edge_id_ordering() {
let edge1 = EdgeId::new(1);
let edge2 = EdgeId::new(2);
let edge3 = EdgeId::new(3);
assert!(edge1 < edge2);
assert!(edge2 < edge3);
assert!(edge1 < edge3);
let mut edges = vec![edge3, edge1, edge2];
edges.sort();
assert_eq!(edges, vec![edge1, edge2, edge3]);
}
#[test]
fn test_edge_id_hash() {
let mut set: HashSet<EdgeId> = HashSet::new();
let edge1 = EdgeId::new(1);
let edge2 = EdgeId::new(2);
let edge1_dup = EdgeId::new(1);
set.insert(edge1);
set.insert(edge2);
set.insert(edge1_dup);
assert_eq!(set.len(), 2);
assert!(set.contains(&edge1));
assert!(set.contains(&edge2));
}
#[test]
fn test_edge_id_as_map_key() {
let mut map: HashMap<EdgeId, &str> = HashMap::new();
let edge1 = EdgeId::new(1);
let edge2 = EdgeId::new(2);
map.insert(edge1, "first");
map.insert(edge2, "second");
assert_eq!(map.get(&edge1), Some(&"first"));
assert_eq!(map.get(&edge2), Some(&"second"));
assert_eq!(map.get(&EdgeId::new(3)), None);
}
#[test]
fn test_edge_id_copy_semantics() {
let edge1 = EdgeId::new(42);
let edge2 = edge1;
assert_eq!(edge1, edge2);
assert_eq!(edge1.index(), 42);
assert_eq!(edge2.index(), 42);
}
#[test]
fn test_edge_id_from_usize() {
let edge: EdgeId = 123usize.into();
assert_eq!(edge.index(), 123);
}
#[test]
fn test_edge_id_into_usize() {
let edge = EdgeId::new(789);
let value: usize = edge.into();
assert_eq!(value, 789);
}
#[test]
fn test_edge_id_debug_format() {
let edge = EdgeId::new(42);
let debug_str = format!("{edge:?}");
assert_eq!(debug_str, "EdgeId(42)");
}
#[test]
fn test_edge_id_display_format() {
let edge = EdgeId::new(42);
let display_str = format!("{edge}");
assert_eq!(display_str, "e42");
}
#[test]
fn test_edge_id_boundary_values() {
let zero = EdgeId::new(0);
assert_eq!(zero.index(), 0);
let large = EdgeId::new(1_000_000);
assert_eq!(large.index(), 1_000_000);
}
#[test]
fn test_edge_id_array_indexing() {
let weights = [1.5, 2.5, 3.5, 4.5];
let edge = EdgeId::new(2);
assert_eq!(weights[edge.index()], 3.5);
}
#[test]
fn test_edge_id_distinct_from_node_id() {
let node = NodeId::new(5);
let edge = EdgeId::new(5);
assert_eq!(node.index(), edge.index());
}
}