1use crate::{
2 error::Error,
3 traits::{Flat, FlatSized, FlatValidate},
4};
5use core::marker::PhantomData;
6
7macro_rules! impl_flat_prim {
15 ($ty:ty) => {
16 unsafe impl FlatValidate for $ty {
17 unsafe fn validate_unchecked(_: &[u8]) -> Result<(), Error> {
18 Ok(())
19 }
20 }
21 unsafe impl Flat for $ty {}
22 };
23}
24
25impl_flat_prim!(());
26
27impl_flat_prim!(u8);
28impl_flat_prim!(u16);
29impl_flat_prim!(u32);
30impl_flat_prim!(u64);
31impl_flat_prim!(u128);
32impl_flat_prim!(usize);
33
34impl_flat_prim!(i8);
35impl_flat_prim!(i16);
36impl_flat_prim!(i32);
37impl_flat_prim!(i64);
38impl_flat_prim!(i128);
39impl_flat_prim!(isize);
40
41impl_flat_prim!(f32);
42impl_flat_prim!(f64);
43
44unsafe impl<T: Flat> FlatValidate for PhantomData<T> {
45 unsafe fn validate_unchecked(_: &[u8]) -> Result<(), Error> {
46 Ok(())
47 }
48}
49unsafe impl<T: Flat> Flat for PhantomData<T> {}
50
51unsafe impl<T: Flat, const N: usize> FlatValidate for [T; N] {
52 unsafe fn validate_unchecked(bytes: &[u8]) -> Result<(), Error> {
53 for i in 0..N {
54 T::validate_unchecked(bytes.get_unchecked((i * T::SIZE)..).get_unchecked(..T::SIZE))?;
55 }
56 Ok(())
57 }
58}
59unsafe impl<T: Flat, const N: usize> Flat for [T; N] {}