use ulib::UVec;
#[derive(Debug, Default)]
pub struct VecCSR {
pub start: UVec<usize>,
pub items: UVec<usize>,
}
impl VecCSR {
pub fn from(num_sets: usize, num_items: usize, inset: &[usize]) -> VecCSR {
assert_eq!(inset.len(), num_items);
let mut start: Vec<usize> = vec![0; num_sets + 1];
let mut items: Vec<usize> = vec![0; num_items];
for s in inset {
start[*s] += 1;
}
for i in 1..num_sets + 1 {
start[i] += start[i - 1];
}
assert_eq!(start[num_sets], num_items);
for i in (0..num_items).rev() {
let s = inset[i];
let pos = start[s] - 1;
start[s] -= 1;
items[pos] = i;
}
VecCSR {
start: start.into(),
items: items.into()
}
}
#[inline]
pub fn iter_set(&self, set_id: usize)
-> impl Iterator<Item = usize> + '_
{
let l = self.start[set_id];
let r = self.start[set_id + 1];
self.items[l..r].iter().copied()
}
#[inline]
pub fn len(&self, set_id: usize) -> usize {
let l = self.start[set_id];
let r = self.start[set_id + 1];
r - l
}
}