use super::put::*;
use crate::serialize::writer::*;
use alloc::{vec, vec::Vec};
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub struct BufWriter(Vec<u8>);
impl BufWriter {
pub fn new() -> Self {
Self(vec![])
}
pub fn clear(&mut self) {
self.0.clear();
}
pub fn reserve(&mut self, len: usize) {
self.0.reserve(len);
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn with_capacity(cap: usize) -> Self {
Self(Vec::with_capacity(cap))
}
}
impl Default for BufWriter {
fn default() -> Self {
Self::new()
}
}
impl From<Vec<u8>> for BufWriter {
fn from(vec: Vec<u8>) -> Self {
Self(vec)
}
}
impl AsRef<[u8]> for BufWriter {
fn as_ref(&self) -> &[u8] {
self.0.as_ref()
}
}
impl AsMut<Vec<u8>> for BufWriter {
fn as_mut(&mut self) -> &mut Vec<u8> {
&mut self.0
}
}
impl From<BufWriter> for Vec<u8> {
fn from(w: BufWriter) -> Self {
w.0
}
}
impl Put for BufWriter {
#[inline]
fn put_bytes(&mut self, bytes: &[u8]) -> WriteResult<()> {
if bytes.len() > u32::MAX as usize {
return Err(WriteError::InvalidArrayLength);
}
self.0.extend_from_slice(bytes);
Ok(())
}
#[inline]
fn put_opaque_variable(&mut self, bytes: &[u8]) -> WriteResult<()> {
debug_assert!(bytes.len() <= u32::MAX as usize);
let len = bytes.len();
let rem = if len.is_multiple_of(4) {
0
} else {
4 - len % 4
};
let size = 4 + len + rem;
debug_assert!(size.is_multiple_of(4));
self.0.reserve(size);
static PAD: [u8; 3] = [0; 3];
self.0.extend_from_slice(&(len as u32).to_be_bytes());
self.0.extend_from_slice(bytes);
self.0.extend_from_slice(&PAD[0..rem]);
Ok(())
}
#[inline]
fn put_opaque_fixed(&mut self, bytes: &[u8]) -> WriteResult<()> {
debug_assert!(bytes.len() <= u32::MAX as usize);
let len = bytes.len();
let rem = if len.is_multiple_of(4) {
0
} else {
4 - len % 4
};
let size = len + rem;
debug_assert!(size.is_multiple_of(4));
self.0.reserve(size);
static PAD: [u8; 3] = [0; 3];
self.0.extend_from_slice(bytes);
self.0.extend_from_slice(&PAD[0..rem]);
Ok(())
}
}