#[cfg(not(feature = "std"))]
use alloc::vec::Vec;
use unsigned_varint::encode;
pub trait EncodeIntoBuffer {
fn encode_into_buffer(&self, buffer: &mut Vec<u8>);
}
macro_rules! impl_encode_into_buffer {
($($type:ty => $buffer_fn:ident, $encode_fn:ident);+ $(;)?) => {
$(
#[doc = concat!("Encode a ", stringify!($type), " and append to a buffer")]
impl EncodeIntoBuffer for $type {
#[inline]
fn encode_into_buffer(&self, buffer: &mut Vec<u8>) {
let mut buf = encode::$buffer_fn();
let encoded = encode::$encode_fn(*self, &mut buf);
buffer.extend_from_slice(encoded);
}
}
)+
};
}
impl EncodeIntoBuffer for bool {
#[inline]
fn encode_into_buffer(&self, buffer: &mut Vec<u8>) {
buffer.push(if *self { 1 } else { 0 });
}
}
impl_encode_into_buffer! {
u8 => u8_buffer, u8;
u16 => u16_buffer, u16;
u32 => u32_buffer, u32;
u64 => u64_buffer, u64;
u128 => u128_buffer, u128;
usize => usize_buffer, usize;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_buffer_single_value() {
let mut buffer = Vec::new();
42u8.encode_into_buffer(&mut buffer);
assert_eq!(buffer, vec![42]);
}
#[test]
fn test_buffer_multiple_values() {
let mut buffer = Vec::new();
42u8.encode_into_buffer(&mut buffer);
100u8.encode_into_buffer(&mut buffer);
200u8.encode_into_buffer(&mut buffer);
assert_eq!(buffer.len(), 4);
}
#[test]
fn test_buffer_sequential_encoding() {
let mut buffer = Vec::new();
42u8.encode_into_buffer(&mut buffer);
1000u16.encode_into_buffer(&mut buffer);
100_000_u32.encode_into_buffer(&mut buffer);
assert!(buffer.len() > 3);
}
#[test]
fn test_buffer_preserves_existing_content() {
let mut buffer = vec![0xFF, 0xEE];
42u8.encode_into_buffer(&mut buffer);
assert_eq!(buffer[0], 0xFF);
assert_eq!(buffer[1], 0xEE);
assert_eq!(buffer[2], 42);
}
#[test]
fn test_buffer_bool() {
let mut buffer = Vec::new();
true.encode_into_buffer(&mut buffer);
false.encode_into_buffer(&mut buffer);
assert_eq!(buffer, vec![1, 0]);
}
#[test]
fn test_buffer_reuse() {
let mut buffer = Vec::with_capacity(100);
for i in 0u8..10 {
i.encode_into_buffer(&mut buffer);
}
assert_eq!(buffer.len(), 10);
assert!(buffer.capacity() >= 100);
}
#[test]
fn test_buffer_large_values() {
let mut buffer = Vec::new();
u8::MAX.encode_into_buffer(&mut buffer);
u16::MAX.encode_into_buffer(&mut buffer);
u32::MAX.encode_into_buffer(&mut buffer);
assert!(buffer.len() > 3);
}
#[test]
fn test_buffer_zero_values() {
let mut buffer = Vec::new();
0u8.encode_into_buffer(&mut buffer);
0u16.encode_into_buffer(&mut buffer);
0u32.encode_into_buffer(&mut buffer);
assert_eq!(buffer, vec![0, 0, 0]);
}
}