use_polyhedral_net/
lib.rs1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub struct NetEdge {
7 first_face: usize,
8 second_face: usize,
9}
10
11impl NetEdge {
12 #[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 #[must_use]
23 pub const fn faces(self) -> (usize, usize) {
24 (self.first_face, self.second_face)
25 }
26}
27
28#[derive(Debug, Clone, PartialEq, Eq)]
30pub struct PolyhedralNet {
31 face_count: usize,
32 edges: Vec<NetEdge>,
33}
34
35impl PolyhedralNet {
36 #[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 #[must_use]
48 pub const fn face_count(&self) -> usize {
49 self.face_count
50 }
51
52 #[must_use]
54 pub fn edges(&self) -> &[NetEdge] {
55 &self.edges
56 }
57
58 #[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}