Skip to main content

cesr/core/primitives/
number.rs

1use crate::core::matter::code::NumberCode;
2
3/// An unsigned integer with an automatically selected CESR number code.
4#[derive(Debug, Clone, PartialEq, Eq)]
5pub struct Number {
6    code: NumberCode,
7    value: u128,
8}
9
10impl Number {
11    /// Creates a `Number` choosing the smallest code that fits `value`.
12    #[must_use]
13    pub const fn new(value: u128) -> Self {
14        let code = NumberCode::for_value(value);
15        Self { code, value }
16    }
17
18    /// Creates a `Number` with an explicitly specified code.
19    #[must_use]
20    pub const fn with_code(code: NumberCode, value: u128) -> Self {
21        Self { code, value }
22    }
23
24    /// Returns the CESR number code for this value.
25    #[must_use]
26    pub const fn code(&self) -> &NumberCode {
27        &self.code
28    }
29
30    /// Returns the raw integer value.
31    #[must_use]
32    pub const fn value(&self) -> u128 {
33        self.value
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40    use crate::core::matter::code::NumberCode;
41
42    #[test]
43    fn number_picks_smallest_code() {
44        let n_short = Number::new(255);
45        assert_eq!(*n_short.code(), NumberCode::Short);
46        assert_eq!(n_short.value(), 255);
47
48        let n_long = Number::new(0xFFFF_FFFF);
49        assert_eq!(*n_long.code(), NumberCode::Long);
50
51        let n_big = Number::new(u128::from(u64::MAX));
52        assert_eq!(*n_big.code(), NumberCode::Big);
53    }
54
55    #[test]
56    fn number_zero() {
57        let n = Number::new(0);
58        assert_eq!(*n.code(), NumberCode::Short);
59        assert_eq!(n.value(), 0);
60    }
61}