use crate::{Rapira, RapiraFlags, Result};
#[inline]
pub fn size<T: Rapira>(item: &T) -> usize {
match T::STATIC_SIZE {
Some(s) => s,
None => item.size(),
}
}
pub fn write_to_array<const N: usize, T: Rapira>(item: &T, bytes: &mut [u8; N]) {
assert_eq!(N, T::STATIC_SIZE.unwrap());
item.convert_to_bytes(bytes, &mut 0);
}
#[cfg(feature = "alloc")]
pub fn serialize<T: Rapira>(item: &T) -> Vec<u8> {
let value_size = size(item);
let mut bytes: Vec<u8> = vec![0u8; value_size];
item.convert_to_bytes(&mut bytes, &mut 0);
bytes
}
#[cfg(feature = "alloc")]
pub fn extend_vec<T: Rapira>(item: &T, bytes: &mut Vec<u8>) {
let value_size = size(item);
let mut cursor = bytes.len();
bytes.resize(cursor + value_size, 0);
item.convert_to_bytes(bytes, &mut cursor);
}
#[cfg(feature = "alloc")]
pub fn write_to_vec<T: Rapira>(item: &T, bytes: &mut Vec<u8>) {
let value_size = size(item);
let len = bytes.len();
if len < value_size {
bytes.resize(value_size, 0);
}
item.convert_to_bytes(bytes, &mut 0);
}
pub fn check_bytes<T>(bytes: &[u8]) -> Result<()>
where
T: Rapira + Sized,
{
let mut bytes = bytes;
T::check_bytes(&mut bytes)
}
pub fn read_to<T: Rapira>(mut bytes: &[u8], mut iter: impl Extend<T>) -> Result<()> {
while !bytes.is_empty() {
let item = T::from_slice(&mut bytes)?;
iter.extend(Some(item));
}
Ok(())
}
pub fn deserialize<T>(mut bytes: &[u8]) -> Result<T>
where
T: Rapira + Sized,
{
T::from_slice(&mut bytes)
}
pub fn deserialize_versioned<T>(mut bytes: &[u8], version: u8) -> Result<T>
where
T: Rapira + Sized,
{
T::from_slice_versioned(&mut bytes, version)
}
pub unsafe fn deser_unchecked<T>(mut bytes: &[u8]) -> Result<T>
where
T: Rapira + Sized,
{
unsafe { T::from_slice_unchecked(&mut bytes) }
}
pub unsafe fn deser_unsafe<T>(mut bytes: &[u8]) -> Result<T>
where
T: Rapira + Sized,
{
unsafe { T::from_slice_unsafe(&mut bytes) }
}
#[inline]
pub fn size_ctx<T: Rapira>(item: &T, flags: RapiraFlags) -> usize {
match T::STATIC_SIZE {
Some(s) => s,
None => item.size_ctx(flags),
}
}
#[cfg(feature = "alloc")]
pub fn serialize_ctx<T: Rapira>(item: &T, flags: RapiraFlags) -> Vec<u8> {
let value_size = size_ctx(item, flags);
let mut bytes: Vec<u8> = vec![0u8; value_size];
item.convert_to_bytes_ctx(&mut bytes, &mut 0, flags);
bytes
}
pub fn deserialize_ctx<T: Rapira + Sized>(mut bytes: &[u8], flags: RapiraFlags) -> Result<T> {
T::from_slice_ctx(&mut bytes, flags)
}