#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Connectivity {
Face,
Edge,
EdgeMid,
Corner,
}
impl Connectivity {
pub fn offsets(self) -> &'static [(i32, i32, i32)] {
match self {
Connectivity::Face => &FACE,
Connectivity::Edge => &EDGE,
Connectivity::EdgeMid => &EDGE_MID,
Connectivity::Corner => &CORNER,
}
}
}
const FACE: [(i32, i32, i32); 6] = [
(1, 0, 0),
(-1, 0, 0),
(0, 1, 0),
(0, -1, 0),
(0, 0, 1),
(0, 0, -1),
];
const EDGE: [(i32, i32, i32); 14] = [
(1, 0, 0),
(-1, 0, 0),
(0, 1, 0),
(0, -1, 0),
(0, 0, 1),
(0, 0, -1),
(1, 1, 0),
(-1, 1, 0),
(0, 1, 1),
(0, 1, -1),
(1, -1, 0),
(-1, -1, 0),
(0, -1, 1),
(0, -1, -1),
];
const EDGE_MID: [(i32, i32, i32); 18] = [
(1, 0, 0),
(-1, 0, 0),
(0, 1, 0),
(0, -1, 0),
(0, 0, 1),
(0, 0, -1),
(1, 1, 0),
(-1, 1, 0),
(0, 1, 1),
(0, 1, -1),
(1, -1, 0),
(-1, -1, 0),
(0, -1, 1),
(0, -1, -1),
(1, 0, 1),
(-1, 0, 1),
(1, 0, -1),
(-1, 0, -1),
];
const CORNER: [(i32, i32, i32); 26] = [
(1, 0, 0),
(-1, 0, 0),
(0, 1, 0),
(0, -1, 0),
(0, 0, 1),
(0, 0, -1),
(1, 1, 0),
(-1, 1, 0),
(0, 1, 1),
(0, 1, -1),
(1, -1, 0),
(-1, -1, 0),
(0, -1, 1),
(0, -1, -1),
(1, 0, 1),
(-1, 0, 1),
(1, 0, -1),
(-1, 0, -1),
(1, 1, 1),
(-1, 1, 1),
(1, 1, -1),
(-1, 1, -1),
(1, -1, 1),
(-1, -1, 1),
(1, -1, -1),
(-1, -1, -1),
];
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn offset_counts() {
assert_eq!(Connectivity::Face.offsets().len(), 6);
assert_eq!(Connectivity::Edge.offsets().len(), 14);
assert_eq!(Connectivity::EdgeMid.offsets().len(), 18);
assert_eq!(Connectivity::Corner.offsets().len(), 26);
}
#[test]
fn no_duplicate_offsets() {
for conn in [
Connectivity::Face,
Connectivity::Edge,
Connectivity::EdgeMid,
Connectivity::Corner,
] {
let mut seen: Vec<_> = conn.offsets().to_vec();
seen.sort();
let len = seen.len();
seen.dedup();
assert_eq!(seen.len(), len, "duplicates in {:?}", conn);
}
}
#[test]
fn no_zero_offset() {
for conn in [
Connectivity::Face,
Connectivity::Edge,
Connectivity::EdgeMid,
Connectivity::Corner,
] {
for &o in conn.offsets() {
assert_ne!(o, (0, 0, 0), "(0,0,0) is self, not a neighbour");
}
}
}
}