Skip to main content

use_tessellation/
lib.rs

1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4/// Broad tessellation families.
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum TessellationKind {
7    /// Regular tessellation.
8    Regular,
9    /// Semi-regular tessellation.
10    SemiRegular,
11    /// Irregular tessellation.
12    Irregular,
13}
14
15/// A tessellation summary.
16#[derive(Debug, Clone, Copy, PartialEq, Eq)]
17pub struct Tessellation {
18    kind: TessellationKind,
19    tile_count: usize,
20}
21
22impl Tessellation {
23    /// Creates a tessellation with at least one tile.
24    #[must_use]
25    pub const fn new(kind: TessellationKind, tile_count: usize) -> Option<Self> {
26        if tile_count > 0 {
27            Some(Self { kind, tile_count })
28        } else {
29            None
30        }
31    }
32
33    /// Returns the tessellation kind.
34    #[must_use]
35    pub const fn kind(self) -> TessellationKind {
36        self.kind
37    }
38
39    /// Returns the tile count.
40    #[must_use]
41    pub const fn tile_count(self) -> usize {
42        self.tile_count
43    }
44}
45
46/// A tessellation tile identifier.
47#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
48pub struct TileId(pub usize);
49
50#[cfg(test)]
51mod tests {
52    use super::{Tessellation, TessellationKind, TileId};
53
54    #[test]
55    fn stores_tessellation_counts() {
56        let tessellation = Tessellation::new(TessellationKind::Regular, 12).expect("valid");
57
58        assert_eq!(tessellation.kind(), TessellationKind::Regular);
59        assert_eq!(tessellation.tile_count(), 12);
60        assert_eq!(TileId(3).0, 3);
61    }
62}