toolbox-rs 0.6.0

A toolbox of basic data structures and algorithms
Documentation
use bincode::{Decode, Encode};

use crate::graph::NodeID;
use core::mem::swap;

pub trait Edge {
    type ID;
    fn source(&self) -> Self::ID;
    fn target(&self) -> Self::ID;
}

pub trait EdgeData {
    type DATA;
    fn data(&self) -> &Self::DATA;
}

pub trait EdgeWithData: Edge<ID = usize> + EdgeData<DATA = i32> {}
impl EdgeWithData for InputEdge<i32> {}

#[derive(Clone, Copy, Debug, bincode::Decode, bincode::Encode)]
pub struct TrivialEdge {
    pub source: usize,
    pub target: usize,
}

impl Edge for TrivialEdge {
    type ID = NodeID;
    fn source(&self) -> Self::ID {
        self.source
    }
    fn target(&self) -> Self::ID {
        self.target
    }
}

#[derive(Clone, Copy, Debug, Default, Eq, PartialOrd, Ord, PartialEq, Decode, Encode)]
pub struct InputEdge<EdgeDataT: Eq> {
    pub source: NodeID,
    pub target: NodeID,
    pub data: EdgeDataT,
}

impl<EdgeDataT: std::cmp::Eq> Edge for InputEdge<EdgeDataT> {
    type ID = NodeID;
    fn source(&self) -> Self::ID {
        self.source
    }
    fn target(&self) -> Self::ID {
        self.target
    }
}

impl<EdgeDataT: std::cmp::Eq> EdgeData for InputEdge<EdgeDataT> {
    type DATA = EdgeDataT;
    fn data(&self) -> &Self::DATA {
        &self.data
    }
}

impl<EdgeDataT: Eq> InputEdge<EdgeDataT> {
    pub fn new(source: NodeID, target: NodeID, data: EdgeDataT) -> Self {
        Self {
            source,
            target,
            data,
        }
    }

    pub fn is_parallel_to(&self, other: &Self) -> bool {
        self.source == other.source && self.target == other.target
    }

    pub fn reverse(&mut self) {
        swap(&mut self.source, &mut self.target);
    }
}
pub type SimpleEdge = InputEdge<u32>;

#[test]
fn simple_edge_parallel() {
    let edge1 = SimpleEdge::new(1, 2, 3);
    let edge2 = SimpleEdge::new(1, 2, 6);

    assert!(edge1.is_parallel_to(&edge1));
    assert!(edge1.is_parallel_to(&edge2));
    assert!(edge2.is_parallel_to(&edge1));
    assert!(edge2.is_parallel_to(&edge2));
}

#[test]
fn trivial_edge_accessor() {
    let edge = TrivialEdge {
        source: 1,
        target: 2,
    };

    assert_eq!(edge.source(), 1);
    assert_eq!(edge.target(), 2);
}