nova_interpreter/engine/
state.rs1use 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}