use super::*;
pub trait Write {
unsafe fn write_header<T: Sized>(&mut self, value: &T);
fn write_u8(&mut self, value: u8);
fn write_u16(&mut self, value: u16);
fn write_u32(&mut self, value: u32);
fn write_u64(&mut self, value: u64);
fn write_code(&mut self, value: u32, size: usize);
fn write_index(&mut self, index: u32, len: usize);
fn into_stream(self) -> Self;
}
impl Write for Vec<u8> {
unsafe fn write_header<T: Sized>(&mut self, value: &T) {
self.extend_from_slice(std::slice::from_raw_parts(value as *const _ as _, std::mem::size_of::<T>()));
}
fn write_u8(&mut self, value: u8) {
self.extend_from_slice(&value.to_le_bytes());
}
fn write_u16(&mut self, value: u16) {
self.extend_from_slice(&value.to_le_bytes());
}
fn write_u32(&mut self, value: u32) {
self.extend_from_slice(&value.to_le_bytes());
}
fn write_u64(&mut self, value: u64) {
self.extend_from_slice(&value.to_le_bytes());
}
fn write_code(&mut self, value: u32, size: usize) {
if size == 2 {
self.write_u16(value as u16);
} else {
self.write_u32(value);
}
}
fn write_index(&mut self, index: u32, len: usize) {
if len < (1 << 16) {
self.write_u16(index as u16 + 1);
} else {
self.write_u32(index + 1);
}
}
fn into_stream(mut self) -> Self {
self.resize(round(self.len(), 4), 0);
self
}
}
pub trait Push2<T> {
fn push2(&mut self, value: T) -> u32;
}
impl<T> Push2<T> for Vec<T> {
fn push2(&mut self, value: T) -> u32 {
self.push(value);
(self.len() - 1) as u32
}
}