1use crate::{
4 bit::Bit,
5 bitset::{Bitset, LeftAligned},
6 prelude::{Bitset16, Bitset32, Bitset64, Bitset8, Byteset, Index},
7 safety_markers::Size,
8};
9use std::{
10 fmt::{Binary, Debug, Display, LowerHex, Octal, UpperHex},
11 ops::{
12 BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Shl, ShlAssign, Shr,
13 ShrAssign,
14 },
15};
16
17type Inner = u128;
18type BIndex = Index<Bitset128>;
19const BITS: usize = 128;
20
21#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Hash)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24#[repr(transparent)]
25pub struct Bitset128(pub(crate) Inner);
26
27impl Bitset128 {
28 #[inline(always)]
44 pub const fn new(inner: Inner) -> Self {
45 Self(inner)
46 }
47
48 #[inline(always)]
65 pub const fn into_inner(&self) -> Inner {
66 self.0
67 }
68}
69
70unsafe impl LeftAligned for Bitset128 {
71 type _Repr = Inner;
72 type _Size = Size<16>;
73 const _BYTE_SIZE: usize = 16;
74 const _ALL: Self = Self(Inner::MAX);
75 const _NONE: Self = Self(Inner::MIN);
76
77 #[inline(always)]
78 fn _from_repr(value: Self::Repr) -> Self {
79 Self(value)
80 }
81}
82
83impl From<Inner> for Bitset128 {
84 #[inline(always)]
85 fn from(value: Inner) -> Self {
86 Self(value)
87 }
88}
89
90impl From<Bitset128> for Inner {
91 #[inline(always)]
92 fn from(value: Bitset128) -> Self {
93 value.0
94 }
95}
96
97impl From<BIndex> for Bitset128 {
98 #[inline(always)]
99 fn from(value: BIndex) -> Self {
100 Self(1) << value
101 }
102}
103
104impl From<Byteset<16>> for Bitset128 {
105 #[inline(always)]
106 fn from(value: Byteset<16>) -> Self {
107 unsafe { std::mem::transmute_copy(&value) }
108 }
109}
110
111impl From<Bitset8> for Bitset128 {
112 #[inline(always)]
113 fn from(value: Bitset8) -> Self {
114 Self(value.into_inner() as Inner)
115 }
116}
117
118impl From<Bitset16> for Bitset128 {
119 #[inline(always)]
120 fn from(value: Bitset16) -> Self {
121 Self(value.into_inner() as Inner)
122 }
123}
124
125impl From<Bitset32> for Bitset128 {
126 #[inline(always)]
127 fn from(value: Bitset32) -> Self {
128 Self(value.into_inner() as Inner)
129 }
130}
131
132impl From<Bitset64> for Bitset128 {
133 #[inline(always)]
134 fn from(value: Bitset64) -> Self {
135 Self(value.into_inner() as Inner)
136 }
137}
138
139impl Not for Bitset128 {
140 type Output = Self;
141
142 #[inline(always)]
143 fn not(self) -> Self::Output {
144 Self(!self.0)
145 }
146}
147
148impl BitAnd for Bitset128 {
149 type Output = Self;
150
151 #[inline(always)]
152 fn bitand(self, rhs: Self) -> Self::Output {
153 Self(self.0 & rhs.0)
154 }
155}
156
157impl BitAndAssign for Bitset128 {
158 #[inline(always)]
159 fn bitand_assign(&mut self, rhs: Self) {
160 self.0 &= rhs.0;
161 }
162}
163
164impl BitOr for Bitset128 {
165 type Output = Self;
166
167 #[inline(always)]
168 fn bitor(self, rhs: Self) -> Self::Output {
169 Self(self.0 | rhs.0)
170 }
171}
172
173impl BitOrAssign for Bitset128 {
174 #[inline(always)]
175 fn bitor_assign(&mut self, rhs: Self) {
176 self.0 |= rhs.0;
177 }
178}
179
180impl BitXor for Bitset128 {
181 type Output = Self;
182
183 #[inline(always)]
184 fn bitxor(self, rhs: Self) -> Self::Output {
185 Self(self.0 ^ rhs.0)
186 }
187}
188
189impl BitXorAssign for Bitset128 {
190 #[inline(always)]
191 fn bitxor_assign(&mut self, rhs: Self) {
192 self.0 ^= rhs.0;
193 }
194}
195
196impl Shl<BIndex> for Bitset128 {
197 type Output = Self;
198
199 #[inline(always)]
200 fn shl(self, rhs: BIndex) -> Self::Output {
201 Self::from(self.0.shl(rhs.into_inner()))
202 }
203}
204
205impl ShlAssign<BIndex> for Bitset128 {
206 #[inline(always)]
207 fn shl_assign(&mut self, rhs: BIndex) {
208 *self = self.shl(rhs);
209 }
210}
211
212impl Shr<BIndex> for Bitset128 {
213 type Output = Self;
214
215 #[inline(always)]
216 fn shr(self, rhs: BIndex) -> Self::Output {
217 Self::from(self.0.shr(rhs.into_inner()))
218 }
219}
220
221impl ShrAssign<BIndex> for Bitset128 {
222 #[inline(always)]
223 fn shr_assign(&mut self, rhs: BIndex) {
224 *self = self.shr(rhs);
225 }
226}
227
228impl BitAnd<BIndex> for Bitset128 {
229 type Output = Self;
230
231 #[inline(always)]
232 fn bitand(self, rhs: BIndex) -> Self::Output {
233 Self(self.0 & Self::from(rhs).0)
234 }
235}
236
237impl BitAndAssign<BIndex> for Bitset128 {
238 #[inline(always)]
239 fn bitand_assign(&mut self, rhs: BIndex) {
240 self.0 &= Self::from(rhs).0;
241 }
242}
243
244impl BitOr<BIndex> for Bitset128 {
245 type Output = Self;
246
247 #[inline(always)]
248 fn bitor(self, rhs: BIndex) -> Self::Output {
249 Self(self.0 | Self::from(rhs).0)
250 }
251}
252
253impl BitOrAssign<BIndex> for Bitset128 {
254 #[inline(always)]
255 fn bitor_assign(&mut self, rhs: BIndex) {
256 self.0 |= Self::from(rhs).0;
257 }
258}
259
260impl BitXor<BIndex> for Bitset128 {
261 type Output = Self;
262
263 #[inline(always)]
264 fn bitxor(self, rhs: BIndex) -> Self::Output {
265 Self(self.0 ^ Self::from(rhs).0)
266 }
267}
268
269impl BitXorAssign<BIndex> for Bitset128 {
270 #[inline(always)]
271 fn bitxor_assign(&mut self, rhs: BIndex) {
272 self.0 ^= Self::from(rhs).0;
273 }
274}
275
276impl FromIterator<Bit> for Bitset128 {
277 fn from_iter<T: IntoIterator<Item = Bit>>(iter: T) -> Self {
278 iter.into_iter()
279 .take(BITS)
280 .enumerate()
281 .filter_map(|(i, bit)| if bool::from(bit) { Some(i) } else { None })
282 .filter_map(|i| BIndex::try_from(i).ok())
283 .fold(Self::NONE, |acc, i| acc | Self(1) << i)
284 }
285}
286
287impl Debug for Bitset128 {
288 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
289 write!(f, "Bitset128({:#0130b})", self.0)
290 }
291}
292
293impl Display for Bitset128 {
294 #[inline(always)]
295 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
296 write!(f, "{:0128b}", self.0)
297 }
298}
299
300impl Binary for Bitset128 {
301 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
302 write!(f, "{:#0130b}", self.0)
303 }
304}
305
306impl Octal for Bitset128 {
307 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
308 write!(f, "{:#050o}", self.0)
309 }
310}
311
312impl UpperHex for Bitset128 {
313 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
314 write!(f, "{:#034X}", self.0)
315 }
316}
317
318impl LowerHex for Bitset128 {
319 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
320 write!(f, "{:#034x}", self.0)
321 }
322}
323
324#[cfg(test)]
325mod tests {
326 use std::error::Error;
327
328 use crate::{bit::Bit::*, prelude::Bitset};
329
330 use super::*;
331 type Tested = Bitset128;
332 type TestResult = Result<(), Box<dyn Error>>;
333
334 #[test]
335 fn construction() -> TestResult {
336 let bitset = Tested::NONE
337 .clone()
338 .replace(0.try_into()?, One)
339 .set(1.try_into()?)
340 .unset(0.try_into()?)
341 .build();
342
343 assert_eq!(bitset, 0b00000010.into());
344 Ok(())
345 }
346
347 #[test]
348 fn conversion_from_integer() {
349 let bitset: Tested = 0b10101010.into();
350
351 assert_eq!(bitset.0, 0b10101010);
352 }
353
354 #[test]
355 fn conversion_from_index() {
356 let bitset = Tested::from(Index::<Tested>::MIN);
357
358 assert_eq!(bitset.0, 1);
359 }
360
361 #[test]
362 fn into_inner() {
363 let bitset: Tested = 0b10101010.into();
364
365 assert_eq!(bitset.0, bitset.into_inner());
366 }
367
368 #[test]
369 fn bit_set_to_true() -> TestResult {
370 let mut bitset: Tested = 0b10101010.into();
371
372 bitset.replace(6.try_into()?, One);
373
374 assert_eq!(bitset.0, 0b11101010);
375 Ok(())
376 }
377
378 #[test]
379 fn bit_set_to_false() -> TestResult {
380 let mut bitset: Tested = 0b10101010.into();
381
382 bitset.replace(7.try_into()?, Zero);
383
384 assert_eq!(bitset.0, 0b00101010);
385 Ok(())
386 }
387
388 #[test]
389 fn bit() -> TestResult {
390 let bitset: Tested = 0b10101010.into();
391
392 assert_eq!(bitset.bit(0.try_into()?), Zero);
393 assert_eq!(bitset.bit(1.try_into()?), One);
394 Ok(())
395 }
396
397 #[test]
398 fn bit_check() -> TestResult {
399 let mut bitset: Tested = 0b10101010.into();
400
401 bitset.set(6.try_into()?);
402
403 assert_eq!(bitset.0, 0b11101010);
404 Ok(())
405 }
406
407 #[test]
408 fn bit_uncheck() -> TestResult {
409 let mut bitset: Tested = 0b10101010.into();
410
411 bitset.unset(7.try_into()?);
412
413 assert_eq!(bitset.0, 0b00101010);
414 Ok(())
415 }
416
417 #[test]
418 fn bit_ref() -> TestResult {
419 let bitset: Tested = 0b10101010.into();
420
421 assert_eq!(*bitset.bit_ref(0.try_into()?), Zero);
422 assert_eq!(*bitset.bit_ref(1.try_into()?), One);
423 Ok(())
424 }
425
426 #[test]
427 fn bit_mut() -> TestResult {
428 let mut bitset: Tested = 0b10101010.into();
429
430 assert_eq!(*bitset.bit_ref(0.try_into()?), Zero);
431 assert_eq!(*bitset.bit_ref(1.try_into()?), One);
432
433 *bitset.bit_mut(0.try_into()?) = One;
434 *bitset.bit_mut(1.try_into()?) = Zero;
435
436 assert_eq!(*bitset.bit_ref(0.try_into()?), One);
437 assert_eq!(*bitset.bit_ref(1.try_into()?), Zero);
438 Ok(())
439 }
440
441 #[test]
442 fn count_ones() {
443 let bitset: Tested = 0b11100000.into();
444
445 assert_eq!(bitset.count_ones(), 3);
446 }
447
448 #[test]
449 fn count_zeros() {
450 let bitset: Tested = 0b11100000.into();
451
452 assert_eq!(bitset.count_zeros(), 125);
453 }
454
455 #[test]
456 fn shl() -> TestResult {
457 let bitset: Tested = 0b00000001.into();
458
459 assert_eq!(bitset << 1.try_into()?, 0b00000010.into());
460
461 let mut bitset: Tested = 0b00000001.into();
462 bitset <<= 1.try_into()?;
463
464 assert_eq!(bitset, 0b00000010.into());
465 Ok(())
466 }
467
468 #[test]
469 fn shr() -> TestResult {
470 let bitset: Tested = 0b00000010.into();
471
472 assert_eq!(bitset >> 1.try_into()?, 0b00000001.into());
473
474 let mut bitset: Tested = 0b00000010.into();
475 bitset >>= 1.try_into()?;
476
477 assert_eq!(bitset, 0b00000001.into());
478 Ok(())
479 }
480
481 #[test]
482 fn not() {
483 let a: Tested = Tested::NONE;
484
485 assert_eq!(!a, Tested::ALL);
486 }
487
488 #[test]
489 fn bit_and() {
490 let a: Tested = 0b11110000.into();
491 let b: Tested = 0b11001100.into();
492
493 assert_eq!(a & b, 0b11000000.into());
494
495 let mut a: Tested = 0b11110000.into();
496 let b: Tested = 0b11001100.into();
497 a &= b;
498
499 assert_eq!(a, 0b11000000.into());
500 }
501
502 #[test]
503 fn bit_or() {
504 let a: Tested = 0b11110000.into();
505 let b: Tested = 0b11001100.into();
506
507 assert_eq!(a | b, 0b11111100.into());
508
509 let mut a: Tested = 0b11110000.into();
510 let b: Tested = 0b11001100.into();
511 a |= b;
512
513 assert_eq!(a, 0b11111100.into());
514 }
515
516 #[test]
517 fn bit_xor() {
518 let a: Tested = 0b11110000.into();
519 let b: Tested = 0b11001100.into();
520
521 assert_eq!(a ^ b, 0b00111100.into());
522
523 let mut a: Tested = 0b11110000.into();
524 let b: Tested = 0b11001100.into();
525 a ^= b;
526
527 assert_eq!(a, 0b00111100.into());
528 }
529
530 #[test]
531 fn complement() {
532 let a: Tested = Tested::NONE;
533
534 assert_eq!(a.complement(), Tested::ALL);
535 }
536
537 #[test]
538 fn intersection() {
539 let a: Tested = 0b11110000.into();
540 let b: Tested = 0b11001100.into();
541
542 assert_eq!(a.intersection(b), 0b11000000.into());
543 }
544
545 #[test]
546 fn union() {
547 let a: Tested = 0b11110000.into();
548 let b: Tested = 0b11001100.into();
549
550 assert_eq!(a.union(b), 0b11111100.into());
551 }
552
553 #[test]
554 fn difference() {
555 let a: Tested = 0b11110000.into();
556 let b: Tested = 0b11001100.into();
557
558 assert_eq!(a.difference(b), 0b00110000.into());
559 }
560
561 #[test]
562 fn sym_difference() {
563 let a: Tested = 0b11110000.into();
564 let b: Tested = 0b11001100.into();
565
566 assert_eq!(a.sym_difference(b), 0b00111100.into());
567 }
568
569 #[test]
570 fn bits() {
571 let bitset: Tested = 0b11110000.into();
572 let mut iter = bitset.bits();
573
574 assert_eq!(iter.next(), Some(Zero));
575 assert_eq!(iter.next(), Some(Zero));
576 assert_eq!(iter.next(), Some(Zero));
577 assert_eq!(iter.next(), Some(Zero));
578 assert_eq!(iter.next(), Some(One));
579 assert_eq!(iter.next(), Some(One));
580 assert_eq!(iter.next(), Some(One));
581 assert_eq!(iter.next(), Some(One));
582
583 for _ in 8..128 {
584 assert_eq!(iter.next(), Some(Zero));
585 }
586
587 assert_eq!(iter.next(), None);
588 }
589
590 #[test]
591 fn bits_ref() {
592 let bitset: Tested = 0b11110000.into();
593 let mut iter = bitset.bits_ref();
594
595 assert_eq!(iter.next().as_deref(), Some(&Zero));
596 assert_eq!(iter.next().as_deref(), Some(&Zero));
597 assert_eq!(iter.next().as_deref(), Some(&Zero));
598 assert_eq!(iter.next().as_deref(), Some(&Zero));
599 assert_eq!(iter.next().as_deref(), Some(&One));
600 assert_eq!(iter.next().as_deref(), Some(&One));
601 assert_eq!(iter.next().as_deref(), Some(&One));
602 assert_eq!(iter.next().as_deref(), Some(&One));
603
604 for _ in 8..128 {
605 assert_eq!(iter.next().as_deref(), Some(&Zero));
606 }
607
608 assert_eq!(iter.next(), None);
609 }
610
611 #[test]
612 fn bits_mut() {
613 let mut bitset: Tested = 0b11110000.into();
614
615 let mut iter = bitset.bits_ref();
616
617 assert_eq!(iter.next().as_deref(), Some(&Zero));
618 assert_eq!(iter.next().as_deref(), Some(&Zero));
619 assert_eq!(iter.next().as_deref(), Some(&Zero));
620 assert_eq!(iter.next().as_deref(), Some(&Zero));
621 assert_eq!(iter.next().as_deref(), Some(&One));
622 assert_eq!(iter.next().as_deref(), Some(&One));
623 assert_eq!(iter.next().as_deref(), Some(&One));
624 assert_eq!(iter.next().as_deref(), Some(&One));
625
626 for _ in 8..128 {
627 assert_eq!(iter.next().as_deref(), Some(&Zero));
628 }
629
630 assert_eq!(iter.next(), None);
631 drop(iter);
632
633 for mut bit in bitset.bits_mut() {
634 *bit = !*bit;
635 }
636
637 let mut iter = bitset.bits_ref();
638
639 assert_eq!(iter.next().as_deref(), Some(&One));
640 assert_eq!(iter.next().as_deref(), Some(&One));
641 assert_eq!(iter.next().as_deref(), Some(&One));
642 assert_eq!(iter.next().as_deref(), Some(&One));
643 assert_eq!(iter.next().as_deref(), Some(&Zero));
644 assert_eq!(iter.next().as_deref(), Some(&Zero));
645 assert_eq!(iter.next().as_deref(), Some(&Zero));
646 assert_eq!(iter.next().as_deref(), Some(&Zero));
647
648 for _ in 8..128 {
649 assert_eq!(iter.next().as_deref(), Some(&One));
650 }
651
652 assert_eq!(iter.next(), None);
653 }
654
655 #[test]
656 fn collect_from_bits() {
657 let a: Tested = 0b11110000.into();
658 let iter = a.bits();
659 let b: Tested = iter.collect();
660
661 assert_eq!(b, 0b11110000.into());
662
663 let arr = [One, Zero, One, Zero, One, Zero, One, Zero];
664 let bitset: Tested = arr
665 .into_iter()
666 .rev()
670 .collect();
671
672 assert_eq!(bitset, 0b10101010.into());
673 }
674
675 #[test]
676 fn ones() -> TestResult {
677 let bitset: Tested = 0b11110000.into();
678 let mut iter = bitset.ones();
679
680 assert_eq!(iter.next(), Some(4.try_into()?));
681 assert_eq!(iter.next(), Some(5.try_into()?));
682 assert_eq!(iter.next(), Some(6.try_into()?));
683 assert_eq!(iter.next(), Some(7.try_into()?));
684 assert_eq!(iter.next(), None);
685 Ok(())
686 }
687
688 #[test]
689 fn zeros() -> TestResult {
690 let bitset: Tested = 0b11110000.into();
691 let mut iter = bitset.zeros();
692
693 assert_eq!(iter.next(), Some(0.try_into()?));
694 assert_eq!(iter.next(), Some(1.try_into()?));
695 assert_eq!(iter.next(), Some(2.try_into()?));
696 assert_eq!(iter.next(), Some(3.try_into()?));
697
698 for i in 8..128 {
699 assert_eq!(iter.next(), Some(i.try_into()?));
700 }
701
702 assert_eq!(iter.next(), None);
703 Ok(())
704 }
705
706 #[test]
707 fn from_slice_bool() {
708 let slice: &[Bit] = &[One, Zero, One, Zero, One, Zero, One, Zero];
710 let bitset: Tested = Tested::from_iterable(slice);
711
712 assert_eq!(bitset, 0b01010101.into());
713 }
714
715 #[test]
716 fn test_send() {
717 fn assert_send<T: Send>() {}
718 assert_send::<Tested>();
719 }
720
721 #[test]
722 fn test_sync() {
723 fn assert_sync<T: Sync>() {}
724 assert_sync::<Tested>();
725 }
726}