use crate::error::DecodeError;
use crate::traits::Packable;
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
pub trait Pack: Packable {
fn bit_size() -> u32 {
if Self::RADIX <= 1 {
0
} else {
128 - (Self::RADIX - 1).leading_zeros()
}
}
fn byte_size() -> usize {
(Self::bit_size() as usize + 7) / 8
}
#[cfg(feature = "alloc")]
fn encode(&self) -> Vec<u8> {
let ord = self.to_ordinal();
let len = Self::byte_size();
if len == 0 {
return Vec::new();
}
ord.to_le_bytes()[..len].to_vec()
}
fn encode_to_buf(&self, buf: &mut [u8]) -> usize {
let ord = self.to_ordinal();
let len = Self::byte_size();
let bytes = ord.to_le_bytes();
buf[..len].copy_from_slice(&bytes[..len]);
len
}
fn decode(bytes: &[u8]) -> Result<Self, DecodeError> {
let len = Self::byte_size();
if len == 0 {
return Self::from_ordinal(0);
}
if bytes.len() < len {
return Err(DecodeError::InsufficientData {
expected: len,
got: bytes.len(),
});
}
let mut buf = [0u8; 16];
buf[..len].copy_from_slice(&bytes[..len]);
let ord = u128::from_le_bytes(buf);
Self::from_ordinal(ord)
}
}
impl<T: Packable> Pack for T {}