bitcode 0.6.9

bitcode is a bitwise binary serializer
Documentation
use crate::convert::{impl_convert, ConvertFrom};
use crate::int::ranged_int;
use time::Time;

ranged_int!(Hour, u8, 0, 23);
ranged_int!(Minute, u8, 0, 59);
ranged_int!(Second, u8, 0, 59);
ranged_int!(Nanosecond, u32, 0, 999_999_999);

type TimeEncode = (u8, u8, u8, u32);
type TimeDecode = (Hour, Minute, Second, Nanosecond);
impl_convert!(Time, TimeEncode, TimeDecode);

impl ConvertFrom<&Time> for TimeEncode {
    #[inline(always)]
    fn convert_from(value: &Time) -> Self {
        value.as_hms_nano()
    }
}

impl ConvertFrom<TimeDecode> for Time {
    #[inline(always)]
    fn convert_from(value: TimeDecode) -> Self {
        Time::from_hms_nano(
            value.0.into_inner(),
            value.1.into_inner(),
            value.2.into_inner(),
            value.3.into_inner(),
        )
        .unwrap()
    }
}

#[cfg(test)]
mod tests {
    #[test]
    fn test() {
        assert!(crate::decode::<Time>(&crate::encode(
            &Time::from_hms_nano(23, 59, 59, 999_999_999).unwrap()
        ))
        .is_ok());
        assert!(crate::decode::<Time>(&crate::encode(&(23u8, 59u8, 59u8, 999_999_999u32))).is_ok());
        assert!(
            crate::decode::<Time>(&crate::encode(&(24u8, 59u8, 59u8, 999_999_999u32))).is_err()
        );
        assert!(
            crate::decode::<Time>(&crate::encode(&(23u8, 60u8, 59u8, 999_999_999u32))).is_err()
        );
        assert!(
            crate::decode::<Time>(&crate::encode(&(23u8, 59u8, 60u8, 999_999_999u32))).is_err()
        );
        assert!(
            crate::decode::<Time>(&crate::encode(&(23u8, 59u8, 59u8, 1_000_000_000u32))).is_err()
        );
    }

    use alloc::vec::Vec;
    use time::Time;
    fn bench_data() -> Vec<Time> {
        crate::random_data(1000)
            .into_iter()
            .map(|(h, m, s, n): (u8, u8, u8, u32)| {
                Time::from_hms_nano(h % 24, m % 60, s % 60, n % 1_000_000_000).unwrap()
            })
            .collect()
    }
    crate::bench_encode_decode!(duration_vec: Vec<_>);
}