bitworks/
bitset128.rs

1//! Module containing [`Bitset128`].
2
3use 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/// [`Bitset`] of bit size 128.
22#[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    /// Constructs a new value of `Bitset128`.
29    ///
30    /// # Examples
31    /// ```rust
32    /// # use std::error::Error;
33    /// #
34    /// # fn main() -> Result<(), Box<dyn Error>> {
35    /// use bitworks::prelude::{Bitset, Bitset128};
36    ///
37    /// let bitset = Bitset128::new(19);
38    ///
39    /// assert_eq!(bitset, Bitset128::from_repr(19));
40    /// #   Ok(())
41    /// # }
42    /// ```
43    #[inline(always)]
44    pub const fn new(inner: Inner) -> Self {
45        Self(inner)
46    }
47
48    /// Returns the inner [`u128`] representation of `Bitset128`.
49    ///
50    /// # Examples
51    /// ```rust
52    /// # use std::error::Error;
53    /// #
54    /// # fn main() -> Result<(), Box<dyn Error>> {
55    /// use bitworks::prelude::Bitset128;
56    ///
57    /// let bitset = Bitset128::new(19);
58    /// let inner: u128 = bitset.into_inner();
59    ///
60    /// assert_eq!(inner, 19);
61    /// #   Ok(())
62    /// # }
63    /// ```
64    #[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            // Need to reverse to get the same visual representation, because
667            // array's .into_iter() makes iterator from left to right,
668            // but .collect() will collect from right to left here.
669            .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        // Same index order
709        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}