use crate::utils::interner::Interner;
pub struct State {
pub registers: Box<[usize]>,
pub interner: Interner<String>,
}
impl State {
#[inline(always)]
pub fn set(&mut self, register: usize, value: usize) {
self.registers[register] = value;
}
#[inline(always)]
pub fn value(&self, register: usize) -> usize {
self.registers[register]
}
#[inline(always)]
pub fn present(&self, register: usize) -> bool {
self.registers[register] != 0
}
#[inline(always)]
pub fn produce(&mut self, register: usize, num: usize) {
self.registers[register] = self.registers[register].saturating_add(num);
}
#[inline(always)]
pub fn consume(&mut self, register: usize, num: usize) {
self.registers[register] = self.registers[register].saturating_sub(num);
}
#[inline(always)]
pub fn clear(&mut self, register: usize) {
self.registers[register] = 0;
}
pub fn print_state(&mut self) {
for (register, value) in self.registers.iter().enumerate() {
let register = &mut self.interner.lookup(register).unwrap();
if *value != 0 {
println!("\t{register} :: {}", value);
}
}
}
}