1use std::{iter::FusedIterator, ops::Range};
2use super::{ceiling_div, n_lowest_bits, n_lowest_bits_1_64};
3
4pub struct BitBIterator<'a, const B: bool> {
6 segment_iter: std::slice::Iter<'a, u64>,
8 first_segment_bit: usize,
10 current_segment: u64
12}
13
14impl<'a, const B: bool> BitBIterator<'a, B> {
15 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
62pub type BitOnesIterator<'a> = BitBIterator<'a, true>;
64
65pub type BitZerosIterator<'a> = BitBIterator<'a, false>;
67
68
69
70pub struct BitIterator<'bv> {
72 bit_vec: &'bv [u64],
73 bit_range: Range<usize>,
74}
75
76impl<'bv> BitIterator<'bv> {
77 #[inline] pub fn new(bit_vec: &'bv [u64]) -> Self {
79 Self { bit_vec, bit_range: 0..bit_vec.len()*64 }
80 }
81
82 #[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 #[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 #[inline] pub fn bit_range(&self) -> &Range<usize> { &self.bit_range }
95
96 #[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
133pub trait BitAccess {
136 fn get_bit(&self, bit_nr: usize) -> bool;
138
139 unsafe fn get_bit_unchecked(&self, bit_nr: usize) -> bool;
141
142 fn try_get_bit(&self, bit_nr: usize) -> Option<bool>;
144
145 #[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 fn set_bit_to(&mut self, bit_nr: usize, value: bool);
154
155 unsafe fn set_bit_to_unchecked(&mut self, bit_nr: usize, value: bool);
157
158 #[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 #[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 fn init_bit(&mut self, bit_nr: usize, value: bool);
174
175 unsafe fn init_bit_unchecked(&mut self, bit_nr: usize, value: bool);
179
180 #[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 #[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 fn set_bit(&mut self, bit_nr: usize);
198
199 unsafe fn set_bit_unchecked(&mut self, bit_nr: usize);
201
202 fn clear_bit(&mut self, bit_nr: usize);
204
205 unsafe fn clear_bit_unchecked(&mut self, bit_nr: usize);
207
208 #[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 #[inline] fn get_bits(&self, begin: usize, len: u8) -> u64 {
215 self.get_bits_unmasked(begin, len) & n_lowest_bits(len)
217 }
218
219 fn try_get_bits_unmasked(&self, begin: usize, len: u8) -> Option<u64>;
222
223 #[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 unsafe fn get_bits_unmasked_unchecked(&self, begin: usize, len: u8) -> u64;
230
231 #[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 #[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 fn init_bits(&mut self, begin: usize, v: u64, len: u8);
246
247 #[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 unsafe fn init_bits_unchecked(&mut self, begin: usize, v: u64, len: u8);
256
257 fn set_bits(&mut self, begin: usize, v: u64, len: u8);
259
260 #[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 unsafe fn set_bits_unchecked(&mut self, begin: usize, v: u64, len: u8);
267
268 fn xor_bits(&mut self, begin: usize, v: u64, len: u8);
270
271 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 fn count_bit_zeros(&self) -> usize;
279
280 fn count_bit_ones(&self) -> usize;
282
283 fn bit_ones(&'_ self) -> BitOnesIterator<'_>;
285
286 fn bit_zeros(&'_ self) -> BitZerosIterator<'_>;
288
289 fn bit_iter(&'_ self) -> BitIterator<'_>;
291
292 fn bit_in_range_iter(&'_ self, bit_range: Range<usize>) -> BitIterator<'_>;
294
295 unsafe fn bit_in_unchecked_range_iter(&'_ self, bit_range: Range<usize>) -> BitIterator<'_>;
298
299 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 fn swap_fragments(&mut self, index1: usize, index2: usize, v_size: u8) {
392 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 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 #[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 #[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 #[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 fn trailing_zero_bits(&self) -> usize;
444
445 unsafe fn find_bit_one_unchecked(&self, start_index: usize) -> usize;
448
449 fn find_bit_one(&self, start_index: usize) -> Option<usize>;
452
453 unsafe fn rfind_bit_one_unchecked(&self, start_index: usize) -> usize;
456}
457
458pub trait BitVec where Self: Sized {
460 fn with_64bit_segments(segments_value: u64, segments_len: usize) -> Self;
462
463 fn with_bitwords(word: u64, word_len_bits: u8, words_count: usize) -> Self;
465
466 #[inline(always)] fn with_zeroed_64bit_segments(segments_len: usize) -> Self {
468 Self::with_64bit_segments(0, segments_len)
469 }
470
471 #[inline(always)] fn with_filled_64bit_segments(segments_len: usize) -> Self {
473 Self::with_64bit_segments(u64::MAX, segments_len)
474 }
475
476 #[inline(always)] fn with_zeroed_bits(bit_len: usize) -> Self {
478 Self::with_zeroed_64bit_segments(ceiling_div(bit_len, 64))
479 }
480
481 #[inline(always)] fn with_filled_bits(bit_len: usize) -> Self {
483 Self::with_filled_64bit_segments(ceiling_div(bit_len, 64))
484 }
485
486 }
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)] 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 }
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 }
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!(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 let (segment, offset) = (begin / 64, (begin % 64) as u8);
639 let w1 = self.get(segment)? >> offset;
640 Some(if offset+len > 64 { let bits_in_w1 = 64-offset; 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 { let bits_in_w1 = 64-offset; 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 if offset + len > 64 {
685 let shift = 64-offset; 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; 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 }
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 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)); 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}