modular_bitfield/private/
array_bytes_conv.rs

1use crate::private::SpecifierBytes;
2
3pub trait ArrayBytesConversion {
4    type Array;
5    type Bytes;
6
7    fn bytes_into_array(bytes: Self::Bytes) -> Self::Array;
8    fn array_into_bytes(bytes: Self::Array) -> Self::Bytes;
9}
10
11macro_rules! impl_array_bytes_conversion_for_prim {
12    ( $( $prim:ty ),* ) => {
13        $(
14            impl ArrayBytesConversion for [(); ::core::mem::size_of::<$prim>() * 8] {
15                type Array = [u8; ::core::mem::size_of::<$prim>()];
16                type Bytes = <Self as SpecifierBytes>::Bytes;
17
18                fn bytes_into_array(bytes: Self::Bytes) -> Self::Array {
19                    bytes.to_le_bytes()
20                }
21
22                fn array_into_bytes(bytes: Self::Array) -> Self::Bytes {
23                    <[(); ::core::mem::size_of::<$prim>() * 8] as SpecifierBytes>::Bytes::from_le_bytes(bytes)
24                }
25            }
26        )*
27    };
28}
29impl_array_bytes_conversion_for_prim!(u8, u16, u32, u64, u128);
30
31macro_rules! impl_array_bytes_conversion_for_size {
32    ( $( $size:literal ),* ) => {
33        $(
34            impl ArrayBytesConversion for [(); $size] {
35                type Array = [u8; $size / 8];
36                type Bytes = <Self as SpecifierBytes>::Bytes;
37
38                #[inline]
39                fn bytes_into_array(bytes: Self::Bytes) -> Self::Array {
40                    let array = bytes.to_le_bytes();
41                    debug_assert!(array[($size / 8)..].iter().all(|&byte| byte == 0));
42                    let mut result = <Self::Array>::default();
43                    result.copy_from_slice(&array[0..($size / 8)]);
44                    result
45                }
46
47                #[inline]
48                fn array_into_bytes(bytes: Self::Array) -> Self::Bytes {
49                    let array: Self::Array = bytes;
50                    let mut result = [0; ::core::mem::size_of::<Self::Bytes>()];
51                    result[0..($size / 8)].copy_from_slice(&array[..]);
52                    <Self::Bytes>::from_le_bytes(result)
53                }
54            }
55        )*
56    };
57}
58impl_array_bytes_conversion_for_size!(24, 40, 48, 56, 72, 80, 88, 96, 104, 112, 120);