use super::put::*;
use crate::serialize::writer::*;
use core::mem::MaybeUninit;
type Mu8 = MaybeUninit<u8>;
pub struct IntoBufWriter<'a> {
buf: &'a mut [Mu8],
written: usize,
}
impl<'a> IntoBufWriter<'a> {
pub fn new(buf: &'a mut [Mu8]) -> Self {
Self { buf, written: 0 }
}
pub fn written(&self) -> usize {
self.written
}
#[inline]
fn reserve<'s>(&'s mut self, len: usize) -> WriteResult<&'s mut [Mu8]>
where
'a: 's,
{
let extent = self.written + len;
if extent > self.buf.len() {
return Err(WriteError::SpaceExhausted);
}
let start = self.written;
self.written = extent;
let reserved = unsafe { self.buf.get_unchecked_mut(start..extent) };
Ok(reserved)
}
}
impl<'a> Put for IntoBufWriter<'a> {
#[inline]
fn put_byte(&mut self, b: u8) -> WriteResult<()> {
let p = self.reserve(1)?;
p[0].write(b);
Ok(())
}
#[inline]
fn put_bytes(&mut self, bytes: &[u8]) -> WriteResult<()> {
let len = bytes.len();
let buf = self.reserve(len)?;
buf.write_copy_of_slice(bytes);
Ok(())
}
}