seshat/
collections.rs

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