ttvm 0.3.9

Runtime and compiler infrastructure API for Rust
Documentation
use super::*;

#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Mem {
    inner: Vec<Option<Box<[Byte]>>>
}

impl Mem {
    pub fn new() -> Mem {
        Mem {
            inner: vec![Some(vec![0x0].into_boxed_slice())]
        }
    }

    pub fn len(&self) -> usize {
        self.inner.len()
    }
    
    pub fn allocate(&mut self, size: usize) -> Result<usize, Error> {
        if size == 0 {
            return Err(Error::from(format!("invalid size `{}`", size)));
        }

        self.inner.push(Some(vec![0x0; size].into_boxed_slice()));

        Ok(self.inner.len() - 1)
    }

    pub fn deallocate(&mut self, addr: usize) -> Result<usize, Error> {
        let chunk = match self.inner.get_mut(addr) {
            Some(some) => some,
            None => return Err(Error::from(format!("invalid address `{}`", addr)))
        };

        let size = match chunk {
            Some(some) => some.len(),
            None => return Err(Error::from(format!("invalid address `{}`", addr)))
        };

        *chunk = None;

        Ok(size)
    }

    pub fn get(&self, addr: usize) -> Option<&Box<[Byte]>> {
        match self.inner.get(addr) {
            Some(some) => {
                match some {
                    Some(some) => Some(some),
                    None => None
                }
            },
            None => None
        }
    }

    pub fn get_mut(&mut self, addr: usize) -> Option<&mut Box<[Byte]>> {
        match self.inner.get_mut(addr) {
            Some(some) => {
                match some {
                    Some(some) => Some(some),
                    None => None
                }
            },
            None => None
        }
    }
    
    pub fn last(&self) -> Option<&Box<[Byte]>> {
        match self.inner.last() {
            Some(some) => {
                match some {
                    Some(some) => Some(some),
                    None => None
                }
            },
            None => None
        }
    }

    pub fn last_mut(&mut self) -> Option<&mut Box<[Byte]>> {
        match self.inner.last_mut() {
            Some(some) => {
                match some {
                    Some(some) => Some(some),
                    None => None
                }
            },
            None => None
        }
    }
}

impl ToString for Mem {
    fn to_string(&self) -> String {
        let mut res = String::new();

        for chunk in self.inner.iter() {
            match chunk {
                Some(chunk) => {
                    for byte in chunk.iter() {
                        res.push_str(&format!("0x{:0X} ", byte));
                    }
                },
                None => {
                    res.push_str("0x0 ");
                }
            }
        }
        
        res
    }
}