1#[derive(Clone, Debug, PartialEq, Eq)]
2pub enum IndexVec {
3 U16(Vec<u16>),
4 U32(Vec<u32>),
5}
6
7impl IndexVec {
8 pub fn get(&self, idx: usize) -> u32 {
9 match self {
10 IndexVec::U16(v) => v[idx] as u32,
11 IndexVec::U32(v) => v[idx],
12 }
13 }
14
15 pub fn set(&mut self, idx: usize, val: u32) {
16 match self {
17 IndexVec::U16(v) => {
18 v[idx] = val as u16;
19 }
20 IndexVec::U32(v) => {
21 v[idx] = val;
22 }
23 }
24 }
25
26 pub fn swap(&mut self, i: usize, j: usize) {
27 match self {
28 IndexVec::U16(v) => v.swap(i, j),
29 IndexVec::U32(v) => v.swap(i, j),
30 }
31 }
32
33 pub fn len(&self) -> usize {
34 match self {
35 IndexVec::U16(v) => v.len(),
36 IndexVec::U32(v) => v.len(),
37 }
38 }
39
40 #[cfg(test)]
41 pub fn iter<'a>(&'a self) -> impl Iterator<Item = u32> + 'a {
42 let out: Box<dyn Iterator<Item = u32>> = match self {
43 IndexVec::U16(v) => Box::new(v.iter().map(|x| *x as u32)),
44 IndexVec::U32(v) => Box::new(v.iter().cloned()),
45 };
46 out
47 }
48}