1use ulib::UVec;
4
5#[derive(Debug, Default)]
7pub struct VecCSR {
8 pub start: UVec<usize>,
10 pub items: UVec<usize>,
12}
13
14impl VecCSR {
15 pub fn from(num_sets: usize, num_items: usize, inset: &[usize]) -> VecCSR {
17 assert_eq!(inset.len(), num_items);
18 let mut start: Vec<usize> = vec![0; num_sets + 1];
19 let mut items: Vec<usize> = vec![0; num_items];
20 for s in inset {
21 start[*s] += 1;
22 }
23 for i in 1..num_sets + 1 {
25 start[i] += start[i - 1];
26 }
27 assert_eq!(start[num_sets], num_items);
28 for i in (0..num_items).rev() {
30 let s = inset[i];
31 let pos = start[s] - 1;
32 start[s] -= 1;
33 items[pos] = i;
34 }
35 VecCSR {
36 start: start.into(),
37 items: items.into()
38 }
39 }
40
41 #[inline]
43 pub fn iter_set(&self, set_id: usize)
44 -> impl Iterator<Item = usize> + '_
45 {
46 let l = self.start[set_id];
47 let r = self.start[set_id + 1];
48 self.items[l..r].iter().copied()
49 }
50
51 #[inline]
53 pub fn len(&self, set_id: usize) -> usize {
54 let l = self.start[set_id];
55 let r = self.start[set_id + 1];
56 r - l
57 }
58}