use alloc::vec::Vec;
use super::NodeDataOffset;
use crate::{
Operation,
mast::BasicBlockNode,
utils::{ByteReader, DeserializationError, Serializable, SliceReader},
};
#[derive(Debug, Default)]
pub struct BasicBlockDataBuilder {
node_data: Vec<u8>,
}
impl BasicBlockDataBuilder {
pub fn new() -> Self {
Self::default()
}
}
impl BasicBlockDataBuilder {
pub fn encode_basic_block(&mut self, basic_block: &BasicBlockNode) -> NodeDataOffset {
let ops_offset = self.node_data.len() as NodeDataOffset;
let operations: Vec<Operation> = basic_block.raw_operations().copied().collect();
operations.write_into(&mut self.node_data);
ops_offset
}
pub fn finalize(self) -> Vec<u8> {
self.node_data
}
}
pub struct BasicBlockDataDecoder<'a> {
node_data: &'a [u8],
}
impl<'a> BasicBlockDataDecoder<'a> {
pub fn new(node_data: &'a [u8]) -> Self {
Self { node_data }
}
}
impl BasicBlockDataDecoder<'_> {
pub fn decode_operations(
&self,
ops_offset: NodeDataOffset,
) -> Result<Vec<Operation>, DeserializationError> {
let mut ops_data_reader = SliceReader::new(&self.node_data[ops_offset as usize..]);
let operations: Vec<Operation> = ops_data_reader.read()?;
Ok(operations)
}
}