vlen 0.4.0

High-performance variable-length integer encoding with bulk operations, const fn support, and no_std compatibility
Documentation
use criterion::{Criterion, criterion_group, criterion_main};
use std::hint::black_box;
use vlen::{
	decode_u16, decode_u32, decode_u64, decode_u128, encode_u16, encode_u32,
	encode_u64, encode_u128,
};

macro_rules! encode_bench {
	($name:ident, $fn:ident, $buf_size:expr, $value:expr) => {
		fn $name(c: &mut Criterion) {
			let mut buf = [0u8; $buf_size];
			c.bench_function(stringify!($fn), |b| {
				b.iter(|| $fn(black_box(&mut buf), black_box($value)))
			});
		}
	};
}

macro_rules! decode_bench {
	($name:ident, $encode_fn:ident, $decode_fn:ident, $buf_size:expr, $value:expr) => {
		fn $name(c: &mut Criterion) {
			let mut buf = [0u8; $buf_size];
			let _len = $encode_fn(&mut buf, $value);
			c.bench_function(stringify!($decode_fn), |b| {
				b.iter(|| $decode_fn(black_box(&buf)))
			});
		}
	};
}

encode_bench!(bench_encode_u16, encode_u16, 3, 12345u16);
encode_bench!(bench_encode_u32, encode_u32, 5, 12345678u32);
encode_bench!(bench_encode_u64, encode_u64, 9, 0x1234567890ABCDEFu64);
encode_bench!(
	bench_encode_u128,
	encode_u128,
	17,
	0x1234567890ABCDEF1234567890ABCDEFu128
);

decode_bench!(bench_decode_u16, encode_u16, decode_u16, 3, 12345u16);
decode_bench!(bench_decode_u32, encode_u32, decode_u32, 5, 12345678u32);
decode_bench!(
	bench_decode_u64,
	encode_u64,
	decode_u64,
	9,
	0x1234567890ABCDEFu64
);
decode_bench!(
	bench_decode_u128,
	encode_u128,
	decode_u128,
	17,
	0x1234567890ABCDEF1234567890ABCDEFu128
);

criterion_group!(
	benches,
	bench_encode_u16,
	bench_encode_u32,
	bench_encode_u64,
	bench_encode_u128,
	bench_decode_u16,
	bench_decode_u32,
	bench_decode_u64,
	bench_decode_u128,
);
criterion_main!(benches);