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}