use super::{SerInner, WriteWithNames};
use crate::ser;
use crate::traits::*;
pub fn check_zero_copy<V: SerInner>() {
if !V::IS_ZERO_COPY {
panic!(
"Cannot serialize type {} declared as zero-copy as it is not zero-copy",
core::any::type_name::<V>()
);
}
}
pub fn ser_zero<V: ZeroCopy>(backend: &mut impl WriteWithNames, value: &V) -> ser::Result<()> {
check_zero_copy::<V>();
backend.align::<V>()?;
ser_zero_unchecked(backend, value)
}
pub fn ser_zero_unchecked<V: ZeroCopy>(
backend: &mut impl WriteWithNames,
value: &V,
) -> ser::Result<()> {
let buffer = unsafe {
core::slice::from_raw_parts(value as *const V as *const u8, core::mem::size_of::<V>())
};
backend.write_bytes::<V>(buffer)
}
pub fn ser_slice_zero<V: ZeroCopy>(
backend: &mut impl WriteWithNames,
data: &[V],
) -> ser::Result<()> {
check_zero_copy::<V>();
let len = data.len();
backend.write("len", &len)?;
let num_bytes = core::mem::size_of_val(data);
let buffer = unsafe { core::slice::from_raw_parts(data.as_ptr() as *const u8, num_bytes) };
backend.align::<V>()?;
backend.write_bytes::<V>(buffer)
}
pub fn ser_slice_deep<V: SerInner>(
backend: &mut impl WriteWithNames,
data: &[V],
) -> ser::Result<()> {
let len = data.len();
backend.write("len", &len)?;
for item in data.iter() {
backend.write("item", item)?;
}
Ok(())
}