bitm/
bitvec.rs

1use std::{iter::FusedIterator, ops::Range};
2use super::{ceiling_div, n_lowest_bits, n_lowest_bits_1_64};
3
4/// Iterator over indices of bits set to 1 (if `B` is `true`) or 0 (if `B` is `false`) in slice of `u64`.
5pub struct BitBIterator<'a, const B: bool> {
6    /// Iterator over 64-bit segments.
7    segment_iter: std::slice::Iter<'a, u64>,
8    /// 64 * index of the current segment.
9    first_segment_bit: usize,
10    /// Copy of the current segment (or its negation if `!B`) with zeroed already exposed bits.
11    current_segment: u64
12}
13
14impl<'a, const B: bool> BitBIterator<'a, B> {
15    /// Constructs iterator over bits set in the given `slice`.
16    pub fn new(slice: &'a [u64]) -> Self {
17        let mut segment_iter = slice.into_iter();
18        let current_segment = if B {
19            segment_iter.next().copied().unwrap_or(0)
20        } else {
21            !segment_iter.next().copied().unwrap_or(0)
22        };
23        Self {
24            segment_iter,
25            first_segment_bit: 0,
26            current_segment
27        }
28    }
29}
30
31impl<'a, const B: bool> Iterator for BitBIterator<'a, B> {
32    type Item = usize;
33
34    fn next(&mut self) -> Option<Self::Item> {
35        while self.current_segment == 0 {
36            self.current_segment = if B { *self.segment_iter.next()? } else { !*self.segment_iter.next()? };
37            self.first_segment_bit += 64;
38        }
39        let result = self.current_segment.trailing_zeros();
40        self.current_segment ^= 1<<result;
41        Some(self.first_segment_bit + (result as usize))
42    }
43
44    #[inline] fn size_hint(&self) -> (usize, Option<usize>) {
45        let result = self.len();
46        (result, Some(result))
47    }
48}
49
50impl<'a, const B: bool> ExactSizeIterator for BitBIterator<'a, B> {
51    #[inline] fn len(&self) -> usize {
52        if B {
53            self.current_segment.count_ones() as usize + self.segment_iter.as_slice().count_bit_ones()
54        } else {
55            self.current_segment.count_zeros() as usize + self.segment_iter.as_slice().count_bit_zeros()
56        }
57    }
58}
59
60impl<'a, const B: bool> FusedIterator for BitBIterator<'a, B> where std::slice::Iter<'a, u64>: FusedIterator {}
61
62/// Iterator over bits set to 1 in slice of `u64`.
63pub type BitOnesIterator<'a> = BitBIterator<'a, true>;
64
65/// Iterator over bits set to 0 in slice of `u64`.
66pub type BitZerosIterator<'a> = BitBIterator<'a, false>;
67
68
69
70/// Iterator over bits in slice of `u64`. It yields `true` for bit 1 and `false` for 0.
71pub struct BitIterator<'bv> {
72    bit_vec: &'bv [u64],
73    bit_range: Range<usize>,
74}
75
76impl<'bv> BitIterator<'bv> {
77    /// Constructs iterator over all bits in the given `bit_vec`.
78    #[inline] pub fn new(bit_vec: &'bv [u64]) -> Self {
79        Self { bit_vec, bit_range: 0..bit_vec.len()*64 }
80    }
81
82    /// Constructs iterator over given bit range of `bit_vec`.
83    #[inline] pub unsafe fn with_range_unchecked(bit_vec: &'bv [u64], bit_range: Range<usize>) -> Self {
84        Self { bit_vec, bit_range }
85    }
86
87    /// Constructs iterator over given bit range of `bit_vec`.
88    #[inline] pub fn with_range(bit_vec: &'bv [u64], bit_range: Range<usize>) -> Self {
89        assert!(bit_range.end <= bit_vec.len()*64, "BitIterator bit range out of bounds.");
90        Self { bit_vec, bit_range }
91    }
92
93    /// Returns the remaining range of bits to be yielded by `self`.
94    #[inline] pub fn bit_range(&self) -> &Range<usize> { &self.bit_range }
95
96    /// Returns underling bit vector (slice).
97    #[inline] pub fn bit_vec(&self) -> &'bv [u64] { &self.bit_vec }
98}
99
100impl<'bv> Iterator for BitIterator<'bv> {
101    type Item = bool;
102
103    #[inline] fn next(&mut self) -> Option<Self::Item> {
104        self.bit_range.next().map(|bit_nr| unsafe { self.bit_vec.get_bit_unchecked(bit_nr) })
105    }
106
107    #[inline] fn nth(&mut self, n: usize) -> Option<Self::Item> {
108        self.bit_range.nth(n).map(|bit_nr| unsafe { self.bit_vec.get_bit_unchecked(bit_nr) })
109    }
110
111    #[inline] fn size_hint(&self) -> (usize, Option<usize>) {
112        self.bit_range.size_hint()
113    }
114}
115
116impl<'bv> DoubleEndedIterator for BitIterator<'bv> {
117    #[inline] fn next_back(&mut self) -> Option<Self::Item> {
118        self.bit_range.next_back().map(|bit_nr| unsafe { self.bit_vec.get_bit_unchecked(bit_nr) })
119    }
120
121    #[inline] fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
122        self.bit_range.nth_back(n).map(|bit_nr| unsafe { self.bit_vec.get_bit_unchecked(bit_nr) })
123    }
124}
125
126impl<'a> ExactSizeIterator for BitIterator<'a> where Range<usize>: ExactSizeIterator {
127    #[inline] fn len(&self) -> usize { self.bit_range.len() }
128}
129
130impl<'a> FusedIterator for BitIterator<'a> where Range<usize>: FusedIterator {}
131
132
133/// The trait that is implemented for the array of `u64` and extends it with methods for
134/// accessing and modifying single bits or arbitrary fragments consisted of few (up to 63) bits.
135pub trait BitAccess {
136    /// Gets bit with given index `bit_nr`. Panics if `bit_nr` is out of bounds.
137    fn get_bit(&self, bit_nr: usize) -> bool;
138
139    /// Gets bit with given index `bit_nr`, without bounds checking.
140    unsafe fn get_bit_unchecked(&self, bit_nr: usize) -> bool;
141
142    /// Gets bit with given index `bit_nr`. Returns `None` if `bit_nr` is out of bounds.
143    fn try_get_bit(&self, bit_nr: usize) -> Option<bool>;
144
145    /// Gets bit with given index `bit_nr` and increase `bit_nr` by 1. Panics if `bit_nr` is out of bounds.
146    #[inline] fn get_successive_bit(&self, bit_nr: &mut usize) -> bool {
147        let result = self.get_bit(*bit_nr);
148        *bit_nr += 1;
149        result
150    }
151
152    /// Set bit with given index `bit_nr` to `value` (`1` if `true`, `0` otherwise). Panics if `bit_nr` is out of bounds.
153    fn set_bit_to(&mut self, bit_nr: usize, value: bool);
154
155    /// Set bit with given index `bit_nr` to `value` (`1` if `true`, `0` otherwise), without bounds checking.
156    unsafe fn set_bit_to_unchecked(&mut self, bit_nr: usize, value: bool);
157
158    /// Set bit with given index `bit_nr` to `value` (`1` if `true`, `0` otherwise) and increase `bit_nr` by 1.
159    /// Panics if `bit_nr` is out of bound.
160    #[inline] fn set_successive_bit_to(&mut self, bit_nr: &mut usize, value: bool) {
161        self.set_bit_to(*bit_nr, value); *bit_nr += 1;
162    }
163
164    /// Set bit with given index `bit_nr` to `value` (`1` if `true`, `0` otherwise) and increase `bit_nr` by 1.
165    /// The result is undefined if `bit_nr` is out of bound.
166    #[inline] unsafe fn set_successive_bit_to_unchecked(&mut self, bit_nr: &mut usize, value: bool) {
167        self.set_bit_to_unchecked(*bit_nr, value); *bit_nr += 1;
168    }
169
170    /// Initialize bit with given index `bit_nr` to `value` (`1` if `true`, `0` otherwise).
171    /// Before initialization, the bit is assumed to be cleared or already set to `value`.
172    /// Panics if `bit_nr` is out of bounds.
173    fn init_bit(&mut self, bit_nr: usize, value: bool);
174
175    /// Initialize bit with given index `bit_nr` to `value` (`1` if `true`, `0` otherwise).
176    /// Before initialization, the bit is assumed to be cleared or already set to `value`.
177    /// The result is undefined if `bit_nr` is out of bounds.
178    unsafe fn init_bit_unchecked(&mut self, bit_nr: usize, value: bool);
179
180    /// Initialize bit with given index `bit_nr` to `value` (`1` if `true`, `0` otherwise)
181    /// and increase `bit_nr` by 1.
182    /// Before initialization, the bit is assumed to be cleared or already set to `value`.
183    /// Panics if `bit_nr` is out of bounds.
184    #[inline] fn init_successive_bit(&mut self, bit_nr: &mut usize, value: bool) {
185        self.init_bit(*bit_nr, value); *bit_nr += 1;
186    }
187
188    /// Initialize bit with given index `bit_nr` to `value` (`1` if `true`, `0` otherwise)
189    /// and increase `bit_nr` by 1.
190    /// Before initialization, the bit is assumed to be cleared or already set to `value`.
191    /// The result is undefined if `bit_nr` is out of bounds.
192    #[inline] unsafe fn init_successive_bit_unchecked(&mut self, bit_nr: &mut usize, value: bool) {
193        self.init_bit_unchecked(*bit_nr, value); *bit_nr += 1;
194    }
195
196    /// Sets bit with given index `bit_nr` to `1`. Panics if `bit_nr` is out of bounds.
197    fn set_bit(&mut self, bit_nr: usize);
198
199    /// Sets bit with given index `bit_nr` to `1`, without bounds checking.
200    unsafe fn set_bit_unchecked(&mut self, bit_nr: usize);
201
202    /// Sets bit with given index `bit_nr` to `0`. Panics if `bit_nr` is out of bounds.
203    fn clear_bit(&mut self, bit_nr: usize);
204
205    /// Sets bit with given index `bit_nr` to `0`, without bounds checking.
206    unsafe fn clear_bit_unchecked(&mut self, bit_nr: usize);
207
208    /// Gets at least `len` bits beginning from the bit index `begin`. Panics if the range is out of bounds.
209    #[inline] fn get_bits_unmasked(&self, begin: usize, len: u8) -> u64 {
210        self.try_get_bits_unmasked(begin, len).expect("bit range out of bounds")
211    }
212
213    /// Gets bits `[begin, begin+len)`. Panics if the range is out of bounds.
214    #[inline] fn get_bits(&self, begin: usize, len: u8) -> u64 {
215        //if len == 0 { return 0; }
216        self.get_bits_unmasked(begin, len) & n_lowest_bits(len)
217    }
218
219    /// Gets at least `len` bits beginning from the bit index `begin`.
220    /// Returns [`None`] if the range is out of bounds.
221    fn try_get_bits_unmasked(&self, begin: usize, len: u8) -> Option<u64>;
222
223    /// Gets bits `[begin, begin+len)`. Returns [`None`] if the range is out of bounds.
224    #[inline(always)] fn try_get_bits(&self, begin: usize, len: u8) -> Option<u64> {
225        self.try_get_bits_unmasked(begin, len).map(|result| result & n_lowest_bits(len))
226    }
227
228    /// Gets at least `len` bits beginning from the bit index `begin` without bounds checking.
229    unsafe fn get_bits_unmasked_unchecked(&self, begin: usize, len: u8) -> u64;
230
231    /// Gets bits `[begin, begin+len)` without bounds checking.
232    #[inline(always)] unsafe fn get_bits_unchecked(&self, begin: usize, len: u8) -> u64 {
233        self.get_bits_unmasked_unchecked(begin, len) & n_lowest_bits(len)
234    }
235
236    /// Gets bits `[begin, begin+len)` and increase `bit_nr` by `len`.
237    #[inline] fn get_successive_bits(&self, begin: &mut usize, len: u8) -> u64 {
238        let result = self.get_bits(*begin, len);
239        *begin += len as usize;
240        result
241    }
242
243    /// Initialize bits `[begin, begin+len)` to `v`.
244    /// Before initialization, the bits are assumed to be cleared or already set to `v`.
245    fn init_bits(&mut self, begin: usize, v: u64, len: u8);
246
247    /// Initialize bits `[begin, begin+len)` to `v` and increase `begin` by `len`.
248    /// Before initialization, the bits are assumed to be cleared or already set to `v`.
249    #[inline] fn init_successive_bits(&mut self, begin: &mut usize, v: u64, len: u8) {
250        self.init_bits(*begin, v, len); *begin += len as usize;
251    }
252
253    /// Initialize bits `[begin, begin+len)` to `v`, without bounds checking.
254    /// Before initialization, the bits are assumed to be cleared or already set to `v`.
255    unsafe fn init_bits_unchecked(&mut self, begin: usize, v: u64, len: u8);
256
257    /// Sets bits `[begin, begin+len)` to the content of `v`. Panics if the range is out of bounds.
258    fn set_bits(&mut self, begin: usize, v: u64, len: u8);
259
260    /// Sets bits `[begin, begin+len)` to the content of `v` and increase `begin` by `len`. Panics if the range is out of bounds.
261    #[inline] fn set_successive_bits(&mut self, begin: &mut usize, v: u64, len: u8) {
262        self.set_bits(*begin, v, len);  *begin += len as usize;
263    }
264
265    /// Sets bits `[begin, begin+len)` to the content of `v`, without bounds checking.
266    unsafe fn set_bits_unchecked(&mut self, begin: usize, v: u64, len: u8);
267
268    /// Xor at least `len` bits of `self`, staring from index `begin`, with `v`. Panics if the range is out of bounds.
269    fn xor_bits(&mut self, begin: usize, v: u64, len: u8);
270
271    /// Xor at least `len` bits of `self`, staring from index `begin`, with `v` and increase `begin` by `len`.
272    /// Panics if the range is out of bounds.
273    fn xor_successive_bits(&mut self, begin: &mut usize, v: u64, len: u8) {
274        self.xor_bits(*begin, v, len);  *begin += len as usize;
275    }
276
277    /// Returns the number of zeros (cleared bits).
278    fn count_bit_zeros(&self) -> usize;
279
280    /// Returns the number of ones (set bits).
281    fn count_bit_ones(&self) -> usize;
282
283    /// Returns iterator over indices of ones (set bits).
284    fn bit_ones(&'_ self) -> BitOnesIterator<'_>;
285
286    /// Returns iterator over indices of ones (set bits).
287    fn bit_zeros(&'_ self) -> BitZerosIterator<'_>;
288
289    /// Returns iterator over all bits in `self` that yields `true` for each one and `false` for each zero.
290    fn bit_iter(&'_ self) -> BitIterator<'_>;
291
292    /// Returns iterator over given range of `self` bits that yields `true` for each one and `false` for each zero.
293    fn bit_in_range_iter(&'_ self, bit_range: Range<usize>) -> BitIterator<'_>;
294
295    /// Returns iterator over given range (whose bounds are unchecked) of `self` bits
296    /// that yields `true` for each one and `false` for each zero.
297    unsafe fn bit_in_unchecked_range_iter(&'_ self, bit_range: Range<usize>) -> BitIterator<'_>;
298
299    /// Gets `index`-th fragment of at least `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`).
300    /// Panics if the range is out of bounds.
301    #[inline(always)] fn get_fragment_unmasked(&self, index: usize, v_size: u8) -> u64 {
302        self.get_bits_unmasked(index * v_size as usize, v_size)
303    }
304
305    /// Gets `index`-th fragment of `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`).
306    /// Panics if the range is out of bounds.
307    #[inline(always)] fn get_fragment(&self, index: usize, v_size: u8) -> u64 {
308        self.get_bits(index * v_size as usize, v_size)
309    }
310
311    /// Gets `index`-th fragment of at least `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`).
312    /// Returns [`None`] if the range is out of bounds.
313    #[inline(always)] fn try_get_fragment_unmasked(&self, index: usize, v_size: u8) -> Option<u64> {
314        self.try_get_bits_unmasked(index * v_size as usize, v_size)
315    }
316
317    /// Gets `index`-th fragment of `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`).
318    /// Returns [`None`] if the range is out of bounds.
319    #[inline(always)] fn try_get_fragment(&self, index: usize, v_size: u8) -> Option<u64> {
320        self.try_get_bits(index * v_size as usize, v_size)
321    }
322
323    /// Gets `index`-th fragment of at least `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`),
324    /// without bounds checking.
325    #[inline(always)] unsafe fn get_fragment_unmasked_unchecked(&self, index: usize, v_size: u8) -> u64 {
326        self.get_bits_unmasked_unchecked(index * v_size as usize, v_size)
327    }
328
329    /// Gets `index`-th fragment of `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`),
330    /// without bounds checking.
331    #[inline(always)] unsafe fn get_fragment_unchecked(&self, index: usize, v_size: u8) -> u64 {
332        self.get_bits_unchecked(index * v_size as usize, v_size)
333    }
334
335    /// Gets `index`-th fragment of `v_size` bits and increases `index` by 1.
336    #[inline(always)] fn get_successive_fragment(&self, index: &mut usize, v_size: u8) -> u64 {
337        let result = self.get_fragment(*index, v_size);
338        *index += 1;
339        result
340    }
341
342    /// Initializes `index`-th fragment of `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`), to `v`.
343    /// Panics if the range is out of bounds. Before initialization, the bits are assumed to be cleared or already set to `v`.
344    #[inline(always)] fn init_fragment(&mut self, index: usize, v: u64, v_size: u8) {
345        self.init_bits(index * v_size as usize, v, v_size)
346    }
347
348    /// Initializes `index`-th fragment of `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`), to `v`
349    /// Next, increases `index` by 1. Panics if the range is out of bounds.
350    /// Before initialization, the bits are assumed to be cleared or already set to `v`.
351    #[inline(always)] fn init_successive_fragment(&mut self, index: &mut usize, v: u64, v_size: u8) {
352        self.init_fragment(*index, v, v_size);  *index += 1;
353    }
354
355    /// Initializes `index`-th fragment of `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`), to `v`.
356    /// The result is undefined if the range is out of bounds. Before initialization, the bits are assumed to be cleared or already set to `v`.
357    #[inline(always)] unsafe fn init_fragment_unchecked(&mut self, index: usize, v: u64, v_size: u8) {
358        self.init_bits_unchecked(index * v_size as usize, v, v_size)
359    }
360
361    /// Sets index`-th fragment of `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`), to `v`.
362    /// Panics if the range is out of bounds.
363    #[inline(always)] fn set_fragment(&mut self, index: usize, v: u64, v_size: u8) {
364        self.set_bits(index * v_size as usize, v, v_size)
365    }
366
367    /// Sets `index`-th fragment of `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`), to `v`.
368    /// The result is undefined if the range is out of bounds.
369    #[inline(always)] unsafe fn set_fragment_unchecked(&mut self, index: usize, v: u64, v_size: u8) {
370        self.set_bits_unchecked(index * v_size as usize, v, v_size)
371    }
372
373    /// Sets index`-th fragment of `v_size` bits, i.e. bits with indices in range [`index*v_size`, `index*v_size+v_size`), to `v`.
374    /// Next, increases `index` by 1. Panics if the range is out of bounds.
375    #[inline(always)] fn set_successive_fragment(&mut self, index: &mut usize, v: u64, v_size: u8) {
376        self.set_fragment(*index, v, v_size);   *index += 1;
377    }
378
379    /// Xor at least `v_size` bits of `self` begging from `index*v_size` with `v`. Panics if the range is out of bounds.
380    #[inline(always)] fn xor_fragment(&mut self, index: usize, v: u64, v_size: u8) {
381        self.xor_bits(index * v_size as usize, v, v_size)
382    }
383
384    /// Xor at least `v_size` bits of `self` begging from `index*v_size` with `v` and increase `index` by 1.
385    /// Panics if the range is out of bounds.
386    #[inline(always)] fn xor_successive_fragment(&mut self, index: &mut usize, v: u64, v_size: u8) {
387        self.xor_fragment(*index, v, v_size);   *index += 1;
388    }
389
390    /// Swaps ranges of bits: [`index1*v_size`, `index1*v_size+v_size`) with [`index2*v_size`, `index2*v_size+v_size`).
391    fn swap_fragments(&mut self, index1: usize, index2: usize, v_size: u8) {
392        // TODO faster implementation
393        let v1 = self.get_fragment(index1, v_size);
394        unsafe{self.set_fragment_unchecked(index1, self.get_fragment(index2, v_size), v_size)};
395        unsafe{self.set_fragment_unchecked(index2, v1, v_size);}
396    }
397
398    /// Conditionally (if `new_value` does not return [`None`]) changes
399    /// the value `old` stored at bits `[begin, begin+v_size)`
400    /// to the one returned by `new_value` (whose argument is `old`).
401    /// Returns `old` (the value before change).
402    fn conditionally_change_bits<NewValue>(&mut self, new_value: NewValue, begin: usize, v_size: u8) -> u64
403        where NewValue: FnOnce(u64) -> Option<u64>
404    {
405        let old = self.get_bits(begin, v_size);
406        if let Some(new) = new_value(old) { unsafe{self.set_bits_unchecked(begin, new, v_size)}; }
407        old
408    }
409
410    /// Conditionally (if `new_value` does not return [`None`]) changes
411    /// the value `old` stored at bits [`index*v_size`, `index*v_size+v_size`)
412    /// to the one returned by `new_value` (whose argument is `old`).
413    /// Returns `old` (the value before change).
414    #[inline(always)] fn conditionally_change_fragment<NewValue>(&mut self, new_value: NewValue, index: usize, v_size: u8) -> u64
415        where NewValue: FnOnce(u64) -> Option<u64>
416    {
417        self.conditionally_change_bits(new_value, index * v_size as usize, v_size)
418    }
419
420    /// Conditionally (if `predicate` return `true`) replaces the bits
421    /// [`begin`, `begin+v_size`) of `self` by the bits [`begin`, `begin+v_size`) of `src`.
422    /// Subsequent `predicate` arguments are the bits [`begin`, `begin+v_size`) of:
423    /// `self` and `src`.
424    #[inline(always)] fn conditionally_copy_bits<Pred>(&mut self, src: &Self, predicate: Pred, begin: usize, v_size: u8)
425        where Pred: FnOnce(u64, u64) -> bool
426    {
427        let src_bits = src.get_bits(begin, v_size);
428        self.conditionally_change_bits(|self_bits| predicate(self_bits, src_bits).then(|| src_bits), begin, v_size);
429    }
430
431    /// Conditionally (if `predicate` return `true`) replaces the bits
432    /// [`index*v_size`, `index*v_size+v_size`) of `self`
433    /// by the bits [`index*v_size`, `index*v_size+v_size`) of `src`.
434    /// Subsequent `predicate` arguments are the bits [`index*v_size`, `index*v_size+v_size`) of:
435    /// `self` and `src`.
436    #[inline(always)] fn conditionally_copy_fragment<Pred>(&mut self, src: &Self, predicate: Pred, index: usize, v_size: u8)
437        where Pred: FnOnce(u64, u64) -> bool
438    {
439        self.conditionally_copy_bits(src, predicate, index * v_size as usize, v_size)
440    }
441
442    /// Returns the number of trailing 0 bits.
443    fn trailing_zero_bits(&self) -> usize;
444
445    /// Returns the lowest index of 1-bit that is grater or equal to `start_index`.
446    /// The result is undefined if there is no such index.
447    unsafe fn find_bit_one_unchecked(&self, start_index: usize) -> usize;
448
449    /// Returns the lowest index of 1-bit that is grater or equal to `start_index`.
450    /// Retruns [`None`] if there is no such index.
451    fn find_bit_one(&self, start_index: usize) -> Option<usize>;
452
453    /// Returns the greatest index of 1-bit that is lower or equal to `start_index`.
454    /// The result is undefined if there is no such index.
455    unsafe fn rfind_bit_one_unchecked(&self, start_index: usize) -> usize;
456}
457
458/// The trait that is implemented for `Box<[u64]>` and extends it with bit-oriented constructors.
459pub trait BitVec where Self: Sized {
460    /// Returns vector of `segments_len` 64 bit segments, each segment initialized to `segments_value`.
461    fn with_64bit_segments(segments_value: u64, segments_len: usize) -> Self;
462
463    /// Returns vector of bits filled with `words_count` `word`s of length `word_len_bits` bits each.
464    fn with_bitwords(word: u64, word_len_bits: u8, words_count: usize) -> Self;
465
466    /// Returns vector of `segments_len` 64 bit segments, with all bits set to `0`.
467    #[inline(always)] fn with_zeroed_64bit_segments(segments_len: usize) -> Self {
468        Self::with_64bit_segments(0, segments_len)
469    }
470
471    /// Returns vector of `segments_len` 64 bit segments, with all bits set to `1`.
472    #[inline(always)] fn with_filled_64bit_segments(segments_len: usize) -> Self {
473        Self::with_64bit_segments(u64::MAX, segments_len)
474    }
475
476    /// Returns vector of `bit_len` bits, all set to `0`.
477    #[inline(always)] fn with_zeroed_bits(bit_len: usize) -> Self {
478        Self::with_zeroed_64bit_segments(ceiling_div(bit_len, 64))
479    }
480
481    /// Returns vector of `bit_len` bits, all set to `1`.
482    #[inline(always)] fn with_filled_bits(bit_len: usize) -> Self {
483        Self::with_filled_64bit_segments(ceiling_div(bit_len, 64))
484    }
485
486    //fn with_bit_fragments<V: Into<u64>, I: IntoIterator<Item=V>>(items: I, fragment_count: usize, bits_per_fragment: u8) -> Box<[u64]>
487}
488
489impl BitVec for Box<[u64]> {
490    #[inline(always)] fn with_64bit_segments(segments_value: u64, segments_len: usize) -> Self {
491        vec![segments_value; segments_len].into_boxed_slice()
492    }
493
494    fn with_bitwords(word: u64, word_len_bits: u8, words_count: usize) -> Self {
495        let mut result = Self::with_zeroed_bits(words_count * word_len_bits as usize);
496        for index in 0..words_count { result.init_fragment(index, word, word_len_bits); }
497        result
498    }
499}
500
501#[cfg(feature = "aligned-vec")]
502impl<const ALIGN: usize> BitVec for aligned_vec::ABox<[u64], aligned_vec::ConstAlign<ALIGN>> {
503    #[inline(always)] fn with_64bit_segments(segments_value: u64, segments_len: usize) -> Self {
504        aligned_vec::avec![[ALIGN] | segments_value; segments_len].into_boxed_slice()
505    }
506
507    fn with_bitwords(word: u64, word_len_bits: u8, words_count: usize) -> Self {
508        let mut result = Self::with_zeroed_bits(words_count * word_len_bits as usize);
509        for index in 0..words_count { result.init_fragment(index, word, word_len_bits); }
510        result
511    }
512}
513
514/*#[inline(always)] pub fn bitvec_len_for_bits(bits_len: usize) -> usize { ceiling_div(bits_len, 64) }
515
516#[inline(always)] pub fn bitvec_with_segments_len_and_value(segments_len: usize, segments_value: u64) -> Box<[u64]> {
517    vec![segments_value; segments_len].into_boxed_slice()
518}
519#[inline(always)] pub fn bitvec_with_segments_len_zeroed(segments_len: usize) -> Box<[u64]> {
520    bitvec_with_segments_len_and_value(segments_len, 0)
521}
522#[inline(always)] pub fn bitvec_with_segments_len_filled(segments_len: usize) -> Box<[u64]> {
523    bitvec_with_segments_len_and_value(segments_len, u64::MAX)
524}
525#[inline(always)] pub fn bitvec_with_bits_len_zeroed(bits_len: usize) -> Box<[u64]> {
526    bitvec_with_segments_len_zeroed(bitvec_len_for_bits(bits_len))
527}
528#[inline(always)] pub fn bitvec_with_bits_len_filled(bits_len: usize) -> Box<[u64]> {
529    bitvec_with_segments_len_filled(bitvec_len_for_bits(bits_len))
530}
531
532pub fn bitvec_with_items<V: Into<u64>, I: IntoIterator<Item=V>>(items: I, fragment_count: usize, bits_per_fragment: u8) -> Box<[u64]> {
533    let mut result = bitvec_with_bits_len_zeroed(fragment_count * bits_per_fragment as usize);
534    for (i, v) in items.into_iter().enumerate() {
535        result.init_fragment(i, v.into(), bits_per_fragment);
536    }
537    result
538}*/
539
540/// Set `bit_nr` bit of `v` to given `value`.
541#[inline(always)] fn set_bit_to(to_change: &mut u64, bit_nr: usize, value: bool) {
542    *to_change &= !(1u64 << bit_nr);
543    *to_change |= (value as u64) << bit_nr;
544    // Conditionally set or clear bits without branching 
545    // https://graphics.stanford.edu/~seander/bithacks.html#ConditionalSetOrClearBitsWithoutBranching
546    // Slower due to benchmark:
547    //let m = 1 << bit_nr;
548    //*to_change = (*to_change & !m) | ((value as u64).wrapping_neg() & m);
549}
550
551#[inline(always)] fn set_bits_to(to_change: &mut u64, shifted_v: u64, shifted_v_mask: u64) {
552    *to_change &= !shifted_v_mask;
553    *to_change |= shifted_v;
554}
555
556impl BitAccess for [u64] {
557    #[inline(always)] fn get_bit(&self, bit_nr: usize) -> bool {
558        self[bit_nr / 64] & (1u64 << (bit_nr % 64)) != 0
559    }
560
561    #[inline(always)] fn set_bit_to(&mut self, bit_nr: usize, value: bool) {
562        set_bit_to(&mut self[bit_nr / 64], bit_nr % 64, value)
563    }
564
565    #[inline(always)] unsafe fn set_bit_to_unchecked(&mut self, bit_nr: usize, value: bool) {
566        debug_assert!(bit_nr / 64 < self.len());
567        set_bit_to(self.get_unchecked_mut(bit_nr / 64), bit_nr % 64, value)
568        //if value { self.set_bit_unchecked(bit_nr) } else { self.clear_bit_unchecked(bit_nr) }
569    }
570
571    #[inline(always)] unsafe fn get_bit_unchecked(&self, bit_nr: usize) -> bool {
572        debug_assert!(bit_nr / 64 < self.len());
573        self.get_unchecked(bit_nr / 64) & (1u64 << (bit_nr % 64) as u64) != 0
574    }
575
576    #[inline(always)] fn try_get_bit(&self, bit_nr: usize) -> Option<bool> {
577        Some(self.get(bit_nr / 64)? & (1u64 << (bit_nr % 64) as u64) != 0)
578    }
579
580    #[inline(always)] fn init_bit(&mut self, bit_nr: usize, value: bool) {
581        self[bit_nr / 64] |= (value as u64) << (bit_nr % 64);
582    }
583
584    #[inline] unsafe fn init_bit_unchecked(&mut self, bit_nr: usize, value: bool) {
585        //debug_assert!({let current = self.get_bit(bit_nr); current == false || current == value});
586        debug_assert!(bit_nr / 64 < self.len());
587        *self.get_unchecked_mut(bit_nr / 64) |= (value as u64) << (bit_nr % 64);
588    }
589
590    #[inline(always)] fn set_bit(&mut self, bit_nr: usize) {
591        self[bit_nr / 64] |= 1u64 << (bit_nr % 64)
592    }
593
594    #[inline(always)] unsafe fn set_bit_unchecked(&mut self, bit_nr: usize) {
595        debug_assert!(bit_nr / 64 < self.len());
596        *self.get_unchecked_mut(bit_nr / 64) |= 1u64 << (bit_nr % 64)
597    }
598
599    #[inline(always)] fn clear_bit(&mut self, bit_nr: usize) {
600        self[bit_nr / 64] &= !((1u64) << (bit_nr % 64))
601    }
602
603    #[inline(always)] unsafe fn clear_bit_unchecked(&mut self, bit_nr: usize) {
604        debug_assert!(bit_nr / 64 < self.len());
605        *self.get_unchecked_mut(bit_nr / 64) &= !((1u64) << (bit_nr % 64))
606    }
607
608    fn count_bit_zeros(&self) -> usize {
609        self.into_iter().map(|s| s.count_zeros() as usize).sum()
610    }
611
612    fn count_bit_ones(&self) -> usize {
613        self.into_iter().map(|s| s.count_ones() as usize).sum()
614    }
615
616    #[inline(always)] fn bit_ones(&'_ self) -> BitOnesIterator<'_> {
617        BitOnesIterator::new(self)
618    }
619
620    #[inline(always)] fn bit_zeros(&'_ self) -> BitZerosIterator<'_> {
621        BitZerosIterator::new(self)
622    }
623
624    #[inline(always)] fn bit_iter(&'_ self) -> BitIterator<'_> {
625        BitIterator::new(self)
626    }
627
628    #[inline(always)] fn bit_in_range_iter(&'_ self, bit_range: Range<usize>) -> BitIterator<'_> {
629        BitIterator::with_range(self, bit_range)
630    }
631
632    #[inline(always)] unsafe fn bit_in_unchecked_range_iter(&'_ self, bit_range: Range<usize>) -> BitIterator<'_> {
633        BitIterator::with_range_unchecked(self, bit_range)
634    }
635
636    #[inline] fn try_get_bits_unmasked(&self, begin: usize, len: u8) -> Option<u64> {
637        //((begin+(len as usize))/64 < self.len()).then(|| unsafe{self.get_bits_unmasked_unchecked(begin, len)})
638        let (segment, offset) = (begin / 64, (begin % 64) as u8);
639        let w1 = self.get(segment)? >> offset;
640        //let bits_in_w1 = 64-offset;
641        Some(if offset+len > 64 /*len > bits_in_w1*/ { // do we need more bits (from next segment)? Does len > bits_in_w1?
642            let bits_in_w1 = 64-offset; // w1 has bits_in_w1 lowest bit set (copied from index_segment)
643            w1 | (self.get(segment+1)? << bits_in_w1)
644        } else {
645            w1
646        })
647    }
648
649    #[inline] unsafe fn get_bits_unmasked_unchecked(&self, begin: usize, len: u8) -> u64 {
650        let (segment, offset) = (begin / 64, (begin % 64) as u8);
651        debug_assert!(segment < self.len());
652        let w1 = self.get_unchecked(segment) >> offset;
653        if offset+len > 64 /*len > bits_in_w1*/ { // do we need more bits (from next segment)?
654            let bits_in_w1 = 64-offset; // w1 has bits_in_w1 lowest bit set (copied from index_segment)
655            debug_assert!(segment+1 < self.len());
656            w1 | (self.get_unchecked(segment+1) << bits_in_w1)
657        } else {
658            w1
659        }
660    }
661
662    fn init_bits(&mut self, begin: usize, v: u64, len: u8) {
663        debug_assert!({let f = self.get_bits(begin, len); f == 0 || f == v});
664        let (segment, offset) = (begin / 64, (begin % 64) as u8);
665        if offset + len > 64 {
666            self[segment+1] |= v >> (64-offset);
667        }
668        self[segment] |= v << offset;
669    }
670
671    unsafe fn init_bits_unchecked(&mut self, begin: usize, v: u64, len: u8) {
672        debug_assert!({let f = self.get_bits(begin, len); f == 0 || f == v});
673        let (segment, offset) = (begin / 64, (begin % 64) as u8);
674        if offset + len > 64 {
675            *self.get_unchecked_mut(segment+1) |= v >> (64-offset);
676        }
677        *self.get_unchecked_mut(segment) |= v << offset;
678    }
679
680    fn set_bits(&mut self, begin: usize, v: u64, len: u8) {
681        let (segment, offset) = (begin / 64, (begin % 64) as u8);
682        let v_mask = n_lowest_bits(len);
683        //let lo_bit_len = 64-offset;
684        if offset + len > 64 /*len > lo_bit_len*/ {
685            let shift = 64-offset; //lo_bit_len
686            set_bits_to(&mut self[segment+1], v>>shift, v_mask>>shift);
687        }
688        set_bits_to(&mut self[segment], v<<offset, v_mask<<offset);
689    }
690
691    unsafe fn set_bits_unchecked(&mut self, begin: usize, v: u64, len: u8) {
692        let (segment, offset) = (begin / 64, (begin % 64) as u8);
693        let v_mask = n_lowest_bits(len);
694        if offset + len > 64 {
695            let shift = 64-offset; //lo_bit_len
696            debug_assert!(segment+1 < self.len());
697            set_bits_to(self.get_unchecked_mut(segment+1), v>>shift, v_mask>>shift);
698        }
699        debug_assert!(segment < self.len());
700        set_bits_to(self.get_unchecked_mut(segment), v<<offset, v_mask<<offset);
701    }
702
703    fn xor_bits(&mut self, begin: usize, v: u64, len: u8) {
704        let (segment, offset) = (begin / 64, (begin % 64) as u8);
705        if offset + len > 64 {
706            let shift = 64-offset;
707            self[segment+1] ^= v >> shift;
708        }
709        self[segment] ^= v << offset;
710    }
711
712    fn conditionally_change_bits<NewValue>(&mut self, new_value: NewValue, begin: usize, v_size: u8) -> u64
713        where NewValue: FnOnce(u64) -> Option<u64>
714    {
715        let (segment, offset) = (begin / 64, (begin % 64) as u64);
716        let w1 = self[segment]>>offset;
717        let bits_in_w1 = 64-offset;
718        let v_mask = n_lowest_bits(v_size);
719        let r = if v_size as u64 > bits_in_w1 {
720            w1 | (self[segment+1] << bits_in_w1)
721        } else {
722            w1
723        } & v_mask;
724        if let Some(v) = new_value(r) {
725            if v_size as u64 > bits_in_w1 {
726                set_bits_to(&mut self[segment + 1], v >> bits_in_w1, v_mask >> bits_in_w1);
727            }
728            set_bits_to(&mut self[segment], v << offset, v_mask << offset);
729        }
730        r
731    }
732
733    fn conditionally_copy_bits<Pred>(&mut self, src: &Self, predicate: Pred, begin: usize, v_size: u8)
734        where Pred: FnOnce(u64, u64) -> bool
735    {
736        let (segment, offset) = (begin / 64, (begin % 64) as u8);
737        let self_w1 = self[segment]>>offset;
738        let mut src_w1 = src[segment]>>offset;
739        let bits_in_w1 = 64-offset;
740        let v_mask = n_lowest_bits(v_size);
741        if v_size > bits_in_w1 {
742            let w2_mask = v_mask >> bits_in_w1;
743            let self_bits = self_w1 | ((self[segment+1] & w2_mask) << bits_in_w1);
744            let src_w2 = src[segment+1] & w2_mask;
745            if predicate(self_bits, src_w1 | (src_w2 << bits_in_w1)) {
746                set_bits_to(&mut self[segment+1], src_w2, w2_mask);
747                set_bits_to(&mut self[segment], src_w1 << offset, v_mask << offset);
748            }
749        } else {
750            src_w1 &= v_mask;
751            if predicate(self_w1 & v_mask, src_w1) {
752                set_bits_to(&mut self[segment], src_w1 << offset, v_mask << offset);
753            }
754        };
755    }
756
757    fn trailing_zero_bits(&self) -> usize {
758        for (i, v) in self.iter().copied().enumerate() {
759            if v != 0 { return i * 64 + v.trailing_zeros() as usize; }
760        }
761        self.len() * 64 // the vector contains only zeros
762    }
763
764    fn find_bit_one(&self, start_index: usize) -> Option<usize> {
765        let mut word_index = start_index / 64;
766        let mut bits = self.get(word_index)? & !n_lowest_bits((start_index % 64) as u8);
767        while bits == 0 {
768            word_index += 1;
769            bits = *self.get(word_index)?;
770        }
771        Some(word_index * 64 + (bits.trailing_zeros() as usize))
772    }
773
774    unsafe fn find_bit_one_unchecked(&self, start_index: usize) -> usize {
775        let mut word_index = start_index / 64;
776        debug_assert!(word_index < self.len());
777        let mut bits = self.get_unchecked(word_index) & !n_lowest_bits((start_index % 64) as u8);
778        while bits == 0 {
779            word_index += 1;
780            debug_assert!(word_index < self.len());
781            bits = *self.get_unchecked(word_index);
782        }
783        word_index * 64 + bits.trailing_zeros() as usize
784    }
785
786    unsafe fn rfind_bit_one_unchecked(&self, start_index: usize) -> usize {
787        let mut word_index = start_index / 64;
788        debug_assert!(word_index < self.len());
789        let mut bits = self.get_unchecked(word_index) & n_lowest_bits_1_64((start_index % 64) as u8 + 1);
790        while bits == 0 {
791            word_index -= 1;
792            debug_assert!(word_index < self.len());
793            bits = *self.get_unchecked(word_index);
794        }
795        word_index * 64 + bits.ilog2() as usize
796    }
797}
798
799#[cfg(test)]
800mod tests {
801    // Note this useful idiom: importing names from outer (for mod tests) scope.
802    use super::*;
803
804    #[test]
805    fn fragments_init_set_swap() {
806        let mut b = Box::<[u64]>::with_zeroed_64bit_segments(2);
807        assert_eq!(b.as_ref(), [0u64, 0u64]);
808        b.init_fragment(1, 0b101, 3);
809        assert_eq!(b.get_fragment(1, 3), 0b101);
810        assert_eq!(unsafe{b.find_bit_one_unchecked(0)}, 3);
811        assert_eq!(unsafe{b.find_bit_one_unchecked(3)}, 3);
812        assert_eq!(unsafe{b.find_bit_one_unchecked(4)}, 5);
813        assert_eq!(b.get_fragment(0, 3), 0);
814        assert_eq!(b.get_fragment(2, 3), 0);
815        b.init_fragment(2, 0b10110_10110_10110_10110_10110_10110, 30);
816        assert_eq!(b.get_fragment(2, 30), 0b10110_10110_10110_10110_10110_10110);
817        assert_eq!(b.get_fragment(1, 30), 0);
818        assert_eq!(b.get_fragment(3, 30), 0);
819        b.set_fragment(2, 0b11010_11010_11111_00000_11111_10110, 30);
820        assert_eq!(b.get_fragment(2, 30), 0b11010_11010_11111_00000_11111_10110);
821        assert_eq!(b.get_fragment(1, 30), 0);
822        assert_eq!(b.get_fragment(3, 30), 0);
823        b.swap_fragments(2, 3, 30);
824        assert_eq!(b.get_fragment(3, 30), 0b11010_11010_11111_00000_11111_10110);
825        assert_eq!(b.get_fragment(2, 30), 0);
826        assert_eq!(b.get_fragment(1, 30), 0);
827    }
828
829    #[test]
830    fn fragments_conditionally_change() {
831        let mut b = Box::<[u64]>::with_zeroed_64bit_segments(2);
832        let old = b.conditionally_change_fragment(|old| if 0b101>old {Some(0b101)} else {None}, 1, 3);
833        assert_eq!(old, 0);
834        assert_eq!(b.get_fragment(1, 3), 0b101);
835        assert_eq!(b.get_fragment(0, 3), 0);
836        assert_eq!(b.get_fragment(2, 3), 0);
837        let bits = 0b10110_10110_10110_10110_10110_10110;
838        let old = b.conditionally_change_fragment(|old| if old==bits {Some(bits)} else {None}, 2, 30);
839        assert_eq!(old, 0);
840        assert_eq!(b.get_fragment(2, 30), 0);
841        assert_eq!(b.get_fragment(1, 30), 0);
842        assert_eq!(b.get_fragment(3, 30), 0);
843        let old = b.conditionally_change_fragment(|old| if old!=bits {Some(bits)} else {None}, 2, 30);
844        assert_eq!(old, 0);
845        assert_eq!(b.get_fragment(2, 30), bits);
846        assert_eq!(b.get_fragment(1, 30), 0);
847        assert_eq!(b.get_fragment(3, 30), 0);
848        let bits2 = 0b1100_11111_00000_10110_00111_11100;
849        let old = b.conditionally_change_fragment(|old| if old!=bits2 {Some(bits2)} else {None}, 2, 30);
850        assert_eq!(old, bits);
851        assert_eq!(b.get_fragment(2, 30), bits2);
852        assert_eq!(b.get_fragment(1, 30), 0);
853        assert_eq!(b.get_fragment(3, 30), 0);
854    }
855
856    #[test]
857    fn fragments_conditionally_copy() {
858        let src = Box::<[u64]>::with_filled_64bit_segments(2);
859        let mut dst = Box::<[u64]>::with_zeroed_64bit_segments(2);
860
861        dst.conditionally_copy_fragment(&src,
862                                        |old, new| { assert_eq!(old, 0); assert_eq!(new, 0b111); old > new},
863                                        11, 3);
864        assert_eq!(dst.get_fragment(11, 3), 0);
865        assert_eq!(dst.get_fragment(12, 3), 0);
866        dst.conditionally_copy_fragment(&src,
867                                        |old, new| { assert_eq!(old, 0); assert_eq!(new, 0b111); old < new},
868                                        11, 3);
869        assert_eq!(dst.get_fragment(11, 3), 0b111);
870        assert_eq!(dst.get_fragment(12, 3), 0);
871
872        dst.conditionally_copy_fragment(&src,
873            |old, new| { assert_eq!(old, 0); assert_eq!(new, 0b111); old > new},
874            21, 3);
875        assert_eq!(dst.get_fragment(21, 3), 0);
876        assert_eq!(dst.get_fragment(22, 3), 0);
877        dst.conditionally_copy_fragment(&src,
878                                        |old, new| { assert_eq!(old, 0); assert_eq!(new, 0b111); old < new},
879                                        21, 3);
880        assert_eq!(dst.get_fragment(21, 3), 0b111);
881        assert_eq!(dst.get_fragment(22, 3), 0);
882    }
883
884    #[test]
885    fn bits() {
886        let mut b = Box::<[u64]>::with_filled_64bit_segments(2);
887        assert_eq!(b.as_ref(), [u64::MAX, u64::MAX]);
888        assert_eq!(b.count_bit_ones(), 128);
889        assert_eq!(b.count_bit_zeros(), 0);
890        assert!(b.get_bit(3));
891        assert_eq!(b.try_get_bit(3), Some(true));
892        assert!(b.get_bit(73));
893        assert_eq!(b.try_get_bit(73), Some(true));
894        assert_eq!(b.try_get_bit(127), Some(true));
895        assert_eq!(b.try_get_bit(128), None);
896        b.clear_bit(73);
897        assert_eq!(b.count_bit_ones(), 127);
898        assert_eq!(b.count_bit_zeros(), 1);
899        assert!(!b.get_bit(73));
900        assert_eq!(b.try_get_bit(73), Some(false));
901        assert!(b.get_bit(72));
902        assert!(b.get_bit(74));
903        b.set_bit(73);
904        assert!(b.get_bit(73));
905        b.xor_bits(72, 0b011, 3);
906        assert!(!b.get_bit(72));
907        assert!(!b.get_bit(73));
908        assert!(b.get_bit(74));
909    }
910
911    #[test]
912    fn iterators() {
913        let b = [0b101u64, 0b10u64];
914        let mut ones = b.bit_ones();
915        assert_eq!(ones.len(), 3);
916        assert_eq!(ones.next(), Some(0));
917        assert_eq!(ones.len(), 2);
918        assert_eq!(ones.next(), Some(2));
919        assert_eq!(ones.len(), 1);
920        assert_eq!(ones.next(), Some(64+1));
921        assert_eq!(ones.len(), 0);
922        assert_eq!(ones.next(), None);
923        assert_eq!(ones.len(), 0);
924        assert_eq!(ones.next(), None);
925        assert_eq!(ones.len(), 0);
926        let mut all = b.bit_iter();
927        assert_eq!(all.len(), 2*64);
928        assert_eq!(all.next(), Some(true));
929        assert_eq!(all.len(), 2*64-1);
930        assert_eq!(all.next(), Some(false));
931        assert_eq!(all.len(), 2*64-2);
932        assert_eq!(all.next(), Some(true));
933        assert_eq!(all.len(), 2*64-3);
934        assert_eq!(all.nth(64-4), Some(false)); // consume 63-th element
935        assert_eq!(all.len(), 64);
936        assert_eq!(all.next(), Some(false));
937        assert_eq!(all.len(), 63);
938        assert_eq!(all.next(), Some(true));
939        assert_eq!(all.len(), 62);
940        assert_eq!(all.nth(61), Some(false));
941        assert_eq!(all.len(), 0);
942        assert_eq!(all.len(), 0);
943        assert_eq!(all.next(), None);
944        assert_eq!(all.len(), 0);
945    }
946}