1use crate::bit_chunk_iterator::BitChunks;
19use crate::bit_iterator::{BitIndexIterator, BitIndexU32Iterator, BitIterator, BitSliceIterator};
20use crate::{
21 BooleanBufferBuilder, Buffer, MutableBuffer, bit_util, buffer_bin_and, buffer_bin_or,
22 buffer_bin_xor, buffer_unary_not,
23};
24
25use std::ops::{BitAnd, BitOr, BitXor, Not};
26
27#[derive(Debug, Clone, Eq)]
75pub struct BooleanBuffer {
76 buffer: Buffer,
78 bit_offset: usize,
80 bit_len: usize,
82}
83
84impl PartialEq for BooleanBuffer {
85 fn eq(&self, other: &Self) -> bool {
86 if self.bit_len != other.bit_len {
87 return false;
88 }
89
90 let lhs = self.bit_chunks().iter_padded();
91 let rhs = other.bit_chunks().iter_padded();
92 lhs.zip(rhs).all(|(a, b)| a == b)
93 }
94}
95
96impl BooleanBuffer {
97 pub fn new(buffer: Buffer, bit_offset: usize, bit_len: usize) -> Self {
103 let total_len = bit_offset.saturating_add(bit_len);
104 let buffer_len = buffer.len();
105 let buffer_bit_len = buffer_len.saturating_mul(8);
106 assert!(
107 total_len <= buffer_bit_len,
108 "buffer not large enough (bit_offset: {bit_offset}, bit_len: {bit_len}, buffer_len: {buffer_len})"
109 );
110 Self {
111 buffer,
112 bit_offset,
113 bit_len,
114 }
115 }
116
117 pub fn new_set(length: usize) -> Self {
119 let mut builder = BooleanBufferBuilder::new(length);
120 builder.append_n(length, true);
121 builder.finish()
122 }
123
124 pub fn new_unset(length: usize) -> Self {
126 let buffer = MutableBuffer::new_null(length).into_buffer();
127 Self {
128 buffer,
129 bit_offset: 0,
130 bit_len: length,
131 }
132 }
133
134 pub fn collect_bool<F: FnMut(usize) -> bool>(len: usize, f: F) -> Self {
136 let buffer = MutableBuffer::collect_bool(len, f);
137 Self::new(buffer.into(), 0, len)
138 }
139
140 pub fn from_bits(src: impl AsRef<[u8]>, offset_in_bits: usize, len_in_bits: usize) -> Self {
154 Self::from_bitwise_unary_op(src, offset_in_bits, len_in_bits, |a| a)
155 }
156
157 pub fn from_bitwise_unary_op<F>(
186 src: impl AsRef<[u8]>,
187 offset_in_bits: usize,
188 len_in_bits: usize,
189 mut op: F,
190 ) -> Self
191 where
192 F: FnMut(u64) -> u64,
193 {
194 if offset_in_bits & 0x7 == 0 {
196 let aligned = &src.as_ref()[offset_in_bits / 8..];
198 if let Some(result) =
199 Self::try_from_aligned_bitwise_unary_op(aligned, len_in_bits, &mut op)
200 {
201 return result;
202 }
203 }
204
205 let chunks = BitChunks::new(src.as_ref(), offset_in_bits, len_in_bits);
206 let mut result = MutableBuffer::with_capacity(chunks.num_u64s() * 8);
207 for chunk in chunks.iter() {
208 unsafe {
211 result.push_unchecked(op(chunk));
212 }
213 }
214 if chunks.remainder_len() > 0 {
215 debug_assert!(result.capacity() >= result.len() + 8); unsafe {
219 result.push_unchecked(op(chunks.remainder_bits()));
220 }
221 result.truncate(chunks.num_bytes());
223 }
224
225 BooleanBuffer {
226 buffer: Buffer::from(result),
227 bit_offset: 0,
228 bit_len: len_in_bits,
229 }
230 }
231
232 fn try_from_aligned_bitwise_unary_op<F>(
237 src: &[u8],
238 len_in_bits: usize,
239 op: &mut F,
240 ) -> Option<Self>
241 where
242 F: FnMut(u64) -> u64,
243 {
244 let (prefix, aligned_u6us, suffix) = unsafe { src.align_to::<u64>() };
246 if !(prefix.is_empty() && suffix.is_empty()) {
247 return None;
250 }
251 let result_u64s: Vec<u64> = aligned_u6us.iter().map(|l| op(*l)).collect();
253 let buffer = Buffer::from(result_u64s);
254 Some(BooleanBuffer::new(buffer, 0, len_in_bits))
255 }
256
257 pub fn from_bitwise_binary_op<F>(
294 left: impl AsRef<[u8]>,
295 left_offset_in_bits: usize,
296 right: impl AsRef<[u8]>,
297 right_offset_in_bits: usize,
298 len_in_bits: usize,
299 mut op: F,
300 ) -> Self
301 where
302 F: FnMut(u64, u64) -> u64,
303 {
304 let left = left.as_ref();
305 let right = right.as_ref();
306 if left_offset_in_bits & 0x7 == 0 && right_offset_in_bits & 0x7 == 0 {
310 let left = &left[left_offset_in_bits / 8..];
312 let right = &right[right_offset_in_bits / 8..];
313
314 unsafe {
315 let (left_prefix, left_u64s, left_suffix) = left.align_to::<u64>();
316 let (right_prefix, right_u64s, right_suffix) = right.align_to::<u64>();
317 if left_prefix.is_empty()
322 && right_prefix.is_empty()
323 && left_suffix.is_empty()
324 && right_suffix.is_empty()
325 {
326 let result_u64s = left_u64s
327 .iter()
328 .zip(right_u64s.iter())
329 .map(|(l, r)| op(*l, *r))
330 .collect::<Vec<u64>>();
331 return BooleanBuffer {
332 buffer: Buffer::from(result_u64s),
333 bit_offset: 0,
334 bit_len: len_in_bits,
335 };
336 }
337 }
338 }
339 let left_chunks = BitChunks::new(left, left_offset_in_bits, len_in_bits);
340 let right_chunks = BitChunks::new(right, right_offset_in_bits, len_in_bits);
341
342 let chunks = left_chunks
343 .iter()
344 .zip(right_chunks.iter())
345 .map(|(left, right)| op(left, right));
346 let mut buffer = unsafe { MutableBuffer::from_trusted_len_iter(chunks) };
349
350 let remainder_bytes = bit_util::ceil(left_chunks.remainder_len(), 8);
351 let rem = op(left_chunks.remainder_bits(), right_chunks.remainder_bits());
352 let rem = &rem.to_le_bytes()[0..remainder_bytes];
354 buffer.extend_from_slice(rem);
355
356 BooleanBuffer {
357 buffer: Buffer::from(buffer),
358 bit_offset: 0,
359 bit_len: len_in_bits,
360 }
361 }
362
363 pub fn count_set_bits(&self) -> usize {
365 self.buffer
366 .count_set_bits_offset(self.bit_offset, self.bit_len)
367 }
368
369 pub fn find_nth_set_bit_position(&self, start: usize, n: usize) -> usize {
372 if n == 0 {
373 return start;
374 }
375
376 self.slice(start, self.bit_len - start)
377 .set_indices()
378 .nth(n - 1)
379 .map(|idx| start + idx + 1)
380 .unwrap_or(self.bit_len)
381 }
382
383 #[inline]
386 pub fn bit_chunks(&self) -> BitChunks<'_> {
387 BitChunks::new(self.values(), self.bit_offset, self.bit_len)
388 }
389
390 #[inline]
392 pub fn offset(&self) -> usize {
393 self.bit_offset
394 }
395
396 #[inline]
398 pub fn len(&self) -> usize {
399 self.bit_len
400 }
401
402 #[inline]
404 pub fn is_empty(&self) -> bool {
405 self.bit_len == 0
406 }
407
408 pub fn shrink_to_fit(&mut self) {
410 self.buffer.shrink_to_fit();
412 }
413
414 #[inline]
420 pub fn value(&self, idx: usize) -> bool {
421 assert!(idx < self.bit_len);
422 unsafe { self.value_unchecked(idx) }
423 }
424
425 #[inline]
430 pub unsafe fn value_unchecked(&self, i: usize) -> bool {
431 unsafe { bit_util::get_bit_raw(self.buffer.as_ptr(), i + self.bit_offset) }
432 }
433
434 #[inline]
436 pub fn values(&self) -> &[u8] {
437 &self.buffer
438 }
439
440 pub fn slice(&self, offset: usize, len: usize) -> Self {
442 assert!(
443 offset.saturating_add(len) <= self.bit_len,
444 "the length + offset of the sliced BooleanBuffer cannot exceed the existing length"
445 );
446 Self {
447 buffer: self.buffer.clone(),
448 bit_offset: self.bit_offset + offset,
449 bit_len: len,
450 }
451 }
452
453 pub fn sliced(&self) -> Buffer {
457 self.buffer.bit_slice(self.bit_offset, self.bit_len)
458 }
459
460 pub fn ptr_eq(&self, other: &Self) -> bool {
464 self.buffer.as_ptr() == other.buffer.as_ptr()
465 && self.bit_offset == other.bit_offset
466 && self.bit_len == other.bit_len
467 }
468
469 #[inline]
473 pub fn inner(&self) -> &Buffer {
474 &self.buffer
475 }
476
477 pub fn into_inner(self) -> Buffer {
481 self.buffer
482 }
483
484 pub fn iter(&self) -> BitIterator<'_> {
486 self.into_iter()
487 }
488
489 pub fn set_indices(&self) -> BitIndexIterator<'_> {
491 BitIndexIterator::new(self.values(), self.bit_offset, self.bit_len)
492 }
493
494 pub fn set_indices_u32(&self) -> BitIndexU32Iterator<'_> {
496 BitIndexU32Iterator::new(self.values(), self.bit_offset, self.bit_len)
497 }
498
499 pub fn set_slices(&self) -> BitSliceIterator<'_> {
501 BitSliceIterator::new(self.values(), self.bit_offset, self.bit_len)
502 }
503}
504
505impl Not for &BooleanBuffer {
506 type Output = BooleanBuffer;
507
508 fn not(self) -> Self::Output {
509 BooleanBuffer {
510 buffer: buffer_unary_not(&self.buffer, self.bit_offset, self.bit_len),
511 bit_offset: 0,
512 bit_len: self.bit_len,
513 }
514 }
515}
516
517impl BitAnd<&BooleanBuffer> for &BooleanBuffer {
518 type Output = BooleanBuffer;
519
520 fn bitand(self, rhs: &BooleanBuffer) -> Self::Output {
521 assert_eq!(self.bit_len, rhs.bit_len);
522 BooleanBuffer {
523 buffer: buffer_bin_and(
524 &self.buffer,
525 self.bit_offset,
526 &rhs.buffer,
527 rhs.bit_offset,
528 self.bit_len,
529 ),
530 bit_offset: 0,
531 bit_len: self.bit_len,
532 }
533 }
534}
535
536impl BitOr<&BooleanBuffer> for &BooleanBuffer {
537 type Output = BooleanBuffer;
538
539 fn bitor(self, rhs: &BooleanBuffer) -> Self::Output {
540 assert_eq!(self.bit_len, rhs.bit_len);
541 BooleanBuffer {
542 buffer: buffer_bin_or(
543 &self.buffer,
544 self.bit_offset,
545 &rhs.buffer,
546 rhs.bit_offset,
547 self.bit_len,
548 ),
549 bit_offset: 0,
550 bit_len: self.bit_len,
551 }
552 }
553}
554
555impl BitXor<&BooleanBuffer> for &BooleanBuffer {
556 type Output = BooleanBuffer;
557
558 fn bitxor(self, rhs: &BooleanBuffer) -> Self::Output {
559 assert_eq!(self.bit_len, rhs.bit_len);
560 BooleanBuffer {
561 buffer: buffer_bin_xor(
562 &self.buffer,
563 self.bit_offset,
564 &rhs.buffer,
565 rhs.bit_offset,
566 self.bit_len,
567 ),
568 bit_offset: 0,
569 bit_len: self.bit_len,
570 }
571 }
572}
573
574impl<'a> IntoIterator for &'a BooleanBuffer {
575 type Item = bool;
576 type IntoIter = BitIterator<'a>;
577
578 fn into_iter(self) -> Self::IntoIter {
579 BitIterator::new(self.values(), self.bit_offset, self.bit_len)
580 }
581}
582
583impl From<&[bool]> for BooleanBuffer {
584 fn from(value: &[bool]) -> Self {
585 let mut builder = BooleanBufferBuilder::new(value.len());
586 builder.append_slice(value);
587 builder.finish()
588 }
589}
590
591impl From<Vec<bool>> for BooleanBuffer {
592 fn from(value: Vec<bool>) -> Self {
593 value.as_slice().into()
594 }
595}
596
597impl FromIterator<bool> for BooleanBuffer {
598 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
599 let iter = iter.into_iter();
600 let (hint, _) = iter.size_hint();
601 let mut builder = BooleanBufferBuilder::new(hint);
602 iter.for_each(|b| builder.append(b));
603 builder.finish()
604 }
605}
606
607#[cfg(test)]
608mod tests {
609 use super::*;
610
611 #[test]
612 fn test_boolean_new() {
613 let bytes = &[0, 1, 2, 3, 4];
614 let buf = Buffer::from(bytes);
615 let offset = 0;
616 let len = 24;
617
618 let boolean_buf = BooleanBuffer::new(buf.clone(), offset, len);
619 assert_eq!(bytes, boolean_buf.values());
620 assert_eq!(offset, boolean_buf.offset());
621 assert_eq!(len, boolean_buf.len());
622
623 assert_eq!(2, boolean_buf.count_set_bits());
624 assert_eq!(&buf, boolean_buf.inner());
625 assert_eq!(buf, boolean_buf.clone().into_inner());
626
627 assert!(!boolean_buf.is_empty())
628 }
629
630 #[test]
631 fn test_boolean_data_equality() {
632 let boolean_buf1 = BooleanBuffer::new(Buffer::from(&[0, 1, 4, 3, 5]), 0, 32);
633 let boolean_buf2 = BooleanBuffer::new(Buffer::from(&[0, 1, 4, 3, 5]), 0, 32);
634 assert_eq!(boolean_buf1, boolean_buf2);
635
636 let boolean_buf3 = boolean_buf1.slice(8, 16);
638 assert_ne!(boolean_buf1, boolean_buf3);
639 let boolean_buf4 = boolean_buf1.slice(0, 32);
640 assert_eq!(boolean_buf1, boolean_buf4);
641
642 let boolean_buf2 = BooleanBuffer::new(Buffer::from(&[0, 0, 2, 3, 4]), 0, 32);
644 assert_ne!(boolean_buf1, boolean_buf2);
645
646 let boolean_buf2 = BooleanBuffer::new(Buffer::from(&[0, 1, 4, 3, 5]), 0, 24);
648 assert_ne!(boolean_buf1, boolean_buf2);
649
650 assert!(boolean_buf1.ptr_eq(&boolean_buf1));
652 assert!(boolean_buf2.ptr_eq(&boolean_buf2));
653 assert!(!boolean_buf1.ptr_eq(&boolean_buf2));
654 }
655
656 #[test]
657 fn test_boolean_slice() {
658 let bytes = &[0, 3, 2, 6, 2];
659 let boolean_buf1 = BooleanBuffer::new(Buffer::from(bytes), 0, 32);
660 let boolean_buf2 = BooleanBuffer::new(Buffer::from(bytes), 0, 32);
661
662 let boolean_slice1 = boolean_buf1.slice(16, 16);
663 let boolean_slice2 = boolean_buf2.slice(0, 16);
664 assert_eq!(boolean_slice1.values(), boolean_slice2.values());
665
666 assert_eq!(bytes, boolean_slice1.values());
667 assert_eq!(16, boolean_slice1.bit_offset);
668 assert_eq!(16, boolean_slice1.bit_len);
669
670 assert_eq!(bytes, boolean_slice2.values());
671 assert_eq!(0, boolean_slice2.bit_offset);
672 assert_eq!(16, boolean_slice2.bit_len);
673 }
674
675 #[test]
676 fn test_boolean_bitand() {
677 let offset = 0;
678 let len = 40;
679
680 let buf1 = Buffer::from(&[0, 1, 1, 0, 0]);
681 let boolean_buf1 = &BooleanBuffer::new(buf1, offset, len);
682
683 let buf2 = Buffer::from(&[0, 1, 1, 1, 0]);
684 let boolean_buf2 = &BooleanBuffer::new(buf2, offset, len);
685
686 let expected = BooleanBuffer::new(Buffer::from(&[0, 1, 1, 0, 0]), offset, len);
687 assert_eq!(boolean_buf1 & boolean_buf2, expected);
688 }
689
690 #[test]
691 fn test_boolean_bitor() {
692 let offset = 0;
693 let len = 40;
694
695 let buf1 = Buffer::from(&[0, 1, 1, 0, 0]);
696 let boolean_buf1 = &BooleanBuffer::new(buf1, offset, len);
697
698 let buf2 = Buffer::from(&[0, 1, 1, 1, 0]);
699 let boolean_buf2 = &BooleanBuffer::new(buf2, offset, len);
700
701 let expected = BooleanBuffer::new(Buffer::from(&[0, 1, 1, 1, 0]), offset, len);
702 assert_eq!(boolean_buf1 | boolean_buf2, expected);
703 }
704
705 #[test]
706 fn test_boolean_bitxor() {
707 let offset = 0;
708 let len = 40;
709
710 let buf1 = Buffer::from(&[0, 1, 1, 0, 0]);
711 let boolean_buf1 = &BooleanBuffer::new(buf1, offset, len);
712
713 let buf2 = Buffer::from(&[0, 1, 1, 1, 0]);
714 let boolean_buf2 = &BooleanBuffer::new(buf2, offset, len);
715
716 let expected = BooleanBuffer::new(Buffer::from(&[0, 0, 0, 1, 0]), offset, len);
717 assert_eq!(boolean_buf1 ^ boolean_buf2, expected);
718 }
719
720 #[test]
721 fn test_boolean_not() {
722 let offset = 0;
723 let len = 40;
724
725 let buf = Buffer::from(&[0, 1, 1, 0, 0]);
726 let boolean_buf = &BooleanBuffer::new(buf, offset, len);
727
728 let expected = BooleanBuffer::new(Buffer::from(&[255, 254, 254, 255, 255]), offset, len);
729 assert_eq!(!boolean_buf, expected);
730 }
731
732 #[test]
733 fn test_boolean_from_slice_bool() {
734 let v = [true, false, false];
735 let buf = BooleanBuffer::from(&v[..]);
736 assert_eq!(buf.offset(), 0);
737 assert_eq!(buf.len(), 3);
738 assert_eq!(buf.values().len(), 1);
739 assert!(buf.value(0));
740 }
741
742 #[test]
743 fn test_from_bitwise_unary_op() {
744 let input_bools = (0..1024)
747 .map(|_| rand::random::<bool>())
748 .collect::<Vec<bool>>();
749 let input_buffer = BooleanBuffer::from(&input_bools[..]);
750
751 for offset in 0..1024 {
753 let result = BooleanBuffer::from_bitwise_unary_op(
754 input_buffer.values(),
755 offset,
756 input_buffer.len() - offset,
757 |a| !a,
758 );
759 let expected = input_bools[offset..]
760 .iter()
761 .map(|b| !*b)
762 .collect::<BooleanBuffer>();
763 assert_eq!(result, expected);
764 }
765
766 for offset in 0..512 {
768 let len = 512 - offset; let result =
770 BooleanBuffer::from_bitwise_unary_op(input_buffer.values(), offset, len, |a| !a);
771 let expected = input_bools[offset..]
772 .iter()
773 .take(len)
774 .map(|b| !*b)
775 .collect::<BooleanBuffer>();
776 assert_eq!(result, expected);
777 }
778 }
779
780 #[test]
781 fn test_from_bitwise_binary_op() {
782 let input_bools_left = (0..1024)
784 .map(|_| rand::random::<bool>())
785 .collect::<Vec<bool>>();
786 let input_bools_right = (0..1024)
787 .map(|_| rand::random::<bool>())
788 .collect::<Vec<bool>>();
789 let input_buffer_left = BooleanBuffer::from(&input_bools_left[..]);
790 let input_buffer_right = BooleanBuffer::from(&input_bools_right[..]);
791
792 for left_offset in 0..200 {
793 for right_offset in [0, 4, 5, 17, 33, 24, 45, 64, 65, 100, 200] {
794 for len_offset in [0, 1, 44, 100, 256, 300, 512] {
795 let len = 1024 - len_offset - left_offset.max(right_offset); let result = BooleanBuffer::from_bitwise_binary_op(
798 input_buffer_left.values(),
799 left_offset,
800 input_buffer_right.values(),
801 right_offset,
802 len,
803 |a, b| a & b,
804 );
805 let expected = input_bools_left[left_offset..]
807 .iter()
808 .zip(&input_bools_right[right_offset..])
809 .take(len)
810 .map(|(a, b)| *a & *b)
811 .collect::<BooleanBuffer>();
812 assert_eq!(result, expected);
813 }
814 }
815 }
816 }
817
818 #[test]
819 fn test_extend_trusted_len_sets_byte_len() {
820 let mut builder = BooleanBufferBuilder::new(0);
822 let bools: Vec<_> = (0..10).map(|i| i % 2 == 0).collect();
823 unsafe { builder.extend_trusted_len(bools.into_iter()) };
824 assert_eq!(builder.as_slice().len(), bit_util::ceil(builder.len(), 8));
825 }
826
827 #[test]
828 fn test_extend_trusted_len_then_append() {
829 let mut builder = BooleanBufferBuilder::new(0);
831 let bools: Vec<_> = (0..9).map(|i| i % 3 == 0).collect();
832 unsafe { builder.extend_trusted_len(bools.clone().into_iter()) };
833 builder.append(true);
834 assert_eq!(builder.as_slice().len(), bit_util::ceil(builder.len(), 8));
835 let finished = builder.finish();
836 for (i, v) in bools.into_iter().chain(std::iter::once(true)).enumerate() {
837 assert_eq!(finished.value(i), v, "at index {}", i);
838 }
839 }
840
841 #[test]
842 fn test_find_nth_set_bit_position() {
843 let bools = vec![true, false, true, true, false, true];
844 let buffer = BooleanBuffer::from(bools);
845
846 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 1), 1);
847 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 2), 3);
848 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 3), 4);
849 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 4), 6);
850 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 5), 6);
851
852 assert_eq!(buffer.clone().find_nth_set_bit_position(1, 1), 3);
853 assert_eq!(buffer.clone().find_nth_set_bit_position(3, 1), 4);
854 assert_eq!(buffer.clone().find_nth_set_bit_position(3, 2), 6);
855 }
856
857 #[test]
858 fn test_find_nth_set_bit_position_large() {
859 let mut bools = vec![false; 1000];
860 bools[100] = true;
861 bools[500] = true;
862 bools[999] = true;
863 let buffer = BooleanBuffer::from(bools);
864
865 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 1), 101);
866 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 2), 501);
867 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 3), 1000);
868 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 4), 1000);
869
870 assert_eq!(buffer.clone().find_nth_set_bit_position(101, 1), 501);
871 }
872
873 #[test]
874 fn test_find_nth_set_bit_position_sliced() {
875 let bools = vec![false, true, false, true, true, false, true]; let buffer = BooleanBuffer::from(bools);
877 let slice = buffer.slice(1, 6); assert_eq!(slice.len(), 6);
880 assert_eq!(slice.clone().find_nth_set_bit_position(0, 1), 1);
884 assert_eq!(slice.clone().find_nth_set_bit_position(0, 2), 3);
885 assert_eq!(slice.clone().find_nth_set_bit_position(0, 3), 4);
886 assert_eq!(slice.clone().find_nth_set_bit_position(0, 4), 6);
887 }
888
889 #[test]
890 fn test_find_nth_set_bit_position_all_set() {
891 let buffer = BooleanBuffer::new_set(100);
892 for i in 1..=100 {
893 assert_eq!(buffer.clone().find_nth_set_bit_position(0, i), i);
894 }
895 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 101), 100);
896 }
897
898 #[test]
899 fn test_find_nth_set_bit_position_none_set() {
900 let buffer = BooleanBuffer::new_unset(100);
901 assert_eq!(buffer.clone().find_nth_set_bit_position(0, 1), 100);
902 }
903}