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
use num::Num;
use num::cast::AsPrimitive;

pub struct TwoStageTable<'a, T, IndexT> {
    stage_1: &'a [IndexT],
    stage_2: &'a [&'a [T]],
    block_size: usize,
}

impl<'a, T: Copy, IndexT: Num + AsPrimitive<usize>> TwoStageTable<'a, T, IndexT> {
    pub fn new(
        stage_1: &'a [IndexT],
        stage_2: &'a [&'a [T]],
        block_size: usize,
    ) -> TwoStageTable<'a, T, IndexT> {
        TwoStageTable {
            stage_1: stage_1,
            stage_2: stage_2,
            block_size: block_size,
        }
    }

    pub fn at(&self, cp: u32) -> T {
        let block_size = self.block_size as u32;
        let offset = cp % block_size;
        let stage_1_index: usize = (cp / block_size) as usize;

        self.stage_2[(self.stage_1[stage_1_index]).as_()][offset as usize]
    }
}