varuint/
varint.rs

1use crate::VarintSizeHint;
2use std::{
3    fmt,
4    ops::{Deref, DerefMut},
5};
6
7pub trait VarintBaseType:
8    Copy + Clone + PartialEq + PartialOrd + Eq + Ord + fmt::Debug + VarintSizeHint
9{
10}
11impl<T: Copy + Clone + PartialEq + PartialOrd + Eq + Ord + fmt::Debug + VarintSizeHint>
12    VarintBaseType for T
13{
14}
15
16/// Variable length signed integer.
17///
18/// # Examples
19///
20/// ```rust
21/// use std::mem;
22///
23/// use varuint::{Varint, Serializable, Deserializable};
24///
25/// fn test_varint(v: i128, size: usize) {
26///     println!("{}", v);
27///     let v = Varint(v);
28///     assert_eq!(size, v.size_hint());
29///     let mut arr: [u8; 17] = unsafe { mem::uninitialized() };
30///     assert_eq!(size, v.serialize(&mut (&mut arr as &mut [u8])).unwrap());
31///     assert_eq!(v, Varint::deserialize(&mut (&arr as &[u8])).unwrap());
32/// }
33///
34/// test_varint(0, 1);
35/// test_varint(1, 1);
36/// test_varint(-1, 1);
37///
38/// test_varint(-120, 1);
39/// test_varint(120, 1);
40///
41/// test_varint(-2031/2, 2);
42/// test_varint(2031/2, 2);
43///
44/// test_varint(-67567/2, 3);
45/// test_varint(67567/2, 3);
46///
47/// test_varint(-16777215/2, 4);
48/// test_varint(16777215/2, 4);
49///
50/// test_varint(-4294967295/2, 5);
51/// test_varint(4294967295/2, 5);
52///
53/// test_varint(-1099511627775/2, 6);
54/// test_varint(1099511627775/2, 6);
55///
56/// test_varint(-281474976710655/2, 7);
57/// test_varint(281474976710655/2, 7);
58///
59/// test_varint(-72057594037927935/2, 8);
60/// test_varint(72057594037927935/2, 8);
61///
62/// test_varint(i64::min_value().into(), 9);
63/// test_varint(i64::max_value().into(), 9);
64///
65/// test_varint(i128::min_value(), 17);
66/// test_varint(i128::max_value(), 17);
67/// ```
68#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Copy, Clone)]
69#[cfg_attr(feature = "serde-support", derive(Serialize, Deserialize))]
70pub struct Varint<T: VarintBaseType>(pub T);
71
72impl<T: VarintBaseType + fmt::Display> fmt::Display for Varint<T> {
73    #[inline]
74    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
75        write!(f, "{}", self.0)
76    }
77}
78
79impl<T: VarintBaseType> Deref for Varint<T> {
80    type Target = T;
81
82    #[inline]
83    fn deref(&self) -> &Self::Target {
84        &self.0
85    }
86}
87
88impl<T: VarintBaseType> DerefMut for Varint<T> {
89    #[inline]
90    fn deref_mut(&mut self) -> &mut Self::Target {
91        &mut self.0
92    }
93}
94
95impl From<i8> for Varint<i8> {
96    #[inline]
97    fn from(i: i8) -> Self {
98        Self(i)
99    }
100}
101
102impl From<i8> for Varint<i16> {
103    #[inline]
104    fn from(i: i8) -> Self {
105        Self(i16::from(i))
106    }
107}
108
109impl From<i8> for Varint<i32> {
110    #[inline]
111    fn from(i: i8) -> Self {
112        Self(i32::from(i))
113    }
114}
115
116impl From<i8> for Varint<i64> {
117    #[inline]
118    fn from(i: i8) -> Self {
119        Self(i64::from(i))
120    }
121}
122
123impl From<i8> for Varint<i128> {
124    #[inline]
125    fn from(i: i8) -> Self {
126        Self(i128::from(i))
127    }
128}
129
130impl From<i16> for Varint<i16> {
131    #[inline]
132    fn from(i: i16) -> Self {
133        Self(i)
134    }
135}
136
137impl From<i16> for Varint<i32> {
138    #[inline]
139    fn from(i: i16) -> Self {
140        Self(i32::from(i))
141    }
142}
143
144impl From<i16> for Varint<i64> {
145    #[inline]
146    fn from(i: i16) -> Self {
147        Self(i64::from(i))
148    }
149}
150
151impl From<i16> for Varint<i128> {
152    #[inline]
153    fn from(i: i16) -> Self {
154        Self(i128::from(i))
155    }
156}
157
158impl From<i32> for Varint<i32> {
159    #[inline]
160    fn from(i: i32) -> Self {
161        Self(i)
162    }
163}
164
165impl From<i32> for Varint<i64> {
166    #[inline]
167    fn from(i: i32) -> Self {
168        Self(i64::from(i))
169    }
170}
171
172impl From<i32> for Varint<i128> {
173    #[inline]
174    fn from(i: i32) -> Self {
175        Self(i128::from(i))
176    }
177}
178
179impl From<i64> for Varint<i64> {
180    #[inline]
181    fn from(i: i64) -> Self {
182        Self(i)
183    }
184}
185
186impl From<i64> for Varint<i128> {
187    #[inline]
188    fn from(i: i64) -> Self {
189        Self(i128::from(i))
190    }
191}
192
193impl From<i128> for Varint<i128> {
194    #[inline]
195    fn from(v: i128) -> Self {
196        Self(v)
197    }
198}
199
200impl From<u8> for Varint<u128> {
201    #[inline]
202    fn from(v: u8) -> Self {
203        Self(u128::from(v))
204    }
205}
206
207impl From<u16> for Varint<u128> {
208    #[inline]
209    fn from(v: u16) -> Self {
210        Self(u128::from(v))
211    }
212}
213
214impl From<u32> for Varint<u128> {
215    #[inline]
216    fn from(v: u32) -> Self {
217        Self(u128::from(v))
218    }
219}
220
221impl From<u64> for Varint<u128> {
222    #[inline]
223    fn from(v: u64) -> Self {
224        Self(u128::from(v))
225    }
226}
227
228impl From<u128> for Varint<u128> {
229    #[inline]
230    fn from(v: u128) -> Self {
231        Self(v)
232    }
233}
234
235impl Default for Varint<u128> {
236    #[inline]
237    fn default() -> Self {
238        Self(0)
239    }
240}
241
242impl Default for Varint<i8> {
243    #[inline]
244    fn default() -> Self {
245        Self(0)
246    }
247}
248
249impl Default for Varint<i16> {
250    #[inline]
251    fn default() -> Self {
252        Self(0)
253    }
254}
255
256impl Default for Varint<i32> {
257    #[inline]
258    fn default() -> Self {
259        Self(0)
260    }
261}
262
263impl Default for Varint<i64> {
264    #[inline]
265    fn default() -> Self {
266        Self(0)
267    }
268}
269
270impl Default for Varint<i128> {
271    #[inline]
272    fn default() -> Self {
273        Self(0)
274    }
275}