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}