traaains/utils/interval_tree/
heap.rs1use bitmap::bitmap::BitmapVec;
2
3use crate::utils::interval_tree::{
4 interval_to_bitfields, interval_to_internal, left_child, parent_for, right_child,
5};
6
7#[derive(Clone, Debug, Default)]
10pub struct IntervalBitmapVec {
11 inner: BitmapVec<usize>,
12 interval_size: usize,
13}
14
15impl IntervalBitmapVec {
16 pub fn new(size: usize) -> Self {
17 Self {
18 inner: BitmapVec::with_items(interval_to_bitfields(size)),
19 interval_size: size.next_power_of_two(),
20 }
21 }
22
23 pub fn interval_size(&self) -> usize {
24 self.interval_size
25 }
26}
27
28impl IntervalBitmapVec {
29 pub fn set_at(&mut self, index: usize, value: bool) {
33 assert!(index < self.interval_size);
34
35 let mut curr_index = index + interval_to_internal(self.interval_size);
36
37 self.inner.set(curr_index, value);
39
40 while let Some(parent) = parent_for(curr_index) {
41 let value = self.inner.get(left_child(parent)) && self.inner.get(right_child(parent));
42 self.inner.set(parent, value);
43 curr_index = parent;
44 }
45 }
46
47 pub fn get_at(&self, index: usize) -> bool {
49 self.inner
50 .get(index + interval_to_internal(self.interval_size))
51 }
52
53 pub fn get_at_tree(&self, index: usize) -> bool {
55 self.inner.get(index)
56 }
57}