Skip to main content

mtl_foundation/
types.rs

1//! Foundation type definitions.
2//!
3//! Corresponds to `Foundation/NSTypes.hpp`.
4//!
5//! # C++ Equivalent
6//!
7//! ```cpp
8//! namespace NS {
9//! using TimeInterval = double;
10//! using Integer = std::intptr_t;
11//! using UInteger = std::uintptr_t;
12//!
13//! const Integer  IntegerMax = INTPTR_MAX;
14//! const Integer  IntegerMin = INTPTR_MIN;
15//! const UInteger UIntegerMax = UINTPTR_MAX;
16//!
17//! struct OperatingSystemVersion {
18//!     Integer majorVersion;
19//!     Integer minorVersion;
20//!     Integer patchVersion;
21//! } _NS_PACKED;
22//! }
23//! ```
24
25/// Time interval in seconds.
26///
27/// C++ equivalent: `NS::TimeInterval`
28pub type TimeInterval = f64;
29
30/// Signed integer type (pointer-sized).
31///
32/// C++ equivalent: `NS::Integer` (`std::intptr_t`)
33pub type Integer = isize;
34
35/// Unsigned integer type (pointer-sized).
36///
37/// C++ equivalent: `NS::UInteger` (`std::uintptr_t`)
38pub type UInteger = usize;
39
40/// Maximum value for Integer.
41///
42/// C++ equivalent: `NS::IntegerMax`
43pub const INTEGER_MAX: Integer = isize::MAX;
44
45/// Minimum value for Integer.
46///
47/// C++ equivalent: `NS::IntegerMin`
48pub const INTEGER_MIN: Integer = isize::MIN;
49
50/// Maximum value for UInteger.
51///
52/// C++ equivalent: `NS::UIntegerMax`
53pub const UINTEGER_MAX: UInteger = usize::MAX;
54
55/// Operating system version structure.
56///
57/// C++ equivalent: `NS::OperatingSystemVersion`
58#[repr(C, packed)]
59#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
60pub struct OperatingSystemVersion {
61    /// Major version number.
62    pub major_version: Integer,
63    /// Minor version number.
64    pub minor_version: Integer,
65    /// Patch version number.
66    pub patch_version: Integer,
67}
68
69impl OperatingSystemVersion {
70    /// Create a new operating system version.
71    #[inline]
72    pub const fn new(major: Integer, minor: Integer, patch: Integer) -> Self {
73        Self {
74            major_version: major,
75            minor_version: minor,
76            patch_version: patch,
77        }
78    }
79}
80
81#[cfg(test)]
82mod tests {
83    use super::*;
84
85    #[test]
86    fn test_type_sizes() {
87        assert_eq!(std::mem::size_of::<Integer>(), std::mem::size_of::<isize>());
88        assert_eq!(
89            std::mem::size_of::<UInteger>(),
90            std::mem::size_of::<usize>()
91        );
92        assert_eq!(
93            std::mem::size_of::<TimeInterval>(),
94            std::mem::size_of::<f64>()
95        );
96    }
97
98    #[test]
99    fn test_operating_system_version() {
100        let version = OperatingSystemVersion::new(14, 0, 1);
101        let major = { version.major_version };
102        let minor = { version.minor_version };
103        let patch = { version.patch_version };
104        assert_eq!(major, 14);
105        assert_eq!(minor, 0);
106        assert_eq!(patch, 1);
107    }
108}