1use core::fmt;
2use core::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Index};
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Copy, Debug, Ord, PartialOrd, Eq, PartialEq, Deserialize, Serialize)]
7pub struct BitSet128(u64, u64);
8
9impl BitSet128 {
10 pub const fn new() -> Self {
12 Self(0, 0)
13 }
14}
15
16impl Default for BitSet128 {
17 fn default() -> Self {
18 Self::new()
19 }
20}
21
22impl BitSet128 {
23 #[inline]
25 pub fn reset_all(&mut self) {
26 self.0 = 0;
27 self.1 = 0;
28 }
29
30 #[inline]
32 pub fn reset(&mut self, index: u8) {
33 if index < 64 {
34 self.0 &= !(1u64 << index);
35 } else if index < 128 {
36 self.1 &= !(1u64 << (index - 64));
37 }
38 }
39
40 #[inline]
42 pub fn set_all(&mut self) {
43 self.0 = u64::MAX;
44 self.1 = u64::MAX;
45 }
46
47 #[inline]
49 pub fn set(&mut self, index: u8) {
50 if index < 64 {
51 self.0 |= 1u64 << index;
52 } else if index < 128 {
53 self.1 |= 1u64 << (index - 64);
54 }
55 }
56
57 #[inline]
59 pub fn flip(&mut self, index: u8) {
60 if index < 64 {
61 self.0 ^= 1u64 << index;
62 } else if index < 128 {
63 self.1 ^= 1u64 << (index - 64);
64 }
65 }
66
67 #[inline]
69 pub fn flip_all(&mut self) {
70 self.0 = !self.0;
71 self.1 = !self.1;
72 }
73
74 #[inline]
77 pub fn and_not(&mut self, other: Self) {
78 self.0 &= !other.0;
79 self.1 &= !other.1;
80 }
81
82 #[inline]
85 pub fn test(&self, index: u8) -> bool {
86 if index < 64 {
87 (self.0 & (1u64 << index)) != 0
88 } else if index < 128 {
89 (self.1 & (1u64 << (index - 64))) != 0
90 } else {
91 false
92 }
93 }
94
95 #[inline]
97 pub const fn count_ones(&self) -> u32 {
98 self.0.count_ones() + self.1.count_ones()
99 }
100
101 #[inline]
104 pub const fn leading_zeros(&self) -> u32 {
105 if self.1 == 0 {
108 64 + self.0.leading_zeros()
109 } else {
110 self.1.leading_zeros()
113 }
114 }
115
116 #[inline]
118 pub const fn is_empty(&self) -> bool {
119 self.0 == 0 && self.1 == 0
120 }
121 #[inline]
124 pub const fn last_set(&self) -> Option<u8> {
125 let leading = self.leading_zeros();
126 if leading == 128 {
127 None
128 } else {
129 #[allow(clippy::cast_possible_truncation)]
133 Some((127 - leading) as u8)
134 }
135 }
136
137 #[inline]
139 pub const fn is_superset(&self, other: &Self) -> bool {
140 (self.0 & other.0) == other.0 && (self.1 & other.1) == other.1
143 }
144
145 #[inline]
147 pub const fn is_subset(&self, other: &BitSet128) -> bool {
148 other.is_superset(self)
149 }
150
151 #[inline]
154 pub const fn intersects(&self, other: &Self) -> bool {
155 (self.0 & other.0) != 0 || (self.1 & other.1) != 0
158 }
159
160 #[inline]
162 pub fn iter(&self) -> BitSet128Iter {
163 self.into_iter()
164 }
165}
166
167impl BitOr for BitSet128 {
170 type Output = Self;
171 fn bitor(self, rhs: Self) -> Self::Output {
172 Self(self.0 | rhs.0, self.1 | rhs.1)
173 }
174}
175
176impl BitAnd for BitSet128 {
177 type Output = Self;
178 fn bitand(self, rhs: Self) -> Self::Output {
179 Self(self.0 & rhs.0, self.1 & rhs.1)
180 }
181}
182
183impl BitXor for BitSet128 {
184 type Output = Self;
185 fn bitxor(self, rhs: Self) -> Self::Output {
186 Self(self.0 ^ rhs.0, self.1 ^ rhs.1)
187 }
188}
189
190impl BitOrAssign for BitSet128 {
191 fn bitor_assign(&mut self, rhs: Self) {
192 self.0 |= rhs.0;
193 self.1 |= rhs.1;
194 }
195}
196
197impl BitAndAssign for BitSet128 {
198 fn bitand_assign(&mut self, rhs: Self) {
199 self.0 &= rhs.0;
200 self.1 &= rhs.1;
201 }
202}
203
204impl BitXorAssign for BitSet128 {
205 fn bitxor_assign(&mut self, rhs: Self) {
206 self.0 ^= rhs.0;
207 self.1 ^= rhs.1;
208 }
209}
210
211impl Index<u8> for BitSet128 {
212 type Output = bool;
213
214 fn index(&self, index: u8) -> &Self::Output {
215 if self.test(index) { &true } else { &false }
217 }
218}
219
220impl Index<usize> for BitSet128 {
221 type Output = bool;
222
223 #[allow(clippy::cast_possible_truncation)]
224 fn index(&self, index: usize) -> &Self::Output {
225 if self.test(index as u8) { &true } else { &false }
227 }
228}
229
230impl From<u32> for BitSet128 {
232 #[inline]
233 fn from(a: u32) -> Self {
234 Self(u64::from(a), 0)
235 }
236}
237
238impl From<(u32, u32)> for BitSet128 {
240 #[inline]
241 fn from((a, b): (u32, u32)) -> Self {
242 Self(u64::from(a) << 32 | u64::from(b), 0)
243 }
244}
245
246impl From<(u32, u32, u32, u32)> for BitSet128 {
248 #[inline]
249 fn from((a, b, c, d): (u32, u32, u32, u32)) -> Self {
250 Self(u64::from(a) << 32 | u64::from(b), u64::from(c) << 32 | u64::from(d))
251 }
252}
253
254#[derive(Debug, Default, Eq, PartialEq)]
257pub struct BitSet128Iter(u64, u64);
258
259impl Iterator for BitSet128Iter {
261 type Item = u8;
262
263 fn next(&mut self) -> Option<Self::Item> {
264 if self.0 == 0 {
265 if self.1 == 0 {
266 None
267 } else {
268 #[allow(clippy::cast_possible_truncation)]
270 let index = self.1.trailing_zeros() as u8;
271 self.1 &= self.1 - 1;
273 Some(index + 64)
274 }
275 } else {
276 #[allow(clippy::cast_possible_truncation)]
278 let index = self.0.trailing_zeros() as u8;
279 self.0 &= self.0 - 1;
281 Some(index)
282 }
283 }
284
285 #[inline]
286 fn size_hint(&self) -> (usize, Option<usize>) {
287 let len = (self.0.count_ones() + self.1.count_ones()) as usize;
289 (len, Some(len))
290 }
291}
292
293impl ExactSizeIterator for BitSet128Iter {}
295impl core::iter::FusedIterator for BitSet128Iter {}
296
297impl IntoIterator for &BitSet128 {
299 type Item = u8;
300 type IntoIter = BitSet128Iter;
301
302 fn into_iter(self) -> Self::IntoIter {
303 BitSet128Iter(self.0, self.1)
306 }
307}
308
309impl IntoIterator for BitSet128 {
311 type Item = u8;
312 type IntoIter = BitSet128Iter;
313
314 fn into_iter(self) -> Self::IntoIter {
315 BitSet128Iter(self.0, self.1)
318 }
319}
320
321impl FromIterator<u8> for BitSet128 {
323 fn from_iter<I: IntoIterator<Item = u8>>(iter: I) -> Self {
324 let mut bitset = Self::new();
325 for index in iter {
326 bitset.set(index);
327 }
328 bitset
329 }
330}
331
332impl Extend<u8> for BitSet128 {
333 fn extend<I: IntoIterator<Item = u8>>(&mut self, iter: I) {
334 for index in iter {
335 self.set(index);
336 }
337 }
338}
339
340impl fmt::Binary for BitSet128 {
343 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
344 if f.alternate() {
346 f.write_str("0b")?;
347 }
348 for i in (0..64).rev() {
351 let val = (self.1 >> i) & 1;
352 write!(f, "{val}")?;
353 }
354 for i in (0..64).rev() {
356 let val = (self.0 >> i) & 1;
357 write!(f, "{val}")?;
358 }
359
360 Ok(())
361 }
362}
363
364impl fmt::UpperHex for BitSet128 {
365 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
366 if f.alternate() {
367 f.write_str("0x")?;
368 }
369 write!(f, "{:016X}{:016X}", self.1, self.0)
370 }
371}
372
373#[cfg(test)]
374mod tests {
375 use super::*;
376
377 fn is_normal<T: Sized + Send + Sync + Unpin>() {}
378 fn _is_full<T: Sized + Send + Sync + Unpin + Copy + Clone + Default + PartialEq>() {}
379 fn is_config<
380 T: Sized + Send + Sync + Unpin + Copy + Clone + Default + PartialEq + Serialize + for<'a> Deserialize<'a>,
381 >() {
382 }
383
384 #[test]
385 fn normal_types() {
386 is_config::<BitSet128>();
387 is_normal::<BitSet128Iter>();
388 }
389 #[test]
390 fn new() {
391 let mut bits = BitSet128::new();
392 bits.set(42);
393 assert!(bits[42u8]);
394 assert!(bits.test(42));
395 }
396 #[allow(unused)]
397 #[test]
398 fn const_new() {
399 const FLAGS: BitSet128 = BitSet128::new();
400 const EMPTY_CHECK: bool = FLAGS.is_empty(); }
402 #[test]
403 fn assign() {
404 let mut bits = BitSet128::new();
405 bits.set(42);
406 assert!(bits[42u8]);
407 assert!(bits.test(42));
408 let mask = bits;
409 assert!(mask.test(42));
410 }
411 #[test]
412 fn from() {
413 let _bits = BitSet128::from((0xab_u32, 0x12_u32));
414 }
415 #[test]
416 fn flip_all() {
417 let mut bitset = BitSet128::new();
418
419 bitset.set(0);
421 bitset.set(64);
422
423 bitset.flip_all();
424
425 assert!(!bitset.test(0));
427 assert!(!bitset.test(64));
428 assert!(bitset.test(1));
429 assert!(bitset.test(65));
430
431 let mut empty_set = BitSet128::new();
433 empty_set.flip_all(); let mut full_set = BitSet128::new();
436 full_set.set_all();
437
438 assert_eq!(empty_set, full_set);
439
440 empty_set.flip_all(); assert!(empty_set.is_empty());
442 }
443 #[test]
444 fn leading_zeros() {
445 let mut bitset = BitSet128::new();
446
447 assert_eq!(bitset.leading_zeros(), 128);
449
450 bitset.set(127);
452 assert_eq!(bitset.leading_zeros(), 0);
453
454 bitset.reset_all();
456 bitset.set(126);
457 assert_eq!(bitset.leading_zeros(), 1);
458
459 bitset.reset_all();
461 bitset.set(64);
462 assert_eq!(bitset.leading_zeros(), 63);
463
464 bitset.reset_all();
466 bitset.set(63);
467 assert_eq!(bitset.leading_zeros(), 64);
468
469 bitset.reset_all();
471 bitset.set(0);
472 assert_eq!(bitset.leading_zeros(), 127);
473 }
474 #[test]
475 fn last_set() {
476 let mut bitset = BitSet128::new();
477
478 assert_eq!(bitset.last_set(), None);
480
481 bitset.set(0);
483 assert_eq!(bitset.last_set(), Some(0));
484
485 bitset.set(10);
487 bitset.set(45);
488 assert_eq!(bitset.last_set(), Some(45));
489
490 bitset.reset_all();
492 bitset.set(63);
493 assert_eq!(bitset.last_set(), Some(63));
494
495 bitset.set(64);
497 assert_eq!(bitset.last_set(), Some(64));
498
499 bitset.set(100);
501 bitset.set(127);
502 assert_eq!(bitset.last_set(), Some(127));
503 }
504 #[test]
505 fn is_superset() {
506 let mut set_a = BitSet128::new();
507 let mut set_b = BitSet128::new();
508
509 assert!(set_a.is_superset(&set_b));
511
512 set_a.set(10);
514 set_a.set(80);
515
516 set_b.set(10);
517
518 assert!(set_a.is_superset(&set_b));
520 assert!(!set_b.is_superset(&set_a));
522
523 set_b.set(80);
525 assert!(set_a.is_superset(&set_b));
526
527 let mut set_c = BitSet128::new();
529 let mut set_d = BitSet128::new();
530 set_c.set(15); set_d.set(15);
533 set_d.set(95); assert!(!set_c.is_superset(&set_d));
538 }
539 #[test]
540 fn intersects() {
541 let mut set_a = BitSet128::new();
542 let mut set_b = BitSet128::new();
543
544 assert!(!set_a.intersects(&set_b));
546
547 set_a.set(15);
549 assert!(!set_a.intersects(&set_b));
550
551 set_b.set(15);
553 assert!(set_a.intersects(&set_b));
554 assert!(set_b.intersects(&set_a));
555
556 set_a.reset_all();
558 set_b.reset_all();
559 set_a.set(10); set_b.set(80); assert!(!set_a.intersects(&set_b));
562
563 set_a.set(80);
565 assert!(set_a.intersects(&set_b));
566 }
567 #[test]
568 fn inplace_logical_ops() {
569 let mut set_a = BitSet128::new();
570 let mut set_b = BitSet128::new();
571
572 set_a.set(10);
574 set_a.set(70);
575
576 set_b.set(10);
577 set_b.set(80);
578
579 let mut result = set_a;
581 result &= set_b;
582 assert!(result.test(10));
583 assert!(!result.test(70));
584 assert!(!result.test(80));
585
586 let mut result = set_a;
588 result |= set_b;
589 assert!(result.test(10));
590 assert!(result.test(70));
591 assert!(result.test(80));
592
593 let mut result = set_a;
595 result ^= set_b;
596 assert!(!result.test(10)); assert!(result.test(70));
598 assert!(result.test(80));
599
600 let mut result = set_a;
602 result.and_not(set_b);
603 assert!(!result.test(10)); assert!(result.test(70)); assert!(!result.test(80)); }
607 #[test]
608 fn exercise() {
609 let mut system_flags = BitSet128::new();
610 let error_mask = BitSet128::new(); system_flags |= error_mask;
614
615 system_flags ^= error_mask;
617
618 let mut set_a = BitSet128::new();
622 set_a.set(10);
623 set_a.set(20);
624
625 let mut set_b = BitSet128::new();
626 set_b.set(20);
627 set_b.set(30);
628
629 let common = set_a & set_b;
631 assert!(!common.test(10));
632 assert!(common.test(20));
633 assert!(!common.test(30));
634
635 let all = set_a | set_b;
637 assert!(all.test(10));
638 assert!(all.test(20));
639 assert!(all.test(30));
640
641 let diff = set_a ^ set_b;
643 assert!(diff.test(10));
644 assert!(!diff.test(20));
645 assert!(diff.test(30));
646 }
647
648 #[test]
649 fn test_iterator_empty() {
650 let bitset = BitSet128::new();
651 let mut iter = bitset.iter();
652
653 assert_eq!(iter.size_hint(), (0, Some(0)));
654 assert_eq!(iter.next(), None);
655 }
656
657 #[test]
658 fn test_iterator_single_bits() {
659 let mut bitset = BitSet128::new();
661 bitset.set(0);
662 let mut iter = bitset.iter();
663 assert_eq!(iter.next(), Some(0));
664 assert_eq!(iter.next(), None);
665
666 bitset.reset_all();
668 bitset.set(63);
669 let mut iter = bitset.iter();
670 assert_eq!(iter.next(), Some(63));
671 assert_eq!(iter.next(), None);
672
673 bitset.reset_all();
675 bitset.set(64);
676 let mut iter = bitset.iter();
677 assert_eq!(iter.next(), Some(64));
678 assert_eq!(iter.next(), None);
679
680 bitset.reset_all();
682 bitset.set(127);
683 let mut iter = bitset.iter();
684 assert_eq!(iter.next(), Some(127));
685 assert_eq!(iter.next(), None);
686 }
687
688 #[test]
689 fn test_iterator_multiple_scattered_bits() {
690 let mut bitset = BitSet128::new();
691 let expected_indices = [5, 12, 63, 64, 99, 127];
693
694 for &idx in &expected_indices {
695 bitset.set(idx);
696 }
697
698 let mut iter = bitset.iter();
700 assert_eq!(iter.size_hint(), (expected_indices.len(), Some(expected_indices.len())));
701
702 for &expected in &expected_indices {
704 assert_eq!(iter.next(), Some(expected));
705 }
706 assert_eq!(iter.next(), None);
707 }
708
709 #[test]
710 fn test_iterator_size_hint_drainage() {
711 let mut bitset = BitSet128::new();
712 bitset.set(10);
713 bitset.set(90);
714
715 let mut iter = bitset.iter();
716 assert_eq!(iter.size_hint(), (2, Some(2)));
717 assert_eq!(iter.len(), 2); assert_eq!(iter.next(), Some(10));
720 assert_eq!(iter.size_hint(), (1, Some(1)));
721 assert_eq!(iter.len(), 1);
722
723 assert_eq!(iter.next(), Some(90));
724 assert_eq!(iter.size_hint(), (0, Some(0)));
725 assert_eq!(iter.len(), 0);
726
727 assert_eq!(iter.next(), None);
728 }
729
730 #[test]
731 fn test_iterator_all_bits_set() {
732 let mut bitset = BitSet128::new();
733 bitset.set_all();
734
735 let mut count = 0;
736 #[allow(clippy::cast_possible_truncation)]
737 for (expected_idx, actual_idx) in bitset.iter().enumerate() {
738 assert_eq!(expected_idx as u8, actual_idx);
739 count += 1;
740 }
741 assert_eq!(count, 128);
742 }
743
744 #[test]
745 fn test_consuming_into_iter() {
746 let mut bitset = BitSet128::new();
747 bitset.set(42);
748
749 let mut count = 0;
750 for idx in bitset {
751 assert_eq!(idx, 42);
752 count += 1;
753 }
754 assert_eq!(count, 1);
755 }
756
757 #[test]
758 fn from_iterator() {
759 let indices = [5, 63, 64, 120];
761 let bitset: BitSet128 = indices.into_iter().collect();
762
763 assert!(bitset.test(5));
764 assert!(bitset.test(63));
765 assert!(bitset.test(64));
766 assert!(bitset.test(120));
767 assert_eq!(bitset.count_ones(), 4);
768
769 let invalid_indices = [20, 200, 255];
771 let safe_bitset: BitSet128 = invalid_indices.into_iter().collect();
772
773 assert!(safe_bitset.test(20));
774 assert_eq!(safe_bitset.count_ones(), 1); }
776 #[test]
777 fn empty_and_full() {
778 let empty = BitSet128::new();
779 assert_eq!(empty.iter().count(), 0);
780
781 let mut full = BitSet128::new();
782 full.set_all();
783 assert_eq!(full.iter().count(), 128);
784 }
785}