Skip to main content

use_dimension/
lib.rs

1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4/// A positive spatial dimension count.
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub struct Dimension(usize);
7
8impl Dimension {
9    /// One-dimensional space.
10    pub const ONE: Self = Self(1);
11    /// Two-dimensional space.
12    pub const TWO: Self = Self(2);
13    /// Three-dimensional space.
14    pub const THREE: Self = Self(3);
15
16    /// Creates a positive dimension count.
17    #[must_use]
18    pub const fn new(value: usize) -> Option<Self> {
19        if value == 0 { None } else { Some(Self(value)) }
20    }
21
22    /// Creates a dimension count without checking whether it is positive.
23    #[must_use]
24    pub const fn new_unchecked(value: usize) -> Self {
25        Self(value)
26    }
27
28    /// Returns the numeric dimension count.
29    #[must_use]
30    pub const fn value(self) -> usize {
31        self.0
32    }
33
34    /// Returns `true` for dimensions commonly used as spatial geometry.
35    #[must_use]
36    pub const fn is_spatial(self) -> bool {
37        self.0 <= 3
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::Dimension;
44
45    #[test]
46    fn validates_positive_dimensions() {
47        assert_eq!(Dimension::new(0), None);
48        assert_eq!(Dimension::new(2), Some(Dimension::TWO));
49        assert_eq!(Dimension::THREE.value(), 3);
50        assert!(Dimension::THREE.is_spatial());
51        assert!(!Dimension::new_unchecked(4).is_spatial());
52    }
53}