Skip to main content

oxicuda_graphalg/repr/
edge_list.rs

1//! Edge list representation.
2
3use crate::error::{GraphalgError, GraphalgResult};
4
5/// Edge list: list of `(u, v)` pairs.
6#[derive(Debug, Clone)]
7pub struct EdgeList {
8    pub n: usize,
9    pub edges: Vec<(usize, usize)>,
10}
11
12impl EdgeList {
13    pub fn new(n: usize) -> Self {
14        Self {
15            n,
16            edges: Vec::new(),
17        }
18    }
19
20    pub fn add_edge(&mut self, u: usize, v: usize) -> GraphalgResult<()> {
21        if u >= self.n || v >= self.n {
22            return Err(GraphalgError::IndexOutOfBounds {
23                index: u.max(v),
24                len: self.n,
25            });
26        }
27        self.edges.push((u, v));
28        Ok(())
29    }
30
31    pub fn num_edges(&self) -> usize {
32        self.edges.len()
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn build_edge_list() {
42        let mut e = EdgeList::new(4);
43        e.add_edge(0, 1).expect("ok");
44        e.add_edge(1, 2).expect("ok");
45        e.add_edge(2, 3).expect("ok");
46        assert_eq!(e.num_edges(), 3);
47    }
48}