use super::{SerializeInner, WriteWithNames};
use crate::ser;
use crate::traits::*;
pub fn check_zero_copy<V: SerializeInner>() {
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 serialize_zero<V: ZeroCopy + SerializeInner>(
backend: &mut impl WriteWithNames,
value: &V,
) -> ser::Result<()> {
check_zero_copy::<V>();
let buffer = unsafe {
#[allow(clippy::manual_slice_size_calculation)]
core::slice::from_raw_parts(value as *const V as *const u8, core::mem::size_of::<V>())
};
backend.align::<V>()?;
backend.write_bytes::<V>(buffer)
}
pub fn serialize_slice_zero<V: SerializeInner + ZeroCopy>(
backend: &mut impl WriteWithNames,
data: &[V],
) -> ser::Result<()> {
check_zero_copy::<V>();
let len = data.len();
backend.write("len", &len)?;
let buffer = unsafe {
#[allow(clippy::manual_slice_size_calculation)]
core::slice::from_raw_parts(data.as_ptr() as *const u8, len * core::mem::size_of::<V>())
};
backend.align::<V>()?;
backend.write_bytes::<V>(buffer)
}
pub fn check_mismatch<V: SerializeInner>() {
if V::ZERO_COPY_MISMATCH {
eprintln!("Type {} is zero-copy, but it has not declared as such; use the #[deep_copy] attribute to silence this warning", core::any::type_name::<V>());
}
}
pub fn serialize_slice_deep<V: SerializeInner>(
backend: &mut impl WriteWithNames,
data: &[V],
) -> ser::Result<()> {
check_mismatch::<V>();
let len = data.len();
backend.write("len", &len)?;
for item in data.iter() {
backend.write("item", item)?;
}
Ok(())
}