use super::{RtError, RtResult};
use std::{
collections::btree_map::{BTreeMap, Iter},
fmt::Debug,
};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[repr(transparent)]
pub struct Memory(BTreeMap<usize, usize>);
impl Memory {
pub fn new(mem: BTreeMap<usize, usize>) -> Self {
Self(mem)
}
pub fn iter(&'_ self) -> Iter<'_, usize, usize> {
self.0.iter()
}
pub fn get(&self, addr: &usize) -> RtResult<&usize> {
self.0.get(addr).ok_or(RtError::InvalidAddr(*addr))
}
pub fn get_mut(&mut self, addr: &usize) -> RtResult<&mut usize> {
self.0.get_mut(addr).ok_or(RtError::InvalidAddr(*addr))
}
pub fn inner(&self) -> &BTreeMap<usize, usize> {
&self.0
}
}
impl<'a> IntoIterator for &'a Memory {
type IntoIter = std::collections::btree_map::Iter<'a, usize, usize>;
type Item = (&'a usize, &'a usize);
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<T> From<T> for Memory
where
T: Into<BTreeMap<usize, usize>>,
{
fn from(x: T) -> Self {
Self(x.into())
}
}