use osiris_data::data::atomic::Word;
use osiris_data::data::identification::Identifier;
use crate::register::{RegisterId, RegisterRange, REGISTERS_IN_BANK};
pub type RangeApplication = fn(&[Word]) -> Word;
#[derive(Clone, Debug)]
pub struct Bank {
registers: Vec<Word>,
}
impl Bank {
pub fn new() -> Self {
Self { registers: vec![Word::default(); REGISTERS_IN_BANK] }
}
pub fn set(&mut self, register: RegisterId, word: Word) {
if register.to_usize() > REGISTERS_IN_BANK {
return;
}
self.registers[register.to_usize()] = word;
}
pub fn get(&self, register: RegisterId) -> Word {
self.registers[register.to_usize()]
}
pub fn apply(&self, range: RegisterRange, function: RangeApplication) -> Word {
let slice = self.slice(range);
function(slice)
}
pub fn slice(&self, range: RegisterRange) -> &[Word] {
&self.registers[range.to_usize_range()]
}
pub fn copy(&mut self, to: RegisterId, slice: &[Word]) {
let mut index = to.to_usize();
for w in slice {
self.registers[index] = *w;
index += 1;
}
}
}
impl Default for Bank {
fn default() -> Self { Self::new() }
}