traiter/numbers/from_bytes.rs
1use super::try_from_bytes::TryFromBytes;
2use super::types::Endianness;
3
4pub trait FromBytes {
5    /// Creates number from its byte array representation in given endianness.
6    /// ```
7    /// use traiter::numbers::{Endianness, FromBytes};
8    /// /// signed integers
9    /// assert_eq!(
10    ///     <i8 as FromBytes>::from_bytes(&[255u8], Endianness::Big), -1i8
11    /// );
12    /// assert_eq!(
13    ///     <i8 as FromBytes>::from_bytes(&[0u8], Endianness::Big), 0i8
14    /// );
15    /// assert_eq!(
16    ///     <i8 as FromBytes>::from_bytes(&[1u8], Endianness::Big), 1i8
17    /// );
18    /// /// unsigned integers
19    /// assert_eq!(
20    ///     <u8 as FromBytes>::from_bytes(&[0u8], Endianness::Big), 0u8
21    /// );
22    /// assert_eq!(
23    ///     <u8 as FromBytes>::from_bytes(&[1u8], Endianness::Big), 1u8
24    /// );
25    /// assert_eq!(
26    ///     <u8 as FromBytes>::from_bytes(&[2u8], Endianness::Big), 2u8
27    /// );
28    /// ```
29    fn from_bytes(bytes: &[u8], endianness: Endianness) -> Self;
30}
31
32macro_rules! integer_from_bytes_impl {
33    ($($integer:ty)*) => ($(
34        impl FromBytes for $integer {
35            #[inline(always)]
36            fn from_bytes(bytes: &[u8], endianness: Endianness) -> Self {
37                <$integer>::try_from_bytes(bytes, endianness).unwrap()
38            }
39        }
40    )*)
41}
42
43integer_from_bytes_impl!(
44    i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize
45);