#[derive(Clone)]
pub struct Lut {
table: Vec<Vec<usize>>,
}
impl Lut {
pub fn new(shape: &[usize]) -> Lut {
Lut{
table: gen_lut(shape),
}
}
pub fn update(&mut self, shape: &[usize]) {
self.table = gen_lut(shape);
}
pub fn at(&self, idx: &[usize]) -> usize {
let mut offset = idx[idx.len()-1];
for i in 0..idx.len()-1 {
offset = offset + self.table[i][idx[i]];
}
offset
}
}
fn gen_lut(shape: &[usize]) -> Vec<Vec<usize>> {
let mut outer = Vec::new();
let ndim = shape.len();
match ndim {
0 => {
outer
},
1 => {
let mut inner = Vec::with_capacity(shape[0]);
for i in 0..shape[0] {
inner[i] = i;
}
outer.push(inner);
outer
},
_ => {
let mut mult_idx = vec![shape[ndim-1]; ndim];
for j in 2..ndim {
let i = ndim - j;
mult_idx[i] = mult_idx[i+1] * shape[i];
}
for i in 0..ndim-1 {
let mut tmplut = Vec::with_capacity(shape[i]);
for j in 0..shape[i] {
tmplut.push(j * mult_idx[i+1]);
}
outer.push(tmplut);
}
outer
}
}
}