1#![allow(clippy::let_and_return)]
12
13use crate::{Peek, Poke};
14use euclid::{Point2D, Rect, Box2D, SideOffsets2D, Size2D, Transform3D, Vector2D};
15
16unsafe impl<T: Poke, U> Poke for Point2D<T, U> {
17 #[inline(always)]
18 fn max_size() -> usize {
19 2 * T::max_size()
20 }
21 #[inline(always)]
22 unsafe fn poke_into(&self, bytes: *mut u8) -> *mut u8 {
23 let bytes = self.x.poke_into(bytes);
24 let bytes = self.y.poke_into(bytes);
25 bytes
26 }
27}
28impl<T: Peek, U> Peek for Point2D<T, U> {
29 #[inline(always)]
30 unsafe fn peek_from(bytes: *const u8, output: *mut Self) -> *const u8 {
31 let bytes = T::peek_from(bytes, &mut (*output).x);
32 let bytes = T::peek_from(bytes, &mut (*output).y);
33 bytes
34 }
35}
36
37unsafe impl<T: Poke, U> Poke for Rect<T, U> {
38 #[inline(always)]
39 fn max_size() -> usize {
40 Point2D::<T, U>::max_size() + Size2D::<T, U>::max_size()
41 }
42 #[inline(always)]
43 unsafe fn poke_into(&self, bytes: *mut u8) -> *mut u8 {
44 let bytes = self.origin.poke_into(bytes);
45 let bytes = self.size.poke_into(bytes);
46 bytes
47 }
48}
49impl<T: Peek, U> Peek for Rect<T, U> {
50 #[inline(always)]
51 unsafe fn peek_from(bytes: *const u8, output: *mut Self) -> *const u8 {
52 let bytes = Point2D::<T, U>::peek_from(bytes, &mut (*output).origin);
53 let bytes = Size2D::<T, U>::peek_from(bytes, &mut (*output).size);
54 bytes
55 }
56}
57
58unsafe impl<T: Poke, U> Poke for Box2D<T, U> {
59 #[inline(always)]
60 fn max_size() -> usize {
61 Point2D::<T, U>::max_size() * 2
62 }
63 #[inline(always)]
64 unsafe fn poke_into(&self, bytes: *mut u8) -> *mut u8 {
65 let bytes = self.min.poke_into(bytes);
66 let bytes = self.max.poke_into(bytes);
67 bytes
68 }
69}
70impl<T: Peek, U> Peek for Box2D<T, U> {
71 #[inline(always)]
72 unsafe fn peek_from(bytes: *const u8, output: *mut Self) -> *const u8 {
73 let bytes = Point2D::<T, U>::peek_from(bytes, &mut (*output).min);
74 let bytes = Point2D::<T, U>::peek_from(bytes, &mut (*output).max);
75 bytes
76 }
77}
78
79unsafe impl<T: Poke, U> Poke for SideOffsets2D<T, U> {
80 #[inline(always)]
81 fn max_size() -> usize {
82 4 * T::max_size()
83 }
84 #[inline(always)]
85 unsafe fn poke_into(&self, bytes: *mut u8) -> *mut u8 {
86 let bytes = self.top.poke_into(bytes);
87 let bytes = self.right.poke_into(bytes);
88 let bytes = self.bottom.poke_into(bytes);
89 let bytes = self.left.poke_into(bytes);
90 bytes
91 }
92}
93impl<T: Peek, U> Peek for SideOffsets2D<T, U> {
94 #[inline(always)]
95 unsafe fn peek_from(bytes: *const u8, output: *mut Self) -> *const u8 {
96 let bytes = T::peek_from(bytes, &mut (*output).top);
97 let bytes = T::peek_from(bytes, &mut (*output).right);
98 let bytes = T::peek_from(bytes, &mut (*output).bottom);
99 let bytes = T::peek_from(bytes, &mut (*output).left);
100 bytes
101 }
102}
103
104unsafe impl<T: Poke, U> Poke for Size2D<T, U> {
105 #[inline(always)]
106 fn max_size() -> usize {
107 2 * T::max_size()
108 }
109 #[inline(always)]
110 unsafe fn poke_into(&self, bytes: *mut u8) -> *mut u8 {
111 let bytes = self.width.poke_into(bytes);
112 let bytes = self.height.poke_into(bytes);
113 bytes
114 }
115}
116impl<T: Peek, U> Peek for Size2D<T, U> {
117 #[inline(always)]
118 unsafe fn peek_from(bytes: *const u8, output: *mut Self) -> *const u8 {
119 let bytes = T::peek_from(bytes, &mut (*output).width);
120 let bytes = T::peek_from(bytes, &mut (*output).height);
121 bytes
122 }
123}
124
125unsafe impl<T: Poke, S, D> Poke for Transform3D<T, S, D> {
126 #[inline(always)]
127 fn max_size() -> usize {
128 16 * T::max_size()
129 }
130 #[inline(always)]
131 unsafe fn poke_into(&self, bytes: *mut u8) -> *mut u8 {
132 let bytes = self.m11.poke_into(bytes);
133 let bytes = self.m12.poke_into(bytes);
134 let bytes = self.m13.poke_into(bytes);
135 let bytes = self.m14.poke_into(bytes);
136 let bytes = self.m21.poke_into(bytes);
137 let bytes = self.m22.poke_into(bytes);
138 let bytes = self.m23.poke_into(bytes);
139 let bytes = self.m24.poke_into(bytes);
140 let bytes = self.m31.poke_into(bytes);
141 let bytes = self.m32.poke_into(bytes);
142 let bytes = self.m33.poke_into(bytes);
143 let bytes = self.m34.poke_into(bytes);
144 let bytes = self.m41.poke_into(bytes);
145 let bytes = self.m42.poke_into(bytes);
146 let bytes = self.m43.poke_into(bytes);
147 let bytes = self.m44.poke_into(bytes);
148 bytes
149 }
150}
151impl<T: Peek, S, D> Peek for Transform3D<T, S, D> {
152 #[inline(always)]
153 unsafe fn peek_from(bytes: *const u8, output: *mut Self) -> *const u8 {
154 let bytes = T::peek_from(bytes, &mut (*output).m11);
155 let bytes = T::peek_from(bytes, &mut (*output).m12);
156 let bytes = T::peek_from(bytes, &mut (*output).m13);
157 let bytes = T::peek_from(bytes, &mut (*output).m14);
158 let bytes = T::peek_from(bytes, &mut (*output).m21);
159 let bytes = T::peek_from(bytes, &mut (*output).m22);
160 let bytes = T::peek_from(bytes, &mut (*output).m23);
161 let bytes = T::peek_from(bytes, &mut (*output).m24);
162 let bytes = T::peek_from(bytes, &mut (*output).m31);
163 let bytes = T::peek_from(bytes, &mut (*output).m32);
164 let bytes = T::peek_from(bytes, &mut (*output).m33);
165 let bytes = T::peek_from(bytes, &mut (*output).m34);
166 let bytes = T::peek_from(bytes, &mut (*output).m41);
167 let bytes = T::peek_from(bytes, &mut (*output).m42);
168 let bytes = T::peek_from(bytes, &mut (*output).m43);
169 let bytes = T::peek_from(bytes, &mut (*output).m44);
170 bytes
171 }
172}
173
174unsafe impl<T: Poke, U> Poke for Vector2D<T, U> {
175 #[inline(always)]
176 fn max_size() -> usize {
177 2 * T::max_size()
178 }
179 #[inline(always)]
180 unsafe fn poke_into(&self, bytes: *mut u8) -> *mut u8 {
181 let bytes = self.x.poke_into(bytes);
182 let bytes = self.y.poke_into(bytes);
183 bytes
184 }
185}
186impl<T: Peek, U> Peek for Vector2D<T, U> {
187 #[inline(always)]
188 unsafe fn peek_from(bytes: *const u8, output: *mut Self) -> *const u8 {
189 let bytes = T::peek_from(bytes, &mut (*output).x);
190 let bytes = T::peek_from(bytes, &mut (*output).y);
191 bytes
192 }
193}