use super::{IRenderDataPayload, RenderDataOpcode};
use crate::rendering::composition::transport::{BatchValue, BatchValueReader};
#[derive(Clone, Copy, Debug)]
pub struct RenderDataReader<'a> {
buffer: &'a [u8],
position: usize,
}
impl<'a> RenderDataReader<'a> {
pub fn new(buffer: &'a [u8]) -> Self {
Self { buffer, position: 0 }
}
pub fn position(&self) -> usize {
self.position
}
pub fn is_at_end(&self) -> bool {
self.position >= self.buffer.len()
}
pub fn take(&mut self, count: usize) -> &'a [u8] {
let span = &self.buffer[self.position..self.position + count];
self.position += count;
span
}
pub fn read<T: BatchValue>(&mut self) -> T {
T::read_from(&mut BatchValueReader::new(self.buffer, &mut self.position))
}
pub fn peek<T: BatchValue>(&self) -> T {
let mut position = self.position;
T::read_from(&mut BatchValueReader::new(self.buffer, &mut position))
}
pub fn read_payload<T: IRenderDataPayload>(&mut self) -> T {
let opcode = self.read::<RenderDataOpcode>();
debug_assert_eq!(opcode, T::OPCODE);
self.read::<T>()
}
}