flatty_base/
primitive.rs

1use crate::{
2    error::Error,
3    traits::{Flat, FlatSized, FlatValidate},
4};
5use core::marker::PhantomData;
6
7/// Macro for implementing [`Flat`] for primitive types.
8///
9/// # Safety
10///
11/// `$ty` must be [`Sized`]` + `[`Copy`].
12///
13/// Any possible memory state of the variable of the type must be valid.
14macro_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] {}