Struct bincode_core::config::VarintEncoding [−][src]
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
impl Clone for VarintEncoding
[src]
fn clone(&self) -> VarintEncoding
[src]
pub fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl Copy for VarintEncoding
[src]
Auto Trait Implementations
impl RefUnwindSafe for VarintEncoding
impl Send for VarintEncoding
impl Sync for VarintEncoding
impl Unpin for VarintEncoding
impl UnwindSafe for VarintEncoding
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,