Skip to main content

use_polyhedral_net/
lib.rs

1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4/// An adjacency edge in a polyhedral net.
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub struct NetEdge {
7    first_face: usize,
8    second_face: usize,
9}
10
11impl NetEdge {
12    /// Creates a net edge.
13    #[must_use]
14    pub const fn new(first_face: usize, second_face: usize) -> Self {
15        Self {
16            first_face,
17            second_face,
18        }
19    }
20
21    /// Returns the adjacent face indices.
22    #[must_use]
23    pub const fn faces(self) -> (usize, usize) {
24        (self.first_face, self.second_face)
25    }
26}
27
28/// A polyhedral net descriptor.
29#[derive(Debug, Clone, PartialEq, Eq)]
30pub struct PolyhedralNet {
31    face_count: usize,
32    edges: Vec<NetEdge>,
33}
34
35impl PolyhedralNet {
36    /// Creates a polyhedral net with at least one face.
37    #[must_use]
38    pub fn new(face_count: usize, edges: Vec<NetEdge>) -> Option<Self> {
39        if face_count > 0 {
40            Some(Self { face_count, edges })
41        } else {
42            None
43        }
44    }
45
46    /// Returns the face count.
47    #[must_use]
48    pub const fn face_count(&self) -> usize {
49        self.face_count
50    }
51
52    /// Returns the adjacency edges.
53    #[must_use]
54    pub fn edges(&self) -> &[NetEdge] {
55        &self.edges
56    }
57
58    /// Returns the adjacency count.
59    #[must_use]
60    pub fn adjacency_count(&self) -> usize {
61        self.edges.len()
62    }
63}
64
65#[cfg(test)]
66mod tests {
67    use super::{NetEdge, PolyhedralNet};
68
69    #[test]
70    fn stores_polyhedral_nets() {
71        let edge = NetEdge::new(0, 1);
72        let net = PolyhedralNet::new(6, vec![edge]).expect("valid net");
73
74        assert_eq!(edge.faces(), (0, 1));
75        assert_eq!(net.face_count(), 6);
76        assert_eq!(net.adjacency_count(), 1);
77        assert_eq!(net.edges(), &[edge]);
78    }
79}