use crate::{
XcdrSerializer,
error::{XcdrError, XcdrResult},
utils::{
ToNeBytes,
align::{AlignCdr2, write_aligned},
},
};
#[repr(C)]
pub struct PlainCdr2Serialize {
pub buf: *mut u8,
pub len: usize,
pub pos: usize,
pub do_io: bool,
}
impl PlainCdr2Serialize {
pub fn new(buf: *mut u8, len: usize) -> Self {
Self {
buf,
len,
pos: 0,
do_io: !(buf.is_null() || len == 0),
}
}
fn write<T, const N: usize>(&mut self, val: T) -> XcdrResult<()>
where
T: ToNeBytes<N>,
{
write_aligned::<AlignCdr2, T, N>(self.buf, self.len, &mut self.pos, self.do_io, val, true)
}
}
impl XcdrSerializer for PlainCdr2Serialize {
fn write_bool(&mut self, val: bool) -> XcdrResult<()> {
self.write(val)
}
fn write_u8(&mut self, val: u8) -> XcdrResult<()> {
self.write(val)
}
fn write_i8(&mut self, val: i8) -> XcdrResult<()> {
self.write(val)
}
fn write_u16(&mut self, val: u16) -> XcdrResult<()> {
self.write(val)
}
fn write_i16(&mut self, val: i16) -> XcdrResult<()> {
self.write(val)
}
fn write_u32(&mut self, val: u32) -> XcdrResult<()> {
self.write(val)
}
fn write_i32(&mut self, val: i32) -> XcdrResult<()> {
self.write(val)
}
fn write_u64(&mut self, val: u64) -> XcdrResult<()> {
self.write(val)
}
fn write_i64(&mut self, val: i64) -> XcdrResult<()> {
self.write(val)
}
fn write_f32(&mut self, val: f32) -> XcdrResult<()> {
self.write(val)
}
fn write_f64(&mut self, val: f64) -> XcdrResult<()> {
self.write(val)
}
fn write_bytes(&mut self, buf: &[u8]) -> XcdrResult<()> {
if self.pos + buf.len() > self.len {
return Err(XcdrError::BufferOverflow);
}
if self.do_io {
unsafe {
std::ptr::copy(buf.as_ptr(), self.buf.add(self.pos), buf.len());
}
}
self.pos += buf.len();
Ok(())
}
}