aoc_ornaments/
intcode.rs

1use std::hash::Hash;
2use std::collections::HashMap;
3
4pub trait Machine {
5    type Register: Copy;
6    // type Registers: std::collections::HashMap<String, Self::Register>;
7    // type Instruction: std::str::FromStr;
8    
9    fn get_register(&self, reg: &str) -> Self::Register;
10    fn set_register(&mut self, reg: &str, value: Self::Register);
11    fn execute_instruction(&mut self) -> Option<usize>;
12}
13
14#[derive(Debug)]
15pub struct VirtualMachine<I, K, T: Clone> 
16where 
17    K: Hash + Eq + Into<String>, 
18{
19    pub registers: HashMap<K, T>,
20    pub instructions: Vec<I>,
21    /// Instruction Pointer
22    _ip: usize,
23}
24
25impl<I, K, T: Clone> VirtualMachine<I, K, T> 
26where 
27    K: Hash + Eq + Into<String>,
28{
29    pub fn new(registers: HashMap<K, T>, instructions: Vec<I>) -> Self {
30        Self {
31            registers,
32            instructions,
33            _ip: 0,
34        }
35    }
36
37    pub fn get_register(&self, reg: &K) -> T {
38        self.registers.get(reg).unwrap().clone()
39    }
40
41    pub fn set_register(&mut self, reg: K, value: T) {
42        self.registers.insert(reg, value);
43    }
44}