pub struct VarintEncoding;
Expand description
Variable-size integer encoding (excepting [ui]8).
Encoding an unsigned integer v (of any type excepting u8) works as follows:
- If
u < 251
, encode it as a single byte with that value. - If
251 <= u < 2**16
, encode it as a literal byte 251, followed by a u16 with valueu
. - If
2**16 <= u < 2**32
, encode it as a literal byte 252, followed by a u32 with valueu
. - If
2**32 <= u < 2**64
, encode it as a literal byte 253, followed by a u64 with valueu
. - If
2**64 <= u < 2**128
, encode it as a literal byte 254, followed by a u128 with valueu
.
Then, for signed integers, we first convert to unsigned using the zigzag algorithm, and then encode them as we do for unsigned integers generally. The reason we use this algorithm is that it encodes those values which are close to zero in less bytes; the obvious algorithm, where we encode the cast values, gives a very large encoding for all negative values.
The zigzag algorithm is defined as follows:
fn zigzag(v: Signed) -> Unsigned {
match v {
0 => 0,
v if v < 0 => |v| * 2 - 1
v if v > 0 => v * 2
}
}
And works such that:
assert_eq!(zigzag(0), 0);
assert_eq!(zigzag(-1), 1);
assert_eq!(zigzag(1), 2);
assert_eq!(zigzag(-2), 3);
assert_eq!(zigzag(2), 4);
assert_eq!(zigzag(i64::min_value()), u64::max_value());
Note that u256 and the like are unsupported by this format; if and when they are added to the language, they may be supported via the extension point given by the 255 byte.
Trait Implementations§
Source§impl Clone for VarintEncoding
impl Clone for VarintEncoding
Source§fn clone(&self) -> VarintEncoding
fn clone(&self) -> VarintEncoding
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreimpl Copy for VarintEncoding
Auto Trait Implementations§
impl Freeze for VarintEncoding
impl RefUnwindSafe for VarintEncoding
impl Send for VarintEncoding
impl Sync for VarintEncoding
impl Unpin for VarintEncoding
impl UnwindSafe for VarintEncoding
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 0 bytes