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 {
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) {
self.pointer += stride
}
pub fn as_vec(&mut self) -> &mut BytesDyn {
&mut self.raw
}
pub fn len(&self) -> usize {
self.raw.len()
}
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(raw: &mut Self) -> Self {
ByteArray {
raw: raw.as_vec().clone(),
pointer: 0,
}
}
fn to_raw(&self, ba: &mut Self) {
ba.as_vec().append(&mut self.raw.clone());
}
}
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);
}
}