pkbuffer/
castable.rs

1#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
2use core::arch::aarch64;
3#[cfg(all(target_arch = "wasm32", feature = "wasm_simd"))]
4use core::arch::wasm32;
5#[cfg(target_arch = "x86")]
6use core::arch::x86;
7#[cfg(target_arch = "x86_64")]
8use core::arch::x86_64;
9
10/// Marker trait for castable data.
11///
12/// This trait is important to maintain the defined integrity of casting
13/// against buffers of bytes. There are lots of opportunity for undefined
14/// behavior to happen. By implementing an object as `Castable`, you are
15/// declaring the following:
16///
17/// * The type is inhabited (e.g., no [Infallible](std::convert::Infallible)).
18/// * The type allows any bit pattern (e.g., no `bool` or `char`).
19/// * The type does not contain any padding bytes.
20/// * The type's members are also `Castable`.
21/// * The type is `#[repr(C)]`, `#[repr(transparent)]`, `#[repr(packed)]` or `#[repr(align)]`.
22/// * The type must not use generics.
23///
24/// If you've used the [bytemuck](https://crates.io/crate/bytemuck) library,
25/// these rules will probably seem familiar. You can automatically guarantee these
26/// traits of your data with [the Castable derive macro](pkbuffer_derive::Castable).
27pub unsafe trait Castable {}
28
29unsafe impl Castable for () {}
30unsafe impl Castable for u8 {}
31unsafe impl Castable for i8 {}
32unsafe impl Castable for u16 {}
33unsafe impl Castable for i16 {}
34unsafe impl Castable for u32 {}
35unsafe impl Castable for i32 {}
36unsafe impl Castable for u64 {}
37unsafe impl Castable for i64 {}
38unsafe impl Castable for usize {}
39unsafe impl Castable for isize {}
40unsafe impl Castable for u128 {}
41unsafe impl Castable for i128 {}
42unsafe impl Castable for f32 {}
43unsafe impl Castable for f64 {}
44unsafe impl<T: Castable> Castable for std::num::Wrapping<T> {}
45
46unsafe impl<T: Castable> Castable for std::marker::PhantomData<T> {}
47unsafe impl Castable for std::marker::PhantomPinned {}
48unsafe impl<T: Castable> Castable for std::mem::ManuallyDrop<T> {}
49
50unsafe impl<T, const N: usize> Castable for [T; N] where T: Castable {}
51
52#[cfg(all(target_arch = "wasm32", feature = "wasm_simd"))]
53unsafe impl Castable for wasm32::v128 {}
54
55#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
56unsafe impl Castable for aarch64::float32x2_t {}
57#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
58unsafe impl Castable for aarch64::float32x2x2_t {}
59#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
60unsafe impl Castable for aarch64::float32x2x3_t {}
61#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
62unsafe impl Castable for aarch64::float32x2x4_t {}
63#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
64unsafe impl Castable for aarch64::float32x4_t {}
65#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
66unsafe impl Castable for aarch64::float32x4x2_t {}
67#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
68unsafe impl Castable for aarch64::float32x4x3_t {}
69#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
70unsafe impl Castable for aarch64::float32x4x4_t {}
71#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
72unsafe impl Castable for aarch64::float64x1_t {}
73#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
74unsafe impl Castable for aarch64::float64x1x2_t {}
75#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
76unsafe impl Castable for aarch64::float64x1x3_t {}
77#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
78unsafe impl Castable for aarch64::float64x1x4_t {}
79#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
80unsafe impl Castable for aarch64::float64x2_t {}
81#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
82unsafe impl Castable for aarch64::float64x2x2_t {}
83#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
84unsafe impl Castable for aarch64::float64x2x3_t {}
85#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
86unsafe impl Castable for aarch64::float64x2x4_t {}
87#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
88unsafe impl Castable for aarch64::int16x4_t {}
89#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
90unsafe impl Castable for aarch64::int16x4x2_t {}
91#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
92unsafe impl Castable for aarch64::int16x4x3_t {}
93#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
94unsafe impl Castable for aarch64::int16x4x4_t {}
95#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
96unsafe impl Castable for aarch64::int16x8_t {}
97#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
98unsafe impl Castable for aarch64::int16x8x2_t {}
99#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
100unsafe impl Castable for aarch64::int16x8x3_t {}
101#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
102unsafe impl Castable for aarch64::int16x8x4_t {}
103#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
104unsafe impl Castable for aarch64::int32x2_t {}
105#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
106unsafe impl Castable for aarch64::int32x2x2_t {}
107#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
108unsafe impl Castable for aarch64::int32x2x3_t {}
109#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
110unsafe impl Castable for aarch64::int32x2x4_t {}
111#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
112unsafe impl Castable for aarch64::int32x4_t {}
113#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
114unsafe impl Castable for aarch64::int32x4x2_t {}
115#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
116unsafe impl Castable for aarch64::int32x4x3_t {}
117#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
118unsafe impl Castable for aarch64::int32x4x4_t {}
119#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
120unsafe impl Castable for aarch64::int64x1_t {}
121#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
122unsafe impl Castable for aarch64::int64x1x2_t {}
123#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
124unsafe impl Castable for aarch64::int64x1x3_t {}
125#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
126unsafe impl Castable for aarch64::int64x1x4_t {}
127#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
128unsafe impl Castable for aarch64::int64x2_t {}
129#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
130unsafe impl Castable for aarch64::int64x2x2_t {}
131#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
132unsafe impl Castable for aarch64::int64x2x3_t {}
133#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
134unsafe impl Castable for aarch64::int64x2x4_t {}
135#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
136unsafe impl Castable for aarch64::int8x16_t {}
137#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
138unsafe impl Castable for aarch64::int8x16x2_t {}
139#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
140unsafe impl Castable for aarch64::int8x16x3_t {}
141#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
142unsafe impl Castable for aarch64::int8x16x4_t {}
143#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
144unsafe impl Castable for aarch64::int8x8_t {}
145#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
146unsafe impl Castable for aarch64::int8x8x2_t {}
147#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
148unsafe impl Castable for aarch64::int8x8x3_t {}
149#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
150unsafe impl Castable for aarch64::int8x8x4_t {}
151#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
152unsafe impl Castable for aarch64::poly16x4_t {}
153#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
154unsafe impl Castable for aarch64::poly16x4x2_t {}
155#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
156unsafe impl Castable for aarch64::poly16x4x3_t {}
157#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
158unsafe impl Castable for aarch64::poly16x4x4_t {}
159#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
160unsafe impl Castable for aarch64::poly16x8_t {}
161#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
162unsafe impl Castable for aarch64::poly16x8x2_t {}
163#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
164unsafe impl Castable for aarch64::poly16x8x3_t {}
165#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
166unsafe impl Castable for aarch64::poly16x8x4_t {}
167#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
168unsafe impl Castable for aarch64::poly64x1_t {}
169#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
170unsafe impl Castable for aarch64::poly64x1x2_t {}
171#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
172unsafe impl Castable for aarch64::poly64x1x3_t {}
173#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
174unsafe impl Castable for aarch64::poly64x1x4_t {}
175#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
176unsafe impl Castable for aarch64::poly64x2_t {}
177#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
178unsafe impl Castable for aarch64::poly64x2x2_t {}
179#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
180unsafe impl Castable for aarch64::poly64x2x3_t {}
181#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
182unsafe impl Castable for aarch64::poly64x2x4_t {}
183#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
184unsafe impl Castable for aarch64::poly8x16_t {}
185#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
186unsafe impl Castable for aarch64::poly8x16x2_t {}
187#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
188unsafe impl Castable for aarch64::poly8x16x3_t {}
189#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
190unsafe impl Castable for aarch64::poly8x16x4_t {}
191#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
192unsafe impl Castable for aarch64::poly8x8_t {}
193#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
194unsafe impl Castable for aarch64::poly8x8x2_t {}
195#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
196unsafe impl Castable for aarch64::poly8x8x3_t {}
197#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
198unsafe impl Castable for aarch64::poly8x8x4_t {}
199#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
200unsafe impl Castable for aarch64::uint16x4_t {}
201#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
202unsafe impl Castable for aarch64::uint16x4x2_t {}
203#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
204unsafe impl Castable for aarch64::uint16x4x3_t {}
205#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
206unsafe impl Castable for aarch64::uint16x4x4_t {}
207#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
208unsafe impl Castable for aarch64::uint16x8_t {}
209#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
210unsafe impl Castable for aarch64::uint16x8x2_t {}
211#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
212unsafe impl Castable for aarch64::uint16x8x3_t {}
213#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
214unsafe impl Castable for aarch64::uint16x8x4_t {}
215#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
216unsafe impl Castable for aarch64::uint32x2_t {}
217#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
218unsafe impl Castable for aarch64::uint32x2x2_t {}
219#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
220unsafe impl Castable for aarch64::uint32x2x3_t {}
221#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
222unsafe impl Castable for aarch64::uint32x2x4_t {}
223#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
224unsafe impl Castable for aarch64::uint32x4_t {}
225#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
226unsafe impl Castable for aarch64::uint32x4x2_t {}
227#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
228unsafe impl Castable for aarch64::uint32x4x3_t {}
229#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
230unsafe impl Castable for aarch64::uint32x4x4_t {}
231#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
232unsafe impl Castable for aarch64::uint64x1_t {}
233#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
234unsafe impl Castable for aarch64::uint64x1x2_t {}
235#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
236unsafe impl Castable for aarch64::uint64x1x3_t {}
237#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
238unsafe impl Castable for aarch64::uint64x1x4_t {}
239#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
240unsafe impl Castable for aarch64::uint64x2_t {}
241#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
242unsafe impl Castable for aarch64::uint64x2x2_t {}
243#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
244unsafe impl Castable for aarch64::uint64x2x3_t {}
245#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
246unsafe impl Castable for aarch64::uint64x2x4_t {}
247#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
248unsafe impl Castable for aarch64::uint8x16_t {}
249#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
250unsafe impl Castable for aarch64::uint8x16x2_t {}
251#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
252unsafe impl Castable for aarch64::uint8x16x3_t {}
253#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
254unsafe impl Castable for aarch64::uint8x16x4_t {}
255#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
256unsafe impl Castable for aarch64::uint8x8_t {}
257#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
258unsafe impl Castable for aarch64::uint8x8x2_t {}
259#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
260unsafe impl Castable for aarch64::uint8x8x3_t {}
261#[cfg(all(target_arch = "aarch64", feature = "aarch64_simd"))]
262unsafe impl Castable for aarch64::uint8x8x4_t {}
263
264#[cfg(target_arch = "x86")]
265unsafe impl Castable for x86::__m128i {}
266#[cfg(target_arch = "x86")]
267unsafe impl Castable for x86::__m128 {}
268#[cfg(target_arch = "x86")]
269unsafe impl Castable for x86::__m128d {}
270#[cfg(target_arch = "x86")]
271unsafe impl Castable for x86::__m256i {}
272#[cfg(target_arch = "x86")]
273unsafe impl Castable for x86::__m256 {}
274#[cfg(target_arch = "x86")]
275unsafe impl Castable for x86::__m256d {}
276
277#[cfg(target_arch = "x86_64")]
278unsafe impl Castable for x86_64::__m128i {}
279#[cfg(target_arch = "x86_64")]
280unsafe impl Castable for x86_64::__m128 {}
281#[cfg(target_arch = "x86_64")]
282unsafe impl Castable for x86_64::__m128d {}
283#[cfg(target_arch = "x86_64")]
284unsafe impl Castable for x86_64::__m256i {}
285#[cfg(target_arch = "x86_64")]
286unsafe impl Castable for x86_64::__m256 {}
287#[cfg(target_arch = "x86_64")]
288unsafe impl Castable for x86_64::__m256d {}