1#[cfg(feature = "serde")]
7use serde_derive::{Deserialize, Serialize};
8
9#[cfg(test)]
10mod test;
11
12const U32_BITS: usize = std::mem::size_of::<u32>() * 8;
13
14#[derive(Debug, Clone)]
16#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
17pub struct BitSet {
18 chunks: Vec<u32>,
19 num_bits: usize,
20}
21
22impl BitSet {
23 #[inline]
29 fn calc_chunks(num_bits: usize) -> usize {
30 (num_bits + U32_BITS - 1) / U32_BITS
31 }
32
33 #[inline]
39 fn last_mask(num_bits: usize) -> u32 {
40 !(!1 << ((num_bits - 1) % U32_BITS))
41 }
42
43 pub fn chunks(&self) -> &Vec<u32> {
45 &self.chunks
46 }
47
48 pub fn from_bits(chunks: Vec<u32>, num_bits: usize) -> Self {
56 #[cfg(debug_assertions)]
57 assert!(num_bits > 0);
58 #[cfg(debug_assertions)]
59 assert_eq!(Self::calc_chunks(num_bits), chunks.len());
60 #[cfg(debug_assertions)]
61 assert_eq!(chunks[chunks.len() - 1] & !Self::last_mask(num_bits), 0);
62 Self { chunks, num_bits }
63 }
64
65 pub fn reset(&mut self, idx: usize) {
71 #[cfg(debug_assertions)]
72 assert!(idx / U32_BITS < self.chunks.len());
73 #[cfg(debug_assertions)]
74 assert!(idx < self.num_bits);
75 let chunk = &mut self.chunks[idx / U32_BITS];
76 let chunk_pos = idx % U32_BITS;
77 *chunk = (*chunk & !(1 << chunk_pos)).to_le();
78 }
79
80 pub fn reset_all(&mut self) {
82 for chunk in &mut self.chunks {
83 *chunk = 0;
84 }
85 }
86
87 pub fn set(&mut self, idx: usize) {
93 #[cfg(debug_assertions)]
94 assert!(idx / U32_BITS < self.chunks.len());
95 #[cfg(debug_assertions)]
96 assert!(idx < self.num_bits);
97 let chunk = &mut self.chunks[idx / U32_BITS];
98 let chunk_pos = idx % U32_BITS;
99 *chunk = (*chunk | 1 << chunk_pos).to_le();
100 }
101
102 pub fn set_all(&mut self) {
104 for chunk in &mut self.chunks {
105 *chunk = u32::MAX;
106 }
107 let num_chunks = self.chunks.len();
108 self.chunks[num_chunks - 1] = Self::last_mask(self.num_bits);
109 }
110
111 pub fn test(&self, idx: usize) -> bool {
117 #[cfg(debug_assertions)]
118 assert!(idx / U32_BITS < self.chunks.len());
119 #[cfg(debug_assertions)]
120 assert!(idx < self.num_bits);
121 let chunk = self.chunks[idx / U32_BITS].to_le();
122 let chunk_pos = idx % U32_BITS;
123 ((chunk >> chunk_pos) & 1) == 1
124 }
125
126 pub fn with_capacity(num_bits: usize) -> Self {
132 #[cfg(debug_assertions)]
133 assert!(num_bits > 0);
134 let num_chunks = Self::calc_chunks(num_bits);
135 let chunks = vec![0; num_chunks];
136 Self { chunks, num_bits }
137 }
138}
139
140impl From<BitSet> for Vec<u32> {
141 fn from(bitset: BitSet) -> Self {
142 bitset.chunks
143 }
144}