use crate::Barfer;
macro_rules! numbers {
[$($endianness:literal => $fn:ident <> $back:ident: [$($in:ty => $name:ident),*$(,)?]),*$(,)?] => {$($(
#[doc = concat!("Add an [`", stringify!($in), "`] into the buffer as ", $endianness, "-endian bytes")]
#[doc = concat!("buf.", stringify!($name), "(42_", stringify!($in) ,");")]
#[doc = concat!("assert_eq!(", stringify!($in), "::", stringify!($back), "(buf.as_slice().try_into().unwrap()), 42_", stringify!($in), ");")]
#[inline]
fn $name(&mut self, num: $in) -> Result<(), <Self as Barfer<u8>>::Error> {
self.many(num.$fn())
}
)*)*};
}
pub trait ByteBarferExt: Barfer<u8> {
#[inline]
fn string<S: AsRef<str>>(&mut self, s: S) -> Result<(), <Self as Barfer<u8>>::Error> {
self.slice(s.as_ref().as_bytes())
}
#[inline]
fn char(&mut self, c: char) -> Result<(), <Self as Barfer<u8>>::Error> {
let mut buf = [0_u8; 4];
c.encode_utf8(&mut buf);
self.slice(&buf[..c.len_utf8()])
}
#[cfg(feature = "leb128")]
fn uleb128(&mut self, num: u64) -> Result<(), <Self as Barfer<u8>>::Error> {
let mut encoded = [0; 10];
let len = unsafe {
nano_leb128::ULEB128::from(num)
.write_into(&mut encoded)
.unwrap_unchecked()
};
self.slice(&encoded[..len])
}
#[cfg(feature = "leb128")]
fn sleb128(&mut self, num: i64) -> Result<(), <Self as Barfer<u8>>::Error> {
let mut encoded = [0; 10];
let len = unsafe {
nano_leb128::SLEB128::from(num)
.write_into(&mut encoded)
.unwrap_unchecked()
};
self.slice(&encoded[..len])
}
#[cfg(feature = "vint64")]
fn uvint64(&mut self, num: u64) -> Result<(), <Self as Barfer<u8>>::Error> {
let encoded = vint64::encode(num);
self.slice(encoded)
}
#[cfg(feature = "vint64")]
fn svint64(&mut self, num: i64) -> Result<(), <Self as Barfer<u8>>::Error> {
let encoded = vint64::signed::encode(num);
self.slice(encoded)
}
numbers![
"little" => to_le_bytes <> from_le_bytes: [
u8 => le_u8,
u16 => le_u16,
u32 => le_u32,
u64 => le_u64,
u128 => le_u128,
i8 => le_i8,
i16 => le_i16,
i32 => le_i32,
i64 => le_i64,
i128 => le_i128,
f32 => le_f32,
f64 => le_f64,
],
"big" => to_be_bytes <> from_be_bytes: [
u8 => be_u8,
u16 => be_u16,
u32 => be_u32,
u64 => be_u64,
u128 => be_u128,
i8 => be_i8,
i16 => be_i16,
i32 => be_i32,
i64 => be_i64,
i128 => be_i128,
f32 => be_f32,
f64 => be_f64,
],
"native" => to_ne_bytes <> from_ne_bytes: [
u8 => ne_u8,
u16 => ne_u16,
u32 => ne_u32,
u64 => ne_u64,
u128 => ne_u128,
i8 => ne_i8,
i16 => ne_i16,
i32 => ne_i32,
i64 => ne_i64,
i128 => ne_i128,
f32 => ne_f32,
f64 => ne_f64,
],
];
}
impl<B: Barfer<u8>> ByteBarferExt for B {}
pub trait CharBarferExt: Barfer<char> {
#[inline]
fn string<S: AsRef<str>>(&mut self, s: S) -> Result<(), <Self as Barfer<char>>::Error> {
self.many(s.as_ref().chars())
}
}
impl<B: Barfer<char>> CharBarferExt for B {}