1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//! Implements a integral register bank.

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() }
}