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#[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}