ciso/
index.rs

1use crate::{layout, util};
2
3pub struct IndexTable {
4    entries: Vec<layout::IndexTableEntry>,
5}
6
7impl IndexTable {
8    pub fn new(header: &layout::CSOHeader) -> Self {
9        Self {
10            entries: vec![layout::IndexTableEntry::default(); header.index_table_len()],
11        }
12    }
13
14    pub fn len(&self) -> usize {
15        self.entries.len()
16    }
17
18    pub fn deserialize(data: Vec<u8>) -> Self {
19        let len = data.len() / 4;
20        let mut index_table = Self {
21            entries: vec![layout::IndexTableEntry::default(); len],
22        };
23
24        for idx in 0..len {
25            let start_byte = 4 * idx;
26            let end_byte = start_byte + 4;
27
28            let entry = util::deserialize_u32_le(&data[start_byte..end_byte]);
29            index_table[idx] = layout::IndexTableEntry::new_with_raw_value(entry);
30        }
31
32        index_table
33    }
34
35    pub fn serialize(&self) -> Box<[u8]> {
36        let mut output = vec![0; 4 * self.len()];
37        for idx in 0..self.len() {
38            let start_byte = 4 * idx;
39            let end_byte = start_byte + 4;
40
41            let bytes = self[idx].raw_value().to_le_bytes();
42            output[start_byte..end_byte].copy_from_slice(&bytes);
43        }
44
45        output.into_boxed_slice()
46    }
47}
48
49impl core::ops::Index<usize> for IndexTable {
50    type Output = layout::IndexTableEntry;
51
52    fn index(&self, index: usize) -> &Self::Output {
53        &self.entries[index]
54    }
55}
56
57impl core::ops::IndexMut<usize> for IndexTable {
58    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
59        &mut self.entries[index]
60    }
61}