use core::mem;
#[allow(dead_code)]
const _: () = if mem::size_of::<u16>() > mem::size_of::<usize>() {
panic!("usize needs to be at least as big as u16 in size");
};
pub trait Memory {
fn get(&self, addr: u16) -> Option<u8>;
fn set(&mut self, addr: u16, value: u8);
fn read(&mut self, addr: u16) -> u8 {
self.get(addr).unwrap_or(0)
}
fn write(&mut self, addr: u16, value: u8) {
self.set(addr, value);
}
fn get_slice(&mut self, addr: u16, buf: &mut [Option<u8>]) {
for (i, value) in buf.iter_mut().enumerate() {
let offset: u16 = i.try_into().expect("buffer length should fit inside a u16");
*value = self.get(addr + offset);
}
}
fn set_slice(&mut self, addr: u16, buf: &[u8]) {
for (i, &value) in buf.iter().enumerate() {
let offset: u16 = i.try_into().expect("buffer length should fit inside a u16");
self.set(addr + offset, value);
}
}
fn read_slice(&mut self, addr: u16, buf: &mut [u8]) {
for (i, value) in buf.iter_mut().enumerate() {
let offset: u16 = i.try_into().expect("buffer length should fit inside a u16");
*value = self.read(addr + offset);
}
}
fn write_slice(&mut self, addr: u16, buf: &[u8]) {
for (i, &value) in buf.iter().enumerate() {
let offset: u16 = i.try_into().expect("buffer length fits inside a u16");
self.write(addr + offset, value);
}
}
}