#[derive(Debug, Clone, Default)]
pub struct Writer {
buf: Vec<u8>,
}
impl Writer {
#[inline]
pub fn new() -> Self {
Writer { buf: Vec::new() }
}
#[inline]
pub fn with_capacity(capacity: usize) -> Self {
Writer { buf: Vec::with_capacity(capacity) }
}
#[inline]
pub fn as_slice(&self) -> &[u8] {
&self.buf
}
#[inline]
pub fn into_bytes(self) -> Vec<u8> {
self.buf
}
#[inline]
pub fn len(&self) -> usize {
self.buf.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.buf.is_empty()
}
#[inline]
pub fn clear(&mut self) {
self.buf.clear();
}
#[inline]
pub fn write_bool(&mut self, value: bool) {
self.buf.push(u8::from(value));
}
#[inline]
pub fn write_i8(&mut self, value: i8) {
self.buf.push(value as u8);
}
#[inline]
pub fn write_u8(&mut self, value: u8) {
self.buf.push(value);
}
#[inline]
pub fn write_i16(&mut self, value: i16) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn write_u16(&mut self, value: u16) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn write_i32(&mut self, value: i32) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn write_u32(&mut self, value: u32) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn write_i64(&mut self, value: i64) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn write_u64(&mut self, value: u64) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn write_f32(&mut self, value: f32) {
self.buf.extend_from_slice(&value.to_bits().to_le_bytes());
}
#[inline]
pub fn write_f64(&mut self, value: f64) {
self.buf.extend_from_slice(&value.to_bits().to_le_bytes());
}
#[inline]
pub fn write_string(&mut self, value: &str) {
self.write_len(value.len());
self.buf.extend_from_slice(value.as_bytes());
}
#[inline]
pub fn write_bytes(&mut self, value: &[u8]) {
self.write_len(value.len());
self.buf.extend_from_slice(value);
}
#[inline]
pub fn write_array_count(&mut self, count: usize) {
self.write_len(count);
}
#[inline]
fn write_len(&mut self, len: usize) {
let len = u32::try_from(len)
.expect("cyclone: length exceeds u32::MAX and cannot be represented on the wire");
self.write_u32(len);
}
}