1use num::Num;
2use num::cast::AsPrimitive;
3
4pub struct TwoStageTable<'a, T, IndexT> {
5 stage_1: &'a [IndexT],
6 stage_2: &'a [&'a [T]],
7 block_size: usize,
8}
9
10impl<'a, T: Copy, IndexT: Num + AsPrimitive<usize>> TwoStageTable<'a, T, IndexT> {
11 pub fn new(
12 stage_1: &'a [IndexT],
13 stage_2: &'a [&'a [T]],
14 block_size: usize,
15 ) -> TwoStageTable<'a, T, IndexT> {
16 TwoStageTable {
17 stage_1: stage_1,
18 stage_2: stage_2,
19 block_size: block_size,
20 }
21 }
22
23 pub fn at(&self, cp: u32) -> T {
24 let block_size = self.block_size as u32;
25 let offset = cp % block_size;
26 let stage_1_index: usize = (cp / block_size) as usize;
27
28 self.stage_2[(self.stage_1[stage_1_index]).as_()][offset as usize]
29 }
30}
31