1use std::hash::Hash;
2use std::collections::HashMap;
3
4pub trait Machine {
5 type Register: Copy;
6 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 _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}