const_varint/arbitrary_int/
v1.rs1use 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 #[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 #[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 #[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 #[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});