macro_rules! then_inc { ($v:expr) => {{ $v = $v.wrapping_add(1); $v as usize }}; } pub struct ScratchDevice { memory: Vec, pub max_capacity: u32, pub pointer_1: u32, pub pointer_2: u32, } impl ScratchDevice { pub fn new() -> Self { Self { memory: Vec::new(), max_capacity: 16 * 65536, pointer_1: 0, pointer_2: 0, } } pub fn read_head_1(&mut self) -> u8 { let i = then_inc!(self.pointer_1); self.read_byte(i) } pub fn read_head_2(&mut self) -> u8 { let i = then_inc!(self.pointer_2); self.read_byte(i) } pub fn write_head_1(&mut self, value: u8) { let i = then_inc!(self.pointer_1); self.write_byte(i, value); } pub fn write_head_2(&mut self, value: u8) { let i = then_inc!(self.pointer_2); self.write_byte(i, value); } fn read_byte(&self, pointer: usize) -> u8 { match self.memory.get(pointer as usize) { Some(value) => *value, None => 0, } } fn write_byte(&mut self, pointer: usize, value: u8) { if pointer < self.max_capacity as usize { if pointer >= self.memory.len() { self.memory.resize(pointer + 1, 0); } self.memory[pointer] = value; } } }