generic_uvarint/
encode.rs1use 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}