1 use core::mem::{size_of, transmute};
2 
3 use crate::traits::Sealed;
4 
5 macro_rules! impl_int_v1_32 {
6     ($(($trait:ident, $type:ty)),+) => {$(
7         pub trait $trait: Sealed<$type> {
8             fn to_be_bytes(self) -> [u8; size_of::<$type>()];
9             fn to_le_bytes(self) -> [u8; size_of::<$type>()];
10             fn to_ne_bytes(self) -> [u8; size_of::<$type>()];
11             fn from_be_bytes(bytes: [u8; size_of::<$type>()]) -> Self;
12             fn from_le_bytes(bytes: [u8; size_of::<$type>()]) -> Self;
13             fn from_ne_bytes(bytes: [u8; size_of::<$type>()]) -> Self;
14         }
15 
16         impl $trait for $type {
17             #[inline]
18             fn to_be_bytes(self) -> [u8; size_of::<Self>()] {
19                 self.to_be().to_ne_bytes()
20             }
21 
22             #[inline]
23             fn to_le_bytes(self) -> [u8; size_of::<Self>()] {
24                 self.to_le().to_ne_bytes()
25             }
26 
27             #[inline]
28             fn to_ne_bytes(self) -> [u8; size_of::<Self>()] {
29                 unsafe { transmute(self) }
30             }
31 
32             #[inline]
33             fn from_be_bytes(bytes: [u8; size_of::<Self>()]) -> Self {
34                 Self::from_be(Self::from_ne_bytes(bytes))
35             }
36 
37             #[inline]
38             fn from_le_bytes(bytes: [u8; size_of::<Self>()]) -> Self {
39                 Self::from_le(Self::from_ne_bytes(bytes))
40             }
41 
42             #[inline]
43             fn from_ne_bytes(bytes: [u8; size_of::<Self>()]) -> Self {
44                 unsafe { transmute(bytes) }
45             }
46         }
47     )+};
48 }
49 
50 impl_int_v1_32![
51     (u8_v1_32, u8),
52     (u16_v1_32, u16),
53     (u32_v1_32, u32),
54     (u64_v1_32, u64),
55     (u128_v1_32, u128),
56     (usize_v1_32, usize),
57     (i8_v1_32, i8),
58     (i16_v1_32, i16),
59     (i32_v1_32, i32),
60     (i64_v1_32, i64),
61     (i128_v1_32, i128),
62     (isize_v1_32, isize)
63 ];
64