generic_uvarint/
encode.rs

1use generic_array::typenum;
2use std::convert::TryInto;
3
4pub trait Serialize: Copy + Sized {
5    type MaxEncLen: generic_array::ArrayLength;
6
7    fn encode(self, buf: &mut generic_array::GenericArray<u8, Self::MaxEncLen>) -> &[u8];
8}
9
10macro_rules! impl_ser {
11    ($($t:ident => $n:ident),+ $(,)?) => {
12        $(
13        impl Serialize for $t {
14            type MaxEncLen = typenum::$n;
15
16            #[inline]
17            fn encode(self, buf: &mut generic_array::GenericArray<u8, Self::MaxEncLen>) -> &[u8] {
18                unsigned_varint::encode::$t(self, buf.as_mut_slice().try_into().unwrap())
19            }
20        }
21        )+
22    }
23}
24
25impl_ser!(
26    u8 => U2,
27    u16 => U3,
28    u32 => U5,
29    u64 => U10,
30    u128 => U19,
31);
32
33#[cfg(target_pointer_width = "64")]
34impl_ser!(usize => U10);
35
36#[cfg(target_pointer_width = "32")]
37impl_ser!(usize => U5);
38
39pub fn encode_uint<'a, T: Serialize>(x: T, buf: &'a mut [u8]) -> &'a [u8]
40where
41    <T as Serialize>::MaxEncLen: 'a,
42{
43    Serialize::encode(x, buf.try_into().expect("got invalid slice length"))
44}
45
46#[cfg(test)]
47mod tests {
48    #[test]
49    fn _u32() {
50        let mut buf = [0u8; 5];
51        let _ = super::encode_uint(100u32, &mut buf);
52    }
53}