intsplit 0.1.0

Rust library for splitting numeric types into their binary component arrays
Documentation
#![no_std]

pub trait Split16 : private::Sealed + Sized {
    fn as_u8_array(self) -> [u8; 2];

    #[inline]
    fn as_i8_array(self) -> [i8; 2] {
        let n = self.as_u8_array();
        return [
            n[0] as i8,
            n[1] as i8
        ]
    }
}

impl Split16 for u16 {

    #[inline]
    fn as_u8_array(self) -> [u8; 2] {
        self.to_ne_bytes()
    }
}

impl Split16 for i16 {

    #[inline]
    fn as_u8_array(self) -> [u8; 2] {
        self.to_ne_bytes()
    }
}

pub trait Split32 : private::Sealed + Sized {
    fn as_u8_array(self) -> [u8; 4];

    #[inline]
    fn as_i8_array(self) -> [i8; 4] {
        let n = self.as_u8_array();
        return [
            n[0] as i8,
            n[1] as i8,
            n[2] as i8,
            n[3] as i8
        ]
    }

    #[inline]
    fn as_u16_array(self) -> [u16; 2] {
        let n = self.as_u8_array();
        return [
            u16::from_ne_bytes([n[0], n[1]]),
            u16::from_ne_bytes([n[2], n[3]]),
        ]
    }

    #[inline]
    fn as_i16_array(self) -> [i16; 2] {
        let n = self.as_u8_array();
        return [
            i16::from_ne_bytes([n[0], n[1]]),
            i16::from_ne_bytes([n[2], n[3]]),
        ]
    }
}

impl Split32 for u32 {

    #[inline]
    fn as_u8_array(self) -> [u8; 4] {
        self.to_ne_bytes()
    }
}

impl Split32 for i32 {

    #[inline]
    fn as_u8_array(self) -> [u8; 4] {
        self.to_ne_bytes()
    }
}

impl Split32 for f32 {

    #[inline]
    fn as_u8_array(self) -> [u8; 4] {
        self.to_ne_bytes()
    }
}

pub trait Split64 : private::Sealed + Sized {
    fn as_u8_array(self) -> [u8; 8];

    #[inline]
    fn as_i8_array(self) -> [i8; 8] {
        let n = self.as_u8_array();
        return [
            n[0] as i8,
            n[1] as i8,
            n[2] as i8,
            n[3] as i8,
            n[4] as i8,
            n[5] as i8,
            n[6] as i8,
            n[7] as i8,
        ]
    }

    #[inline]
    fn as_u16_array(self) -> [u16; 4] {
        let n = self.as_u8_array();
        return [
            u16::from_ne_bytes([n[0], n[1]]),
            u16::from_ne_bytes([n[2], n[3]]),
            u16::from_ne_bytes([n[4], n[5]]),
            u16::from_ne_bytes([n[6], n[7]]),
        ]
    }

    #[inline]
    fn as_i16_array(self) -> [i16; 4] {
        let n = self.as_u8_array();
        return [
            i16::from_ne_bytes([n[0], n[1]]),
            i16::from_ne_bytes([n[2], n[3]]),
            i16::from_ne_bytes([n[4], n[5]]),
            i16::from_ne_bytes([n[6], n[7]]),
        ]
    }

    #[inline]
    fn as_u32_array(self) -> [u32; 2] {
        let n = self.as_u8_array();
        return [
            u32::from_ne_bytes([n[0], n[1], n[2], n[3]]),
            u32::from_ne_bytes([n[4], n[5], n[6], n[7]]),
        ]
    }

    #[inline]
    fn as_i32_array(self) -> [i32; 2] {
        let n = self.as_u8_array();
        return [
            i32::from_ne_bytes([n[0], n[1], n[2], n[3]]),
            i32::from_ne_bytes([n[4], n[5], n[6], n[7]]),
        ]
    }

    #[inline]
    fn as_f32_array(self) -> [f32; 2] {
        let n = self.as_u8_array();
        return [
            f32::from_ne_bytes([n[0], n[1], n[2], n[3]]),
            f32::from_ne_bytes([n[4], n[5], n[6], n[7]]),
        ]
    }
}

impl Split64 for u64 {

    #[inline]
    fn as_u8_array(self) -> [u8; 8] {
        self.to_ne_bytes()
    }
}

impl Split64 for i64 {

    #[inline]
    fn as_u8_array(self) -> [u8; 8] {
        self.to_ne_bytes()
    }
}

impl Split64 for f64 {

    #[inline]
    fn as_u8_array(self) -> [u8; 8] {
        self.to_ne_bytes()
    }
}

pub trait Split128 : private::Sealed + Sized {
    fn as_u8_array(self) -> [u8; 16];


    #[inline]
    fn as_i8_array(self) -> [i8; 16] {
        let n = self.as_u8_array();
        return [
            n[0] as i8,
            n[1] as i8,
            n[2] as i8,
            n[3] as i8,
            n[4] as i8,
            n[5] as i8,
            n[6] as i8,
            n[7] as i8,
            n[8] as i8,
            n[9] as i8,
            n[10] as i8,
            n[11] as i8,
            n[12] as i8,
            n[13] as i8,
            n[14] as i8,
            n[15] as i8,
        ]
    }

    #[inline]
    fn as_u16_array(self) -> [u16; 8] {
        let n = self.as_u8_array();
        return [
            u16::from_ne_bytes([n[0], n[1]]),
            u16::from_ne_bytes([n[2], n[3]]),
            u16::from_ne_bytes([n[4], n[5]]),
            u16::from_ne_bytes([n[6], n[7]]),
            u16::from_ne_bytes([n[8], n[9]]),
            u16::from_ne_bytes([n[10], n[11]]),
            u16::from_ne_bytes([n[12], n[13]]),
            u16::from_ne_bytes([n[14], n[15]]),
        ]
    }

    #[inline]
    fn as_i16_array(self) -> [i16; 8] {
        let n = self.as_u8_array();
        return [
            i16::from_ne_bytes([n[0], n[1]]),
            i16::from_ne_bytes([n[2], n[3]]),
            i16::from_ne_bytes([n[4], n[5]]),
            i16::from_ne_bytes([n[6], n[7]]),
            i16::from_ne_bytes([n[8], n[9]]),
            i16::from_ne_bytes([n[10], n[11]]),
            i16::from_ne_bytes([n[12], n[13]]),
            i16::from_ne_bytes([n[14], n[15]]),
        ]
    }

    #[inline]
    fn as_u32_array(self) -> [u32; 4] {
        let n = self.as_u8_array();
        return [
            u32::from_ne_bytes([n[0], n[1], n[2], n[3]]),
            u32::from_ne_bytes([n[4], n[5], n[6], n[7]]),
            u32::from_ne_bytes([n[8], n[9], n[10], n[11]]),
            u32::from_ne_bytes([n[12], n[13], n[14], n[15]]),
        ]
    }

    #[inline]
    fn as_i32_array(self) -> [i32; 4] {
        let n = self.as_u8_array();
        return [
            i32::from_ne_bytes([n[0], n[1], n[2], n[3]]),
            i32::from_ne_bytes([n[4], n[5], n[6], n[7]]),
            i32::from_ne_bytes([n[8], n[9], n[10], n[11]]),
            i32::from_ne_bytes([n[12], n[13], n[14], n[15]]),
        ]
    }

    #[inline]
    fn as_f32_array(self) -> [f32; 4] {
        let n = self.as_u8_array();
        return [
            f32::from_ne_bytes([n[0], n[1], n[2], n[3]]),
            f32::from_ne_bytes([n[4], n[5], n[6], n[7]]),
            f32::from_ne_bytes([n[8], n[9], n[10], n[11]]),
            f32::from_ne_bytes([n[12], n[13], n[14], n[15]]),
        ]
    }

    #[inline]
    fn as_u64_array(self) -> [u64; 2] {
        let n = self.as_u8_array();
        return [
            u64::from_ne_bytes([n[0], n[1], n[2], n[3],n[4], n[5], n[6], n[7]]),
            u64::from_ne_bytes([n[8], n[9], n[10], n[11],n[12], n[13], n[14], n[15]]),
        ]
    }

    #[inline]
    fn as_i64_array(self) -> [i64; 2] {
        let n = self.as_u8_array();
        return [
            i64::from_ne_bytes([n[0], n[1], n[2], n[3],n[4], n[5], n[6], n[7]]),
            i64::from_ne_bytes([n[8], n[9], n[10], n[11],n[12], n[13], n[14], n[15]]),
        ]
    }

    #[inline]
    fn as_f64_array(self) -> [f64; 2] {
        let n = self.as_u8_array();
        return [
            f64::from_ne_bytes([n[0], n[1], n[2], n[3],n[4], n[5], n[6], n[7]]),
            f64::from_ne_bytes([n[8], n[9], n[10], n[11],n[12], n[13], n[14], n[15]]),
        ]
    }
}

impl Split128 for u128 {

    #[inline]
    fn as_u8_array(self) -> [u8; 16] {
        self.to_ne_bytes()
    }
}

impl Split128 for i128 {

    #[inline]
    fn as_u8_array(self) -> [u8; 16] {
        self.to_ne_bytes()
    }
}

pub(crate) mod private {
    pub trait Sealed {

    }

    impl Sealed for u16 {

    }
    impl Sealed for i16 {

    }
    impl Sealed for u32 {

    }
    impl Sealed for i32 {

    }
    impl Sealed for u64 {

    }
    impl Sealed for i64 {

    }
    impl Sealed for u128 {

    }
    impl Sealed for i128 {

    }
    impl Sealed for f32 {

    }
    impl Sealed for f64 {

    }
}