crate::ix!();
pub struct VarIntFormatter<const Mode: VarIntMode> {
}
impl<const Mode: VarIntMode> VarIntFormatter<Mode> {
#[inline]
pub fn new<'a, T>(item: &'a mut T) -> crate::wrapper::Wrapper<'a, Self, T> {
crate::wrapper::Wrapper::new(item)
}
}
impl<const Mode: VarIntMode> Default for VarIntFormatter<Mode> {
#[inline]
fn default() -> Self {
Self {}
}
}
impl<const Mode: VarIntMode, I> ValueFormatter<I> for VarIntFormatter<Mode>
where
(): ModeConstraint<Mode, I>,
I: Into<u128>
+ Copy
+ From<u8>
+ TryInto<u128>
+ TryFrom<u128>
+ std::fmt::Debug
+ Default,
<I as TryFrom<u128>>::Error: std::fmt::Debug,
{
#[inline]
fn ser<S: Write>(&mut self, s: &mut S, value: &I) {
write_var_int::<S, I, Mode>(s, *value);
}
#[inline]
fn unser<S: Read>(&mut self, s: &mut S, value: &mut I) {
*value = read_var_int::<S, I, Mode>(s);
}
}
#[cfg(test)]
mod var_int_tests {
use super::*;
use std::io::Cursor;
const SAMPLES: &[u64] = &[
0, 1, 0x7F, 0x80, 0x3FFF, 0x4000,
0xFFFF_FFFF, u32::MAX as u64 + 1, u64::MAX / 2,
];
#[traced_test]
fn roundtrip_default_mode() {
for &n in SAMPLES {
let mut buf = Cursor::new(Vec::<u8>::new());
write_var_int::<_, u64, { VarIntMode::Default }>(&mut buf, n);
buf.set_position(0);
let out: u64 =
read_var_int::<_, u64, { VarIntMode::Default }>(&mut buf);
assert_eq!(out, n);
}
}
#[traced_test]
fn reported_size_matches_bytes_written() {
for &n in SAMPLES {
let mut buf = Cursor::new(Vec::<u8>::new());
write_var_int::<_, u64, { VarIntMode::Default }>(&mut buf, n);
let bytes = buf.get_ref().len();
let reported =
get_size_of_var_int::<u64, { VarIntMode::Default }>(n);
assert_eq!(bytes, reported as usize);
}
}
#[traced_test]
fn formatter_wrapper_roundtrip() {
let original = 300u64;
let mut buf = Cursor::new(Vec::<u8>::new());
VarIntFormatter::<{ VarIntMode::Default }>::default()
.ser(&mut buf, &original);
buf.set_position(0);
let mut decoded = 0u64;
VarIntFormatter::<{ VarIntMode::Default }>::default()
.unser(&mut buf, &mut decoded);
assert_eq!(decoded, original);
}
#[allow(dead_code)]
fn _compile_time_nonnegative_signed_accepts_i64()
where
(): crate::check_var_int_mode::ModeConstraint<
{ VarIntMode::NonNegativeSigned },
i64,
>,
{}
}