use crate::BinaryBuilder;
use std::ops::ShlAssign;
type BytesDyn = Vec<u8>;
pub struct ByteArray {
raw: BytesDyn,
pointer: usize,
}
impl ByteArray {
pub fn new() -> Self {
ByteArray {
raw: vec!(),
pointer: 0,
}
}
pub fn read<T>(&mut self) -> T where T: BinaryBuilder {
self.read_safe::<T>().unwrap()
}
pub fn read_safe<T>(&mut self) -> Option<T> where T: BinaryBuilder {
T::from_raw(self)
}
pub fn write<T>(&mut self, value: &T) where T: BinaryBuilder {
value.to_raw(self)
}
pub fn seek_first(&mut self) {
self.seek(0)
}
pub fn seek_last(&mut self) {
self.seek(self.len())
}
pub fn seek_next(&mut self, stride: usize) -> Option<()> {
self.pointer += stride;
match self.pointer <= self.len() {
true => Some(()),
false => {
self.pointer = self.len();
None
},
}
}
pub fn as_vec(&mut self) -> &mut BytesDyn {
&mut self.raw
}
pub fn len(&self) -> usize {
self.raw.len()
}
pub fn bytes_available(&self) -> usize {
self.len() - self.now()
}
pub const fn now(&self) -> usize {
self.pointer
}
fn seek(&mut self, value: usize) {
self.pointer = value
}
}
impl BinaryBuilder for ByteArray {
fn new() -> Self {
Self::new()
}
fn from_raw(ba: &mut ByteArray) -> Option<Self> {
let pointer: usize = ba.read_safe()?;
let raw: BytesDyn = ba.read_safe()?;
Some(ByteArray {
raw,
pointer,
})
}
fn to_raw(&self, mut ba: &mut Self) {
ba <<= &self.pointer;
ba <<= &self.raw;
}
}
impl<'a, T> ShlAssign<&'a T> for ByteArray where T: BinaryBuilder {
fn shl_assign(&mut self, rhs: &'a T) {
self.write(rhs);
}
}
impl<'a, T> ShlAssign<&'a T> for &mut ByteArray where T: BinaryBuilder {
fn shl_assign(&mut self, rhs: &'a T) {
self.write(rhs);
}
}