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);