nova_interpreter/engine/
state.rs

1use crate::utils::interner::Interner;
2
3pub struct State {
4    pub registers: Box<[usize]>,
5    pub interner: Interner<String>,
6}
7
8impl State {
9    #[inline(always)]
10    pub fn set(&mut self, register: usize, value: usize) {
11        self.registers[register] = value;
12    }
13
14    #[inline(always)]
15    pub fn value(&self, register: usize) -> usize {
16        self.registers[register]
17    }
18
19    #[inline(always)]
20    pub fn present(&self, register: usize) -> bool {
21        self.registers[register] != 0
22    }
23
24    #[inline(always)]
25    pub fn produce(&mut self, register: usize, num: usize) {
26        self.registers[register] = self.registers[register].saturating_add(num);
27    }
28
29    #[inline(always)]
30    pub fn consume(&mut self, register: usize, num: usize) {
31        self.registers[register] = self.registers[register].saturating_sub(num);
32    }
33
34    #[inline(always)]
35    pub fn clear(&mut self, register: usize) {
36        self.registers[register] = 0;
37    }
38
39    pub fn print_state(&mut self) {
40        for (register, value) in self.registers.iter().enumerate() {
41            let register = &mut self.interner.lookup(register).unwrap();
42            if *value != 0 {
43                println!("\t{register} :: {}", value);
44            }
45        }
46    }
47}