zingen/wasm/
data.rs

1//! Dataset in code generation
2
3use crate::{Error, Result};
4use std::{
5    collections::BTreeMap,
6    ops::{Deref, DerefMut},
7};
8
9/// Data section conversion
10///
11/// NOTE: current only support constant expression.
12#[derive(Default, Clone, Debug)]
13pub struct Data(BTreeMap<i32, Vec<u8>>);
14
15impl Data {
16    /// Load data from offset and size
17    pub fn load(&self, offset: i32, size: usize) -> Result<Vec<u8>> {
18        for ptr in self.0.keys().cloned().rev() {
19            if offset >= ptr {
20                let start = (offset - ptr) as usize;
21                let data = self.get(&ptr).ok_or(Error::DataNotFound(offset, size))?;
22
23                return Ok(data[start..start + size].to_vec());
24            }
25        }
26
27        Err(Error::DataNotFound(offset, size))
28    }
29}
30
31impl Deref for Data {
32    type Target = BTreeMap<i32, Vec<u8>>;
33
34    fn deref(&self) -> &Self::Target {
35        &self.0
36    }
37}
38
39impl DerefMut for Data {
40    fn deref_mut(&mut self) -> &mut Self::Target {
41        &mut self.0
42    }
43}