objc2_foundation/
geometry.rs1use objc2::encode::{Encode, Encoding, RefEncode};
2use objc2::ffi::NSUInteger;
3
4#[cfg(feature = "objc2-core-foundation")]
5use objc2_core_foundation::{CGPoint, CGRect, CGSize};
6
7#[cfg(feature = "objc2-core-foundation")]
14pub type NSPoint = CGPoint;
15
16#[cfg(feature = "objc2-core-foundation")]
23pub type NSSize = CGSize;
24
25#[cfg(feature = "objc2-core-foundation")]
32pub type NSRect = CGRect;
33
34#[repr(transparent)]
36#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
37pub struct NSRectEdge(pub NSUInteger);
38
39unsafe impl Encode for NSRectEdge {
40 const ENCODING: Encoding = NSUInteger::ENCODING;
41}
42
43unsafe impl RefEncode for NSRectEdge {
44 const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
45}
46
47#[allow(non_upper_case_globals)]
48impl NSRectEdge {
49 #[doc(alias = "NSRectEdgeMinX")]
50 pub const MinX: Self = Self(0);
51 #[doc(alias = "NSRectEdgeMinY")]
52 pub const MinY: Self = Self(1);
53 #[doc(alias = "NSRectEdgeMaxX")]
54 pub const MaxX: Self = Self(2);
55 #[doc(alias = "NSRectEdgeMaxY")]
56 pub const MaxY: Self = Self(3);
57 pub const NSMinXEdge: Self = Self(NSRectEdge::MinX.0);
58 pub const NSMinYEdge: Self = Self(NSRectEdge::MinY.0);
59 pub const NSMaxXEdge: Self = Self(NSRectEdge::MaxX.0);
60 pub const NSMaxYEdge: Self = Self(NSRectEdge::MaxY.0);
61}
62
63#[cfg(test)]
64mod tests {
65 #[test]
69 #[cfg(any(
70 all(target_vendor = "apple", target_os = "macos"), feature = "gnustep-1-7"
72 ))]
73 #[cfg(feature = "objc2-core-foundation")]
74 fn test_partial_eq() {
75 use super::*;
76 use crate::{NSEqualPoints, NSEqualRects, NSEqualSizes};
77 use objc2_core_foundation::CGFloat;
78
79 let cases: &[(CGFloat, CGFloat)] = &[
82 (0.0, 0.0),
83 (-0.0, -0.0),
84 (0.0, -0.0),
85 (1.0, 1.0 + CGFloat::EPSILON),
86 (0.0, CGFloat::MIN_POSITIVE),
87 (0.0, CGFloat::EPSILON),
88 (1.0, 1.0),
89 (1.0, -1.0),
90 (CGFloat::INFINITY, CGFloat::INFINITY),
92 (CGFloat::INFINITY, CGFloat::NEG_INFINITY),
93 (CGFloat::NEG_INFINITY, CGFloat::NEG_INFINITY),
94 (CGFloat::NAN, 0.0),
96 (CGFloat::NAN, 1.0),
97 (CGFloat::NAN, CGFloat::NAN),
98 (CGFloat::NAN, -CGFloat::NAN),
99 (-CGFloat::NAN, -CGFloat::NAN),
100 (CGFloat::NAN, CGFloat::INFINITY),
101 ];
102
103 for case in cases {
104 let point_a = NSPoint::new(case.0, case.1);
105 let point_b = NSPoint::new(case.0, case.1);
106 let actual = unsafe { NSEqualPoints(point_a, point_b) };
107 assert_eq!(point_a == point_b, actual);
108
109 if case.0 >= 0.0 && case.1 >= 0.0 {
110 let size_a = NSSize::new(case.0, case.1);
111 let size_b = NSSize::new(case.0, case.1);
112 let actual = unsafe { NSEqualSizes(size_a, size_b) };
113 assert_eq!(size_a == size_b, actual);
114
115 let rect_a = NSRect::new(point_a, size_a);
116 let rect_b = NSRect::new(point_b, size_b);
117 let actual = unsafe { NSEqualRects(rect_a, rect_b) };
118 assert_eq!(rect_a == rect_b, actual);
119 }
120 }
121 }
122}