const_varint/arbitrary_int/
v1.rs

1use arbitrary_int_1::*;
2
3use crate::*;
4
5macro_rules! generate_fns {
6  ($($underlying:ident($($inner:ident), +$(,)?)),+$(,)?) => {
7    $(
8      $(
9        paste::paste! {
10          #[doc = "A buffer for storing LEB128 encoded " $inner " values."]
11          #[derive(Copy, Clone, Eq)]
12          pub struct [< $inner:camel VarintBuffer >]([u8; $inner::MAX_ENCODED_LEN + 1]);
13
14          impl PartialEq for [< $inner:camel VarintBuffer >] {
15            fn eq(&self, other: &Self) -> bool {
16              self.as_bytes().eq(other.as_bytes())
17            }
18          }
19
20          impl core::hash::Hash for [< $inner:camel VarintBuffer >] {
21            fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
22              self.as_bytes().hash(state)
23            }
24          }
25
26          impl core::fmt::Debug for [< $inner:camel VarintBuffer >] {
27            fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
28              self.0[..self.len()].fmt(f)
29            }
30          }
31
32          impl [< $inner:camel VarintBuffer >] {
33            const LAST_INDEX: usize = $inner::MAX_ENCODED_LEN;
34
35            #[allow(dead_code)]
36            #[inline]
37            const fn new(val: $inner) -> Self {
38              let mut buf = [0; $inner::MAX_ENCODED_LEN + 1];
39              let len = match [< encode_ $inner _varint_to >](val, &mut buf) {
40                Ok(len) => len,
41                Err(_) => panic!("buffer should be large enough"),
42              };
43              buf[Self::LAST_INDEX] = len as u8;
44              Self(buf)
45            }
46
47            /// Returns the number of bytes in the buffer.
48            #[inline]
49            #[allow(clippy::len_without_is_empty)]
50            pub const fn len(&self) -> usize {
51              self.0[Self::LAST_INDEX] as usize
52            }
53
54            /// Extracts a slice from the buffer.
55            #[inline]
56            pub const fn as_bytes(&self) -> &[u8] {
57              self.0.split_at(self.len()).0
58            }
59          }
60
61          impl core::ops::Deref for [< $inner:camel VarintBuffer >] {
62            type Target = [u8];
63
64            fn deref(&self) -> &Self::Target {
65              &self.0[..self.len()]
66            }
67          }
68
69          impl core::borrow::Borrow<[u8]> for [< $inner:camel VarintBuffer >] {
70            fn borrow(&self) -> &[u8] {
71              self
72            }
73          }
74
75          impl AsRef<[u8]> for [< $inner:camel VarintBuffer >] {
76            fn as_ref(&self) -> &[u8] {
77              self
78            }
79          }
80
81          impl Varint for $inner {
82            const MIN_ENCODED_LEN: usize = [< encoded_ $inner _varint_len >]($inner::MIN);
83            const MAX_ENCODED_LEN: usize = [< encoded_ $inner _varint_len >]($inner::MAX);
84
85            #[inline]
86            fn encoded_len(&self) -> usize {
87              [< encoded_ $inner _varint_len >](*self)
88            }
89
90            fn encode(&self, buf: &mut [u8]) -> Result<usize, EncodeError> {
91              [< encode_ $inner _varint_to >](*self, buf)
92            }
93
94            #[inline]
95            fn decode(buf: &[u8]) -> Result<(usize, Self), DecodeError> {
96              [< decode_ $inner _varint >](buf)
97            }
98          }
99
100          /// Returns the encoded length of the value in LEB128 variable length format.
101          #[doc = "The returned value will be in range of [`" $inner "::ENCODED_LEN_RANGE`]."]
102          #[inline]
103          pub const fn [< encoded_ $inner _varint_len >](value: $inner) -> usize {
104            [<encoded_ $underlying _varint_len>](value.value())
105          }
106
107          #[doc = "Encodes an `" $inner "` value into LEB128 variable length format, and writes it to the buffer."]
108          #[inline]
109          pub const fn [< encode_ $inner _varint >](x: $inner) -> [< $inner:camel VarintBuffer >] {
110            [< $inner:camel VarintBuffer >]::new(x)
111          }
112
113          #[doc = "Encodes an `" $inner "` value into LEB128 variable length format, and writes it to the buffer."]
114          #[inline]
115          pub const fn [< encode_ $inner _varint_to >](value: $inner, buf: &mut [u8]) -> Result<usize, EncodeError> {
116            [<encode_ $underlying _varint_to>](value.value(), buf)
117          }
118
119          #[doc = "Decodes an `" $inner "` in LEB128 encoded format from the buffer."]
120          ///
121          /// Returns the bytes readed and the decoded value if successful.
122          #[inline]
123          pub const fn [< decode_ $inner _varint >](buf: &[u8]) -> Result<(usize, $inner), DecodeError> {
124            match [<decode_ $underlying _varint>](buf) {
125              Ok((readed, val)) => {
126                match $inner::try_new(val) {
127                  Ok(val) => Ok((readed, val)),
128                  Err(_) => Err(DecodeError::Overflow),
129                }
130              },
131              Err(err) => Err(err),
132            }
133          }
134
135          #[test]
136          fn [< test_ $inner _min_max_varint >]() {
137            let min = $inner::MIN;
138            let max = $inner::MAX;
139            let min_encoded_len = [< encoded_ $inner _varint_len >](min);
140            let max_encoded_len = [< encoded_ $inner _varint_len >](max);
141
142            assert_eq!(min_encoded_len, $inner::MIN_ENCODED_LEN);
143            assert_eq!(max_encoded_len, $inner::MAX_ENCODED_LEN);
144
145            let mut buf = [0; $inner::MAX_ENCODED_LEN];
146            let len = [< encode_ $inner _varint_to >](min, &mut buf).unwrap();
147            assert_eq!(len, min_encoded_len);
148            let buffer = [< encode_ $inner _varint >](min);
149            assert_eq!(buffer.len(), min_encoded_len);
150            assert_eq!(buffer.as_bytes(), &buf[..min_encoded_len]);
151
152            let (readed, val) = [< decode_ $inner _varint >](&buf).unwrap();
153            assert_eq!(readed, len);
154            assert_eq!(val, min);
155
156            let len = [< encode_ $inner _varint_to >](max, &mut buf).unwrap();
157            assert_eq!(len, max_encoded_len);
158            let buffer = [< encode_ $inner _varint >](max);
159            assert_eq!(buffer.len(), max_encoded_len);
160            assert_eq!(buffer.as_bytes(), &buf[..max_encoded_len]);
161
162            let (readed, val) = [< decode_ $inner _varint >](&buf).unwrap();
163            assert_eq!(readed, len);
164            assert_eq!(val, max);
165          }
166        }
167      )*
168    )*
169  };
170}
171
172generate_fns!(
173  u8(u1, u2, u3, u4, u5, u6, u7),
174  u16(u9, u10, u11, u12, u13, u14, u15),
175);
176
177seq_macro::seq!(N in 17..=31 {
178  generate_fns!(u32(
179    #(
180      u~N,
181    )*
182  ));
183});
184
185seq_macro::seq!(N in 33..=63 {
186  generate_fns!(u64(
187    #(
188      u~N,
189    )*
190  ));
191});
192
193seq_macro::seq!(N in 65..=127 {
194  generate_fns!(u128(
195    #(
196      u~N,
197    )*
198  ));
199});