bit_byte_bit/
lib.rs

1//! An `n`-bit string represented as ⌈ `n/8` ⌉ bytes.
2//!
3//! ## Instantiation
4//!
5//! Constructors defined in the [Bits] implementation generate bit strings
6//! with a length that is either input-defined, or in the case of [Bits::new],
7//! `8` times the length of the iterator.
8//!
9//! Constructors defined by the [From](Bits::from) or
10//! [FromIterator](Bits::from_iter) traits generate bit strings with a length
11//! based on the input. If a collection of `bool`, the length will be equal to
12//! that of the input. If the input is a collection of `u8`, the length counts
13//! all bits up to and including the most significant one bit.
14//!
15//! ```
16//! # use bit_byte_bit::Bits;
17//!
18//! let bits = Bits::new([0x0A, 0x0B, 0x0C]);
19//!
20//! assert_eq!(bits.len(), 24);
21//!
22//! let bits_no_lz = Bits::from([0x0A, 0x0B, 0x0C]);
23//!
24//! assert_eq!(bits_no_lz.len(), 20);
25//!
26//! let aligned_bits = Bits::aligned(16, [0x0A, 0x0B, 0x0C]);
27//!
28//! assert_eq!(aligned_bits.len(), 32);
29//!
30//! let packed_bits = Bits::packed([0x0A, 0x0B, 0x0C]);
31//!
32//! assert_eq!(packed_bits, Bits::from([0xBA, 0x0C]));
33//!
34//! let bools = Bits::from([true, false, true, false, false, true]);
35//!
36//! assert_eq!(bools, Bits::slice(&[0x25], 6));
37//!
38//! let slice = Bits::take(&[0x0A, 0x0B, 0x0C], 3, 9);
39//!
40//! assert_eq!(slice, Bits::from([0x61, 0x01]));
41//!```
42//!
43//! The [bits!] macro is also provided for convenience, wrapping the constructors:
44//! * [Bits::new]
45//! * [Bits::aligned]
46//! * [Bits::ones]
47//! * [Bits::packed]
48//! * [Bits::zeros]
49//!
50//! ```
51//! # use bit_byte_bit::{Bits, bits};
52//! let bits = bits![0x0A, 0x0B, 0x0C];
53//!
54//! assert_eq!(bits, Bits::new([0x0A, 0x0B, 0x0C]));
55//!
56//! let repeated_bytes = bits![8; 0x0F; 20];
57//!
58//! assert_eq!(repeated_bytes, Bits::new([0x0F; 20]));
59//!
60//! let aligned_bits = bits![0x0A, 0x0B, 0x0C; => 16];
61//!
62//! assert_eq!(aligned_bits.len(), 32);
63//!
64//! let ones = bits![1; 20];
65//!
66//! assert_eq!(ones, Bits::ones(20));
67//!
68//! let packed_bits = bits![0x0A, 0x0B, 0x0C; %];
69//!
70//! assert_eq!(packed_bits, Bits::from([0xBA, 0x0C]));
71//!
72//! let zeros = bits![0; 20];
73//!
74//! assert_eq!(zeros, Bits::zeros(20));
75//!
76//! ```
77//!
78//! ## Indexing
79//!
80//! [Bits::i] can be used to access an individual bit. Bits can be [set](Bits::set) to one,
81//! [reset](Bits::reset) to zero, or [toggled](Bits::toggle).
82//!
83//! ```
84//! # use bit_byte_bit::{Bits};
85//! let mut bits = Bits::new([0x0A, 0x0B, 0x0C]);
86//!
87//! assert_eq!(bits.i(0), 0);
88//! assert_eq!(bits.i(1), 1);
89//!
90//! bits.set(0);
91//! bits.reset(1);
92//!
93//! assert_eq!(bits.i(0), 1);
94//! assert_eq!(bits.i(1), 0);
95//!
96//! bits.toggle(0);
97//! bits.toggle(1);
98//!
99//! assert_eq!(bits.i(0), 0);
100//! assert_eq!(bits.i(1), 1);
101//! ```
102//!
103//! ## Bitwise Operations
104//!
105//! Bit strings support [and](Bits::and), [or](Bits::or), [not](Bits::complement),
106//! [xor](Bits::xor), [left](Bits::shifted_left) and [right](Bits::shifted_right)
107//! shifting, as well as, [left](Bits::rotated_left), and [right](Bits::rotated_right)
108//! rotation.
109//!
110//! ```
111//! # use bit_byte_bit::{Bits};
112//! let x = Bits::new([0x20, 0x30, 0x40]);
113//! let y = Bits::new([0xA0, 0xB0, 0xC0]);
114//!
115//! assert_eq!(x.and(&y), Bits::new([0x20, 0x30, 0x40]));
116//! assert_eq!(x.complement(), Bits::new([0xDF, 0xCF, 0xBF]));
117//! assert_eq!(x.or(&y), Bits::new([0xA0, 0xB0, 0xC0]));
118//! assert_eq!(x.xor(&y), Bits::new([0x80, 0x80, 0x80]));
119//!
120//! let bits = Bits::from([0x0A, 0x0B, 0x0C]);
121//!
122//! assert_eq!(bits.len(), 20);
123//! assert_eq!(bits.shifted_left(17), Bits::slice(&[0x00, 0x00, 0x04], 20));
124//! assert_eq!(bits.shifted_right(17), Bits::slice(&[0x06, 0x00, 0x00], 20));
125//! assert_eq!(bits.rotated_left(4), Bits::slice(&[0xAC, 0xB0, 0x00], 20));
126//! assert_eq!(bits.rotated_right(4), Bits::slice(&[0xB0, 0xC0, 0x0A], 20));
127//! ```
128//!
129//! ## Iteration
130//!
131//! Iteration can be done bit-by-bit, or byte-by-byte using:
132//! * [Bits::iter]
133//! * [Bits::iter_from]
134//! * [Bits::into_iter]
135//! * [Bits::bytes] (via `&[u8]::iter`)
136//! * [Bits::into_bytes]
137//!
138//!```
139//! # use bit_byte_bit::{Bits};
140//! let x = Bits::new([0xAB, 0xCD, 0xEF]);
141//!
142//! let mut ones = 0;
143//!
144//! for bit in x.iter() { if bit == 1 { ones += 1; } }
145//!
146//! assert_eq!(ones, 17);
147//!
148//! ones = 0;
149//!
150//! for bit in x.iter_from(13) { if bit == 1 { ones += 1; } }
151//!
152//! assert_eq!(ones, 9);
153//!
154//! let mut y = x.bytes().iter();
155//!
156//! assert_eq!(y.next(), Some(&0xAB));
157//! ```
158//!
159//! ## Note about endianness
160//!
161//! While the library does not implement any notion of endianness, indexing and methods ending
162//! in either `_left` or `_right` assume bit<sub>0</sub> of an n-bit string is the most right bit,
163//! while bit<sub>n-1</sub> is most left.
164
165use std::ptr::NonNull;
166use std::{alloc, ptr, slice};
167use std::alloc::Layout;
168use std::cmp::Ordering;
169use std::fmt::{Binary, Debug, Display, Formatter};
170use std::iter::FusedIterator;
171use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Bound, Div, Not, RangeBounds, Shl, ShlAssign, Shr, ShrAssign};
172
173
174macro_rules! bitop {
175    ($self:expr, $op:tt, $rhs:expr) => {
176        unsafe {
177            let (mut min, mut nbytes, mut nbits) = ($self.size(), $rhs.size(), $rhs.nbits);
178            let (mut padding, mut mask) = ($rhs.padding, $rhs.mask);
179            let aptr = $self.words.as_ptr_const();
180            let bptr = $rhs.words.as_ptr_const();
181
182            if $rhs.nbits < $self.nbits {
183                (min, nbytes, nbits) = ($rhs.size(), $self.size(), $self.nbits);
184                (padding, mask) = ($self.padding, $self.mask);
185            }
186
187            let layout = Layout::array::<u8>(nbytes).unwrap();
188            let result = alloc::alloc(layout);
189
190            for i in 0..min { ptr::write(result.add(i), *aptr.add(i) $op *bptr.add(i)); }
191
192            match $self.size().cmp(&$rhs.size()) {
193                Ordering::Greater => for i in $rhs.size()..$self.size() {
194                    ptr::write(result.add(i), *aptr.add(i))
195                },
196                Ordering::Less => for i in $self.size()..$rhs.size() {
197                    ptr::write(result.add(i), *bptr.add(i));
198                },
199                _ => ()
200            }
201
202            *result.add(nbytes - 1) &= mask;
203
204            let bytes = RawBytes { bytes: NonNull::new(result).unwrap(), cap: nbytes, nbytes };
205
206            Bits { words:bytes, mask, nbits, padding }
207        }
208    };
209    (assign; $self:expr, $op:tt, $rhs:expr) => {
210        unsafe {
211            let aptr = $self.words.as_ptr_mut();
212            let bptr = $rhs.words.as_ptr_const();
213            let (lsize, rsize) = ($self.size(), $rhs.size());
214            let min = if rsize < lsize { rsize } else { lsize };
215
216            for i in 0..min { *aptr.add(i) $op *bptr.add(i); }
217
218            if $self.nbits < $rhs.nbits {
219                let aptr = $self.words.as_ptr_mut();
220
221                $self.words.expand_to(rsize);
222
223                for i in lsize..rsize { ptr::write(aptr.add(i), *bptr.add(i)); }
224
225                $self.mask = $rhs.mask;
226                $self.nbits = $rhs.nbits;
227                $self.words.nbytes = rsize;
228                $self.padding = $rhs.padding;
229
230                if lsize > 0 { *aptr.add(lsize - 1) &= $self.mask; }
231            }
232        }
233    };
234}
235
236macro_rules! divrem8 {
237    ($n:expr) => { ($n >> 3, $n & 7) };
238    (ceil; $n:expr) => { (1 + (($n - 1) >> 3), $n & 7) };
239}
240
241macro_rules! mask {
242    ($shift:expr) => {
243        if $shift == 0 { 0xFF } else { ((1 << $shift) - 1) as u8 }
244    };
245}
246
247macro_rules! pointer {
248    ($size:expr) => {{
249        let layout = Layout::array::<u8>($size).unwrap();
250
251        assert!(layout.size() <= isize::MAX as usize, "Allocation too large");
252
253        let pointer = alloc::alloc(layout);
254
255        pointer
256    }};
257    ($fill:expr; $size:expr) => {{
258        let layout = Layout::array::<u8>($size).unwrap();
259
260        assert!(layout.size() <= isize::MAX as usize, "Allocation too large");
261
262        let pointer = alloc::alloc(layout);
263
264        for i in 0..$size { ptr::write(pointer.add(i), $fill); }
265
266        pointer
267    }};
268}
269
270
271pub(crate) fn get_bits(src: &[u8], start: usize, length: usize) -> Vec<u8> {
272    let nbytes_src = src.len();
273    let (start_byte, start_idx) = divrem8!(start);
274    let (nbytes, overflow) = divrem8!(ceil; length);
275    let mut bytes = vec![0; nbytes];
276    let take_all = nbytes >= (nbytes_src - start_byte);
277
278    if start_idx > 0 {
279        let shift_mask = (1 << start_idx) - 1;
280        let upper_length = 8 - start_idx;
281        let end_byte = if take_all { nbytes_src - 1 } else { start_byte + nbytes };
282
283        for i in start_byte..end_byte {
284            bytes[i - start_byte] = src[i] >> start_idx;
285            bytes[i - start_byte] |= (src[i + 1] & shift_mask) << upper_length;
286        }
287
288        if take_all { bytes[nbytes_src - start_byte - 1] = src[nbytes_src - 1] >> start_idx; }
289    } else {
290        let end_byte = if take_all { nbytes_src } else { nbytes };
291
292        for i in start_byte..end_byte { bytes[i - start_byte] = src[i] }
293    }
294
295    bytes[nbytes - 1] &= mask!(overflow);
296
297    bytes
298}
299
300fn trim(mut bytes: Vec<u8>) -> Vec<u8> {
301    let (mut upper_bound, mut i) = (bytes.len().saturating_sub(1), 0);
302
303    while i < upper_bound {
304        if bytes[i] == 0 {
305            bytes.remove(i);
306            upper_bound -= 1;
307        } else {
308            let clz = bytes[i].leading_zeros() as usize;
309
310            if clz > 0 {
311                let (mask, low) = ((1 << clz) - 1, 8 - clz);
312
313                bytes[i] |= (bytes[i + 1] & mask) << low;
314                bytes[i + 1] >>= clz;
315
316                if bytes[i + 1] == 0 {
317                    bytes.remove(i + 1);
318                    upper_bound -= 1;
319
320                    if bytes[i].leading_zeros() == 0 { i += 1; }
321                } else {
322                    i += 1;
323                }
324            } else {
325                i += 1;
326            }
327        }
328    }
329
330    bytes
331}
332
333
334struct RawBytes {
335    cap: usize,
336    bytes: NonNull<u8>,
337    nbytes: usize
338}
339
340impl RawBytes {
341    fn as_ptr_const(&self) -> *const u8 { self.bytes.as_ptr().cast_const() }
342
343    fn as_ptr_mut(&self) -> *mut u8 { self.bytes.as_ptr() }
344
345    fn expand_to(&mut self, nbytes: usize) {
346        let new_layout = Layout::array::<u8>(nbytes).unwrap();
347
348        assert!(new_layout.size() <= isize::MAX as usize, "Allocation too large");
349
350        let pointer = if self.cap == 0 {
351            unsafe { alloc::alloc(new_layout) }
352        } else {
353            let old_layout = Layout::array::<u8>(self.cap).unwrap();
354            let old_pointer = self.bytes.as_ptr();
355
356            unsafe { alloc::realloc(old_pointer, old_layout, new_layout.size()) }
357        };
358
359        self.bytes = match NonNull::new(pointer) {
360            Some(p) => p,
361            None => alloc::handle_alloc_error(new_layout)
362        };
363
364        self.cap = nbytes;
365    }
366
367    fn shift_right(&mut self, end: usize, mask: u8, up: usize, down: usize) {
368        unsafe {
369            let pointer = self.bytes.as_ptr();
370
371            for i in 0..(end - 1) {
372                *pointer.add(i) >>= down;
373                *pointer.add(i) |= (*pointer.add(i + 1) & mask) << up;
374            }
375
376            *pointer.add(end - 1) >>= down;
377        }
378    }
379
380    fn shift_right_from(&mut self, start: usize, end: usize, mask: u8, up: usize, down: usize) {
381        unsafe {
382            let pointer = self.bytes.as_ptr();
383
384            for i in start..end {
385                *pointer.add(i - 1) |= (*pointer.add(i) & mask) << up;
386                *pointer.add(i) >>= down;
387            }
388        }
389    }
390
391    fn shrink_to(&mut self, nbytes: usize) {
392        if self.cap <= nbytes { return; }
393
394        let old_layout = Layout::array::<u8>(self.cap).unwrap();
395        let old_pointer = self.bytes.as_ptr();
396
397        unsafe {
398            for i in nbytes..self.nbytes { ptr::read(old_pointer.add(i)); }
399
400            if nbytes == 0 {
401                alloc::dealloc(old_pointer, old_layout);
402                self.bytes = NonNull::dangling();
403            } else {
404                let new_layout = Layout::array::<u8>(nbytes).unwrap();
405                let pointer = alloc::realloc(old_pointer, old_layout, new_layout.size());
406
407                self.bytes = match NonNull::new(pointer) {
408                    Some(p) => p,
409                    None => alloc::handle_alloc_error(new_layout)
410                };
411            }
412        }
413
414        self.cap = nbytes;
415        self.nbytes = nbytes;
416    }
417}
418
419impl Drop for RawBytes {
420    fn drop(&mut self) {
421
422        if self.cap != 0 {
423            unsafe {
424                alloc::dealloc(self.bytes.as_ptr(), Layout::array::<u8>(self.cap).unwrap());
425            }
426        }
427    }
428}
429
430unsafe impl Send for RawBytes {}
431
432unsafe impl Sync for RawBytes {}
433
434
435
436pub struct Bits {
437    words: RawBytes,
438    mask: u8,
439    nbits: usize,
440    padding: usize,
441}
442
443impl Bits {
444    /// Creates a bit string from a sequence of bytes.
445    ///
446    /// To ignore leading zeros use [Bits::from] or [Bits::from_iter].
447    ///
448    /// # Examples
449    /// ```
450    /// # use bit_byte_bit::{Bits};
451    /// let mut x = Bits::new([0x0A, 0x0B, 0x0C, 0x00]);
452    ///
453    /// assert_eq!(x.len(), 32);
454    /// ```
455    pub fn new<I: IntoIterator<Item = u8>>(bits: I) -> Self {
456        let mut bytes = bits.into_iter().collect::<Vec<u8>>();
457
458        match bytes.len() {
459            0 => Bits::empty(),
460            nbytes => {
461                bytes.shrink_to(nbytes);
462
463                let cap = bytes.capacity();
464                let pointer = bytes.as_mut_ptr();
465
466                std::mem::forget(bytes);
467
468                let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap, nbytes };
469
470                Bits { words: bytes, mask: 0xFF, nbits: nbytes << 3, padding: 0 }
471            }
472        }
473    }
474
475    /// Creates a bit string with an aligned length.
476    ///
477    /// # Examples
478    /// ```
479    /// # use bit_byte_bit::{Bits};
480    /// let mut x = Bits::aligned(17, [0x0A, 0x0B, 0x0C]);
481    ///
482    /// assert_eq!(x.len(), 34);
483    /// assert_eq!(x, Bits::slice(&[0x0A, 0x0B, 0x0C, 0x00, 0x00], 34));
484    /// ```
485    pub fn aligned<I: IntoIterator<Item = u8>>(units: usize, bits: I) -> Self {
486        match units {
487            0 => Bits::empty(),
488            1 => Bits::from_iter(bits),
489            8 => Bits::new(bits),
490            units => {
491                let mut bytes = bits.into_iter().collect::<Vec<u8>>();
492                let mut nbits = bytes.len() << 3;
493                let overflow = nbits % units;
494
495                if overflow > 0 {
496                    nbits += units - overflow;
497
498                    for _ in 0..(1 + ((units - 1) >> 3)) { bytes.push(0); }
499                }
500
501                let nbytes = bytes.len();
502
503                if nbytes == 0 {
504                    Bits::empty()
505                } else {
506                    bytes.shrink_to(nbytes);
507
508                    let cap = bytes.capacity();
509                    let pointer = bytes.as_mut_ptr();
510
511                    std::mem::forget(bytes);
512
513                    let overflow = nbits & 7;
514
515                    let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap, nbytes };
516
517                    Bits { words: bytes, mask: mask!(overflow), nbits, padding: (8 - overflow) & 7 }
518                }
519            }
520        }
521    }
522
523    /// Creates an empty bit string.
524    ///
525    /// # Examples
526    /// ```
527    /// # use bit_byte_bit::{Bits};
528    /// let mut x = Bits::empty();
529    ///
530    /// assert_eq!(x.len(), 0);
531    /// ```
532    pub fn empty() -> Self {
533        let bytes = RawBytes { bytes: NonNull::dangling(), cap: 0, nbytes: 0 };
534
535        Bits { words: bytes, mask: 0xFF, nbits: 0, padding: 0 }
536    }
537
538    /// Creates a bit string of ones.
539    ///
540    /// # Examples
541    /// ```
542    /// # use bit_byte_bit::{Bits};
543    /// let mut x = Bits::ones(4);
544    ///
545    /// assert_eq!(x.len(), 4);
546    /// assert_eq!(x, Bits::from([0x0F]));
547    /// ```
548    pub fn ones(length: usize) -> Self {
549        match length {
550            0 => Bits::empty(),
551            length => unsafe {
552                let nbytes = 1 + ((length - 1) >> 3);
553                let overflow = length & 7;
554                let padding = (8 - overflow) & 7;
555                let mask = mask!(overflow);
556                let pointer = pointer![0xFFu8; nbytes];
557
558                *pointer.add(nbytes - 1) &= mask;
559
560                let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
561
562                Bits { words: bytes, mask, nbits: length, padding }
563            }
564        }
565    }
566
567    /// Creates a bit string by concatenating a slice of bytes removing leading zeros.
568    ///
569    /// # Examples
570    /// ```
571    /// # use bit_byte_bit::{Bits};
572    /// let x1 = Bits::packed([0x00, 0x00, 0x00]);
573    ///
574    /// assert_eq!(x1, Bits::empty());
575    ///
576    /// let x2 = Bits::packed([0x0A, 0x0B, 0x0C]);
577    ///
578    /// assert_eq!(x2, Bits::from([0xBA, 0x0C]));
579    /// assert_eq!(x2.len(), 12);
580    /// ```
581    pub fn packed<I: IntoIterator<Item = u8>>(bytes: I) -> Self {
582        Bits::from(trim(bytes.into_iter().collect::<Vec<u8>>()))
583    }
584
585    /// Creates a bit string by copying a given number of bits from a slice of bytes.
586    ///
587    /// When the length is greater than the available number of bits in the source,
588    /// the result is padded with zeros.
589    ///
590    /// # Examples
591    /// ```
592    /// # use bit_byte_bit::{Bits};
593    /// let x1 = Bits::slice(&[], 17);
594    ///
595    /// assert_eq!(x1, Bits::zeros(17));
596    ///
597    /// let x2 = Bits::slice(&[0x0A, 0x0B, 0x0C], 0);
598    ///
599    /// assert_eq!(x2, Bits::empty());
600    ///
601    /// let x3 = Bits::slice(&[0x0A, 0x0B, 0x0C], 19);
602    ///
603    /// assert_eq!(x3, Bits::from([0x0A, 0x0B, 0x04]));
604    ///
605    /// let x4 = Bits::slice(&[0x00, 0x00, 0x00], 19);
606    ///
607    /// assert_eq!(x4, Bits::zeros(19));
608    /// ```
609    pub fn slice(src: &[u8], length: usize) -> Self { Bits::take(src, 0, length) }
610
611    /// Creates a bit string by copying a given range of bits from a slice of bytes.
612    ///
613    /// When the length is greater than the available number of bits in the source,
614    /// the result is padded with zeros.
615    ///
616    /// # Examples
617    /// ```
618    /// # use bit_byte_bit::{Bits};
619    /// let x1 = Bits::take(&[], 1, 17);
620    ///
621    /// assert_eq!(x1, Bits::zeros(17));
622    ///
623    /// let x2 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 0);
624    ///
625    /// assert_eq!(x2, Bits::empty());
626    ///
627    /// let x3 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 1);
628    ///
629    /// assert_eq!(x3, Bits::from([0x01]));
630    ///
631    /// let x4 = Bits::take(&[0x0A, 0x0B, 0x0C], 25, 17);
632    ///
633    /// assert_eq!(x4, Bits::zeros(17));
634    ///
635    /// let x5 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 17);
636    ///
637    /// assert_eq!(x5.bytes().to_vec(), vec![0x85, 0x05, 0x00]);
638    ///
639    /// let x6 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 16);
640    ///
641    /// assert_eq!(x6.bytes().to_vec(), vec![0x85, 0x05]);
642    ///
643    /// let x7 = Bits::take(&[0x00, 0x00, 0x00], 1, 17);
644    ///
645    /// assert_eq!(x7, Bits::zeros(17));
646    /// ```
647    pub fn take(src: &[u8], start: usize, length: usize) -> Self {
648        if length == 0 { return Bits::empty(); }
649
650        let nbytes_src = src.len();
651
652        if nbytes_src == 0 || start >= (nbytes_src << 3) { return Bits::zeros(length); }
653
654        let (nbytes, overflow) = divrem8!(ceil; length);
655        let mut bytes = get_bits(src, start, length);
656        let pointer = bytes.as_mut_ptr();
657
658        std::mem::forget(bytes);
659
660        let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
661
662        Bits { words: bytes, mask: mask!(overflow), nbits: length, padding: (8 - overflow) & 7 }
663    }
664
665    /// Creates a bit string of zeros.
666    ///
667    /// # Examples
668    /// ```
669    /// # use bit_byte_bit::{Bits};
670    /// let mut x = Bits::zeros(4);
671    ///
672    /// assert_eq!(x.len(), 4);
673    /// assert_eq!(x, Bits::from([false, false, false, false]));
674    /// ```
675    pub fn zeros(length: usize) -> Self {
676        match length {
677            0 => Bits::empty(),
678            length => unsafe {
679                let nbytes = 1 + ((length - 1) >> 3);
680                let overflow = length & 7;
681                let padding = (8 - overflow) & 7;
682                let mask = mask!(overflow);
683                let pointer = pointer![0u8; nbytes];
684                let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
685
686                Bits { words: bytes, mask, nbits: length, padding }
687            }
688        }
689    }
690
691    /// Pads a bit string until the length is a multiple of the given unit.
692    ///
693    /// # Examples
694    /// ```
695    /// # use bit_byte_bit::{Bits};
696    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
697    ///
698    /// x.align(16);
699    ///
700    /// assert_eq!(x, Bits::new([0x0A, 0x0B, 0x0C, 0x00]));
701    /// assert_eq!(x.len(), 32);
702    /// ```
703    pub fn align(&mut self, unit: usize) {
704        match unit {
705            0 | 1 => (),
706            8 => {
707                self.nbits = self.size() << 3;
708                self.padding = 0;
709            },
710            unit if (self.nbits % unit) == 0 => (),
711            unit => self.push_zeros(unit - (self.nbits % unit))
712        }
713    }
714
715    /// Whether all bits are one.
716    ///
717    /// # Examples
718    /// ```
719    /// # use bit_byte_bit::{Bits};
720    /// let x1 = Bits::empty();
721    ///
722    /// assert!(x1.all());
723    ///
724    /// let x2 = Bits::from([0x0F]);
725    ///
726    /// assert!(x2.all());
727    ///
728    /// let x3 = Bits::new([0x0F]);
729    ///
730    /// assert!(!x3.all());
731    pub fn all(&self) -> bool {
732        match self.size() {
733            0 => true,
734            n => unsafe {
735                let pointer = self.words.as_ptr_const();
736
737                for i in 0..(n - 1) {
738                    if *pointer.add(i) != 0xFF { return false; }
739                }
740
741                (*pointer.add(n - 1) & self.mask) == self.mask
742            }
743        }
744    }
745
746    /// Bitwise and of two bit strings.
747    ///
748    /// # Examples
749    /// ```
750    /// # use bit_byte_bit::{Bits};
751    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
752    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
753    ///
754    /// assert_eq!(x1.and(&y1), Bits::new([0x20, 0x30, 0x40]));
755    ///
756    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
757    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
758    ///
759    /// assert_eq!(x2.len(), 23);
760    /// assert_eq!(y2.len(), 24);
761    ///
762    /// let z = x2.and(&y2);
763    ///
764    /// assert_eq!(z.len(), 24);
765    /// ```
766    pub fn and(&self, rhs: &Bits) -> Bits {
767        unsafe {
768            let (mut min, mut nbytes) = (self.size(), rhs.size());
769            let mut nbits = rhs.nbits;
770            let (mut padding, mut mask) = (rhs.padding, rhs.mask);
771            let aptr = self.words.as_ptr_const();
772            let bptr = rhs.words.as_ptr_const();
773
774            if rhs.nbits < self.nbits {
775                (min, nbytes, nbits) = (rhs.size(), self.size(), self.nbits);
776                (padding, mask) = (self.padding, self.mask);
777            }
778
779            let layout = Layout::array::<u8>(nbytes).unwrap();
780            let result = alloc::alloc(layout);
781
782            for i in 0..min {
783                ptr::write(result.add(i), *aptr.add(i) & *bptr.add(i));
784            }
785
786            for i in min..nbytes { ptr::write(result.add(i), 0); }
787
788            *result.add(nbytes - 1) &= mask;
789
790            let bytes = RawBytes { bytes: NonNull::new(result).unwrap(), cap: nbytes, nbytes };
791
792            Bits { words: bytes, mask, nbits, padding }
793        }
794    }
795
796    /// Bitwise and of two bit strings.
797    ///
798    /// # Examples
799    /// ```
800    /// # use bit_byte_bit::{Bits};
801    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
802    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
803    ///
804    /// x1.and_mut(&y1);
805    ///
806    /// assert_eq!(x1, Bits::new([0x20, 0x30, 0x40]));
807    ///
808    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
809    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
810    ///
811    /// assert_eq!(x2.len(), 23);
812    /// assert_eq!(y2.len(), 24);
813    ///
814    /// x2.and_mut(&y2);
815    ///
816    /// assert_eq!(x2.len(), 24);
817    /// ```
818    pub fn and_mut(&mut self, rhs: &Bits) {
819        match self.size().cmp(&rhs.size()) {
820            Ordering::Equal => unsafe {
821                let aptr = self.words.as_ptr_mut();
822                let bptr = self.words.as_ptr_const();
823                let last_a = *aptr.add(self.size() - 1) & self.mask;
824                let last_b = *bptr.add(rhs.size() - 1) & rhs.mask;
825
826                for i in 0..(self.size() - 1) { *aptr.add(i) &= *bptr.add(i); }
827
828                *aptr.add(self.size() - 1) = last_a & last_b;
829            },
830            Ordering::Less => unsafe {
831                self.words.expand_to(rhs.size());
832
833                let aptr = self.words.as_ptr_mut();
834                let bptr = self.words.as_ptr_const();
835                let last_a = *aptr.add(self.size() - 1) & self.mask;
836
837                for i in 0..(self.size() - 1) { *aptr.add(i) &= *bptr.add(i); }
838
839                *aptr.add(self.size() - 1) = last_a & *bptr.add(self.size() - 1);
840
841                for i in self.size()..rhs.size() { ptr::write(aptr.add(i), 0); }
842            },
843            Ordering::Greater => unsafe {
844                let aptr = self.words.as_ptr_mut();
845                let bptr = self.words.as_ptr_const();
846
847                for i in 0..(rhs.size() - 1) { *aptr.add(i) &= *bptr.add(i); }
848
849                *aptr.add(rhs.size() - 1) &= *bptr.add(rhs.size() - 1) & rhs.mask;
850
851                for i in rhs.size()..self.size() { *aptr.add(i) = 0; }
852            }
853        }
854
855        if self.nbits < rhs.nbits {
856            self.nbits = rhs.nbits;
857            self.words.nbytes = rhs.size();
858            self.padding = rhs.padding;
859            self.mask = rhs.mask;
860        }
861    }
862
863    /// Whether at least one bit is one.
864    ///
865    /// # Examples
866    /// ```
867    /// # use bit_byte_bit::{Bits};
868    /// let x1 = Bits::empty();
869    ///
870    /// assert!(!x1.any());
871    ///
872    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
873    ///
874    /// assert!(x2.any());
875    ///
876    /// let x3 = Bits::zeros(20);
877    ///
878    /// assert!(!x3.any());
879    pub fn any(&self) -> bool { self.nbits > 0 && self.bytes().iter().any(|&b| b > 0u8) }
880
881    /// State of a byte.
882    ///
883    /// # Examples
884    /// ```
885    /// # use bit_byte_bit::{Bits};
886    /// let mut x = Bits::from([0x0A, 0x0B]);
887    ///
888    /// assert_eq!(x.byte(0), 0x0A);
889    /// assert_eq!(x.byte(1), 0x0B);
890    /// ```
891    ///
892    /// ```should_panic
893    /// # use bit_byte_bit::{Bits};
894    /// let mut x = Bits::from([0x0A, 0x0B]);
895    ///
896    /// assert_eq!(x.byte(2), 0x0C);
897    pub fn byte(&self, i: usize) -> u8 {
898        assert!(i < self.size(), "Index out of bounds");
899
900        unsafe { *self.words.as_ptr_mut().add(i) }
901    }
902
903    /// Underlying bytes
904    ///
905    /// # Example
906    /// ```
907    /// # use bit_byte_bit::{Bits};
908    /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
909    /// let y = x.bytes().iter().cloned().collect::<Vec<u8>>();
910    ///
911    /// assert_eq!(y, vec![0xAB, 0xCD, 0xEF]);
912    /// ```
913    pub fn bytes(&self) -> &[u8] {
914        unsafe { slice::from_raw_parts(self.words.as_ptr_const(), self.size()) }
915    }
916
917    /// Flips every bit.
918    ///
919    /// # Examples
920    /// ```
921    /// # use bit_byte_bit::{Bits};
922    /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
923    ///
924    /// assert_eq!(x.complement(), Bits::slice(&[0xF5, 0xF4, 0x03], 20));
925    /// ```
926    pub fn complement(&self) -> Bits {
927        match self.size() {
928            0 => Bits::empty(),
929            nbytes => unsafe {
930                let pointer = self.words.as_ptr_mut();
931                let layout = Layout::array::<u8>(nbytes).unwrap();
932                let clone = alloc::alloc(layout);
933
934                for i in 0..nbytes { ptr::write(clone.add(i), !*pointer.add(i)); }
935
936                *clone.add(nbytes - 1) &= self.mask;
937
938                let bytes = RawBytes { bytes: NonNull::new(clone).unwrap(), cap: nbytes, nbytes };
939
940                Bits { words: bytes, mask: self.mask, nbits: self.nbits, padding: self.padding }
941            }
942        }
943    }
944
945    /// Flips every bit.
946    ///
947    /// # Examples
948    /// ```
949    /// # use bit_byte_bit::{Bits};
950    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
951    ///
952    /// x1.complement_mut();
953    ///
954    /// assert_eq!(x1, Bits::slice(&[0xF5, 0xF4, 0x03], 20));
955    /// ```
956    pub fn complement_mut(&mut self) {
957        unsafe {
958            let aptr = self.words.as_ptr_mut();
959
960            for i in 0..self.size() { *aptr.add(i) = !*aptr.add(i); }
961
962            *aptr.add(self.size() - 1) &= self.mask;
963        }
964    }
965
966    /// Shifts out upper bits.
967    ///
968    /// # Examples
969    /// ```
970    /// # use bit_byte_bit::{Bits};
971    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
972    ///
973    /// x1.consume_left(4);
974    /// assert_eq!(x1.len(), 16);
975    /// assert_eq!(x1, Bits::new([0x0A, 0x0B]));
976    ///
977    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
978    ///
979    /// x2.consume_left(4);
980    /// assert_eq!(x2.len(), 20);
981    /// assert_eq!(x2, Bits::from([0x0A, 0x0B, 0x0C]));
982    /// ```
983    pub fn consume_left(&mut self, count: usize) {
984        match (self.size(), count) {
985            (0, _) | (_, 0) => (),
986            (n, count) if count >= self.nbits => unsafe {
987                let pointer = self.words.as_ptr_mut();
988
989                for i in 0..n { *pointer.add(i) = 0; }
990            },
991            (n, count) => {
992                let (extra, byte_len) = (count & 7, count >> 3);
993
994                if byte_len > 0 {
995                    unsafe {
996                        let pointer = self.words.as_ptr_mut();
997
998                        for i in (n - byte_len)..n { ptr::read(pointer.add(i)); }
999
1000                        self.words.nbytes -= byte_len;
1001
1002                        *pointer.add(self.size() - 1) &= self.mask;
1003                    }
1004                }
1005
1006                if extra > 0 {
1007                    unsafe {
1008                        let overflow = 8 - self.padding;
1009                        let pointer = self.words.as_ptr_mut();
1010
1011                        let mask = match extra.cmp(&overflow) {
1012                            Ordering::Less => (1 << (overflow - extra)) - 1,
1013                            Ordering::Greater => (1 << (8 + overflow - extra)) - 1,
1014                            Ordering::Equal => 0,
1015                        };
1016
1017                        *pointer.add(self.size() - 1) &= mask;
1018                    }
1019                }
1020
1021                self.nbits -= count;
1022                let overflow = self.nbits & 7;
1023                self.padding = (8 - overflow) & 7;
1024                self.mask = mask!(overflow);
1025
1026                self.shrink_to_fit();
1027
1028                unsafe { *self.words.as_ptr_mut().add(self.size() - 1) &= self.mask; }
1029            }
1030        }
1031    }
1032
1033    /// Shifts out lower bits.
1034    ///
1035    /// # Examples
1036    /// ```
1037    /// # use bit_byte_bit::{Bits};
1038    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1039    ///
1040    /// x1.consume_right(4);
1041    ///
1042    /// assert_eq!(x1, Bits::from([0xB0, 0xC0]));
1043    /// assert_eq!(x1.len(), 16);
1044    ///
1045    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1046    ///
1047    /// x2.consume_right(4);
1048    ///
1049    /// assert_eq!(x2, Bits::slice(&[0xB0, 0xC0, 0x00], 20));
1050    /// assert_eq!(x2.len(), 20);
1051    /// ```
1052    pub fn consume_right(&mut self, count: usize) {
1053        match (self.size(), count) {
1054            (0, _) | (_, 0) => (),
1055            (_, count) if count >= self.nbits => {
1056                self.words.shrink_to(0);
1057                self.nbits = 0;
1058                self.padding = 0;
1059            },
1060            (_, count) => {
1061                unsafe {
1062                    let shift_bytes = count >> 3;
1063                    let pointer = self.words.as_ptr_mut();
1064
1065                    ptr::copy(pointer.add(shift_bytes), pointer, self.size() - shift_bytes);
1066
1067                    self.words.shrink_to(self.size() - shift_bytes);
1068
1069                    self.words.nbytes -= shift_bytes;
1070                    self.nbits -= count;
1071                    let new_overflow = self.nbits & 7;
1072                    self.padding = 8 - new_overflow;
1073                    self.mask = mask!(new_overflow);
1074
1075                    let count_overflow = count & 7;
1076
1077                    if count_overflow > 0 {
1078                        self.words.shift_right(
1079                            self.size(),
1080                            (1 << count_overflow) - 1,
1081                            8 - count_overflow,
1082                            count_overflow
1083                        );
1084
1085                        self.shrink_to_fit();
1086                    }
1087                }
1088            }
1089        }
1090    }
1091
1092    /// The number of zeros.
1093    ///
1094    /// # Examples
1095    /// ```
1096    /// # use bit_byte_bit::{Bits};
1097    /// let mut x = Bits::from([15, 15, 15]);
1098    ///
1099    /// assert_eq!(x.count_zeros(), 8);
1100    ///
1101    /// x = Bits::new([15, 15, 15]);
1102    ///
1103    /// assert_eq!(x.count_zeros(), 12);
1104    /// ```
1105    pub fn count_zeros(&self) -> usize {
1106        match self.size() {
1107            0 => 0,
1108            n => unsafe {
1109                let pointer = self.words.as_ptr_const();
1110                let mut sum = (*pointer.add(n - 1) & self.mask).count_zeros();
1111
1112                for i in 0..(n - 1) { sum += (*pointer.add(i)).count_zeros(); }
1113
1114                (sum as usize) - self.padding
1115            }
1116        }
1117    }
1118
1119    /// Adds upper bit padding to a bit string.
1120    ///
1121    /// # Examples
1122    /// ```
1123    /// # use bit_byte_bit::{Bits};
1124    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1125    ///
1126    /// x1.extend_left(&[0x0D, 0x0E, 0x0F]);
1127    ///
1128    /// assert_eq!(x1.len(), 44);
1129    /// assert_eq!(x1, Bits::slice(&[0x0A, 0x0B, 0xDC, 0xE0, 0xF0, 0x00], 44));
1130    ///
1131    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1132    ///
1133    /// x2.extend_left(&[0x0D, 0x0E, 0x0F]);
1134    ///
1135    /// assert_eq!(x2.len(), 48);
1136    /// assert_eq!(x2, Bits::new([0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F]));
1137    /// ```
1138    pub fn extend_left(&mut self, bytes: &[u8]) {
1139        let mut nbytes = bytes.len();
1140
1141        while nbytes > 0 && bytes[nbytes - 1] == 0 { nbytes -= 1; }
1142
1143        if nbytes == 0 { return; }
1144
1145        unsafe {
1146            self.words.expand_to(self.size() + nbytes);
1147
1148            let pointer = self.words.as_ptr_mut().add(self.size());
1149
1150            for i in 0..nbytes { ptr::write(pointer.add(i), bytes[i]); }
1151
1152            if self.padding > 0 {
1153                let overflow = (8 - self.padding) & 7;
1154                let mask = mask!(self.padding);
1155                let end = self.size() + nbytes;
1156
1157                self.words.shift_right_from(self.size(), end, mask, overflow, self.padding);
1158            }
1159
1160            self.words.nbytes += nbytes;
1161            self.nbits += nbytes << 3;
1162            *pointer.add(self.size() - 1) &= self.mask;
1163        }
1164    }
1165
1166    /// Adds lower bit padding to a bit string.
1167    ///
1168    /// # Examples
1169    /// ```
1170    /// # use bit_byte_bit::{Bits};
1171    /// let mut x1 = Bits::empty();
1172    ///
1173    /// x1.extend_right(&[0x0A, 0x0B, 0x0C]);
1174    ///
1175    /// assert_eq!(x1.len(), 24);
1176    /// assert_eq!(x1, Bits::new([0x0A, 0x0B, 0x0C]));
1177    ///
1178    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1179    ///
1180    /// x2.extend_right(&[0x0D, 0x0E, 0x0F]);
1181    ///
1182    /// assert_eq!(x2.len(), 44);
1183    /// assert_eq!(x2, Bits::from([0x0D, 0x0E, 0x0F, 0x0A, 0x0B, 0x0C]));
1184    /// ```
1185    pub fn extend_right(&mut self, bytes: &[u8]) {
1186        unsafe {
1187            let nbytes_padding = bytes.len();
1188            let nbytes = self.size() + nbytes_padding;
1189
1190            self.words.expand_to(nbytes);
1191
1192            let pointer = self.words.as_ptr_mut();
1193
1194            ptr::copy(pointer, pointer.add(nbytes_padding), self.size());
1195
1196            for i in 0..nbytes_padding { ptr::write(pointer.add(i), bytes[i]); }
1197
1198            self.words.nbytes = nbytes;
1199            self.nbits += nbytes_padding << 3;
1200            *pointer.add(self.size() - 1) &= self.mask;
1201        }
1202    }
1203
1204    /// The number of ones.
1205    ///
1206    /// # Examples
1207    /// ```
1208    /// # use bit_byte_bit::{Bits};
1209    /// let mut x = Bits::from([15, 15, 15]);
1210    ///
1211    /// assert_eq!(x.hamming_weight(), 12);
1212    /// ```
1213    pub fn hamming_weight(&self) -> usize {
1214        match self.size() {
1215            0 => 0,
1216            n => unsafe {
1217                let pointer = self.words.as_ptr_const();
1218                let mut sum = (*pointer.add(n - 1) & self.mask).count_ones();
1219
1220                for i in 0..(n - 1) { sum += (*pointer.add(i)).count_ones(); }
1221
1222                sum as usize
1223            }
1224        }
1225    }
1226
1227    /// State of a bit.
1228    ///
1229    /// # Examples
1230    /// ```
1231    /// # use bit_byte_bit::{Bits};
1232    /// let mut x = Bits::from([0x0F]);
1233    ///
1234    /// assert_eq!(x.i(3), 1u8);
1235    /// ```
1236    ///
1237    /// ```should_panic
1238    /// # use bit_byte_bit::{Bits};
1239    /// let mut x = Bits::from([0x0F]);
1240    ///
1241    /// assert_eq!(x.i(4), 0);
1242    /// ```
1243    pub fn i(&self, i: usize) -> u8 {
1244        assert!(i < self.nbits, "Index out of bounds");
1245
1246        unsafe { (*self.words.as_ptr_mut().add(i >> 3) >> (i & 7)) & 1 }
1247    }
1248
1249    /// An iterator over the individual bits
1250    ///
1251    /// # Examples
1252    /// ```
1253    /// # use bit_byte_bit::{Bits};
1254    /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
1255    /// let y = x.into_bytes().collect::<Vec<u8>>();
1256    ///
1257    /// assert_eq!(y, vec![0xAB, 0xCD, 0xEF]);
1258    /// ```
1259    pub fn into_bytes(self) -> IntoBytes {
1260        let (iter, bytes) = unsafe {
1261            (Bytes::new(self.bytes()), ptr::read(&self.words))
1262        };
1263
1264        std::mem::forget(self);
1265
1266        IntoBytes { iter, _bytes: bytes}
1267    }
1268
1269    /// An iterator over the individual bits
1270    ///
1271    /// # Examples
1272    /// ```
1273    /// # use bit_byte_bit::{Bits, Iter};
1274    /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
1275    /// let mut ones = 0;
1276    ///
1277    /// for bit in x.iter() { if bit == 1 { ones += 1; } }
1278    ///
1279    /// assert_eq!(ones, 17);
1280    /// ```
1281    pub fn iter(&self) -> Iter { Iter::new(self, 0) }
1282
1283    /// An iterator over the individual bits
1284    ///
1285    /// # Examples
1286    /// ```
1287    /// # use bit_byte_bit::{Bits, Iter};
1288    /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
1289    /// let mut ones = 0;
1290    ///
1291    /// for bit in x.iter_from(0) { if bit == 1 { ones += 1; } }
1292    ///
1293    /// assert_eq!(ones, 17);
1294    ///
1295    /// ones = 0;
1296    ///
1297    /// for bit in x.iter_from(13) { if bit == 1 { ones += 1; } }
1298    ///
1299    /// assert_eq!(ones, 9);
1300    /// ```
1301    pub fn iter_from(&self, index: usize) -> Iter {
1302        assert!(index <= self.nbits, "Index out of bounds");
1303
1304        Iter::new(self, index)
1305    }
1306
1307    /// The number of leading ones.
1308    ///
1309    /// # Examples
1310    /// ```
1311    /// # use bit_byte_bit::{Bits};
1312    /// let x1 = Bits::from([0x0A, 0xFF, 0x03]);
1313    ///
1314    /// assert_eq!(x1.leading_ones(), 10);
1315    ///
1316    /// let x2 = Bits::new([0x0A, 0xFF, 0x0B]);
1317    ///
1318    /// assert_eq!(x2.leading_ones(), 0);
1319    /// ```
1320    pub fn leading_ones(&self) -> usize {
1321        match self.size() {
1322            0 => 0,
1323            n => unsafe {
1324                let pointer = self.words.as_ptr_const();
1325                let last_byte = *pointer.add(n - 1) & self.mask;
1326                let ones = (last_byte << self.padding).leading_ones() as usize;
1327
1328                if ones < (8 - self.padding) { return ones; }
1329
1330                let mut i = n - 2;
1331
1332                while i > 0 && *pointer.add(i) == 0xFF { i -= 1; }
1333
1334                ones + ((self.size() - i - 2) << 3) + ((*pointer.add(i)).leading_ones() as usize)
1335            }
1336        }
1337    }
1338
1339    /// The number of leading zeros.
1340    ///
1341    /// # Examples
1342    /// ```
1343    /// # use bit_byte_bit::{Bits};
1344    /// let x1 = Bits::from([0x0A, 0x00, 0x00]);
1345    ///
1346    /// assert_eq!(x1.leading_zeros(), 0);
1347    ///
1348    /// let x2 = Bits::zeros(20);
1349    ///
1350    /// assert_eq!(x2.leading_zeros(), 20);
1351    /// ```
1352    pub fn leading_zeros(&self) -> usize {
1353        match self.size() {
1354            0 => 0,
1355            1 => unsafe {
1356                let byte = *self.words.as_ptr_const() & self.mask;
1357                (byte.leading_zeros() as usize) - self.padding
1358            },
1359            n => unsafe {
1360                let pointer = self.words.as_ptr_const();
1361                let last_byte = *pointer.add(n - 1) & self.mask;
1362                let zeros = (last_byte.leading_zeros() as usize) - self.padding;
1363
1364                if (zeros + self.padding) < 8 { return zeros; }
1365
1366                let mut i = n - 2;
1367
1368                while i > 0 && *pointer.add(i) == 0 { i -= 1; }
1369
1370                zeros + ((n - i - 2) << 3) + ((*pointer.add(i)).leading_zeros() as usize)
1371            }
1372        }
1373    }
1374
1375    /// The number of bits.
1376    ///
1377    /// # Examples
1378    /// ```
1379    /// # use bit_byte_bit::{Bits};
1380    /// let x1 = Bits::empty();
1381    ///
1382    /// assert_eq!(x1.len(), 0);
1383    ///
1384    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1385    ///
1386    /// assert_eq!(x2.len(), 20);
1387    ///
1388    /// let x3 = Bits::new([0x0A, 0x0B, 0x0C]);
1389    ///
1390    /// assert_eq!(x3.len(), 24);
1391    ///
1392    /// let x4 = Bits::slice(&[0x0A, 0x0B, 0x0C], 17);
1393    ///
1394    /// assert_eq!(x4.len(), 17);
1395    /// ```
1396    pub fn len(&self) -> usize { self.nbits }
1397
1398    /// Whether all bits are zero.
1399    ///
1400    /// # Examples
1401    /// ```
1402    /// # use bit_byte_bit::{Bits};
1403    /// let x1 = Bits::empty();
1404    ///
1405    /// assert!(!x1.any());
1406    ///
1407    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1408    ///
1409    /// assert!(x2.any());
1410    ///
1411    /// let x3 = Bits::zeros(20);
1412    ///
1413    /// assert!(!x3.any());
1414    pub fn none(&self) -> bool {
1415        unsafe {
1416            let pointer = self.words.as_ptr_const();
1417
1418            for i in 0..(self.size() - 1) {
1419                if *pointer.add(i) != 0 { return false; }
1420            }
1421
1422            (*pointer.add(self.size() - 1) & self.mask) == 0
1423        }
1424    }
1425
1426    /// Bitwise or of two bit strings.
1427    ///
1428    /// # Examples
1429    /// ```
1430    /// # use bit_byte_bit::{Bits};
1431    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
1432    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
1433    ///
1434    /// assert_eq!(x1.or(&y1), Bits::from([0xA0, 0xB0, 0xC0]));
1435    ///
1436    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
1437    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
1438    ///
1439    /// assert_eq!(x2.len(), 23);
1440    /// assert_eq!(y2.len(), 24);
1441    ///
1442    /// let z = x2.or(&y2);
1443    ///
1444    /// assert_eq!(z.len(), 24);
1445    /// ```
1446    pub fn or(&self, rhs: &Bits) -> Bits { bitop!(self, |, rhs) }
1447
1448    /// Bitwise or of two bit strings.
1449    ///
1450    /// # Examples
1451    /// ```
1452    /// # use bit_byte_bit::{Bits};
1453    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
1454    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
1455    ///
1456    /// x1.or_mut(&y1);
1457    ///
1458    /// assert_eq!(x1, Bits::from([0xA0, 0xB0, 0xC0]));
1459    ///
1460    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
1461    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
1462    ///
1463    /// assert_eq!(x2.len(), 23);
1464    /// assert_eq!(y2.len(), 24);
1465    ///
1466    /// x2.or_mut(&y2);
1467    ///
1468    /// assert_eq!(x2.len(), 24);
1469    /// ```
1470    pub fn or_mut(&mut self, rhs: &Bits) { bitop!(assign; self, |=, rhs) }
1471
1472    /// Shifts out the most significant bit.
1473    ///
1474    /// # Examples
1475    /// ```
1476    /// # use bit_byte_bit::{Bits};
1477    /// let mut x1 = Bits::empty();
1478    ///
1479    /// assert_eq!(x1.pop_left(), 0u8);
1480    ///
1481    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1482    ///
1483    /// assert_eq!(x2.pop_left(), 1u8);
1484    /// assert_eq!(x2.len(), 19);
1485    ///
1486    /// let mut x3 = Bits::new([0x0A, 0x0B, 0x0C]);
1487    ///
1488    /// assert_eq!(x3.pop_left(), 0u8);
1489    /// assert_eq!(x3.len(), 23);
1490    /// ```
1491    pub fn pop_left(&mut self) -> u8 {
1492        match self.size() {
1493            0 => 0,
1494            n => unsafe {
1495                let pointer = self.words.as_ptr_mut();
1496                self.nbits -= 1;
1497
1498                match self.padding {
1499                    0 => {
1500                        let bit = *pointer.add(n - 1) >> 7;
1501
1502                        *pointer.add(n - 1) &= 0x7F;
1503
1504                        bit
1505                    },
1506                    7 => {
1507                        let bit = ptr::read(pointer.add(n - 1)) & 1;
1508
1509                        self.words.nbytes -= 1;
1510                        self.padding = 0;
1511
1512                        bit
1513                    },
1514                    alignment => {
1515                        let shift = 8 - alignment - 1;
1516                        let bit = *pointer.add(n- 1) >> shift;
1517                        *pointer.add(n - 1) &= mask!(shift);
1518                        self.padding += 1;
1519
1520                        bit
1521                    }
1522                }
1523            }
1524        }
1525    }
1526
1527    /// Shifts out the least significant bit.
1528    ///
1529    /// # Examples
1530    /// ```
1531    /// # use bit_byte_bit::{Bits};
1532    /// let mut x1 = Bits::empty();
1533    ///
1534    /// assert_eq!(x1.pop_right(), 0u8);
1535    ///
1536    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1537    ///
1538    /// assert_eq!(x2.pop_right(), 0u8);
1539    /// assert_eq!(x2.len(), 19);
1540    /// assert_eq!(x2.pop_right(), 1u8);
1541    /// ```
1542    pub fn pop_right(&mut self) -> u8 {
1543        match self.size() {
1544            0 => 0,
1545            _ => {
1546                self.nbits -= 1;
1547                self.padding = (self.padding + 1) & 7;
1548
1549                unsafe {
1550                    let pointer = self.words.as_ptr_mut();
1551                    let bit = *pointer & 1;
1552
1553                    self.words.shift_right(self.size(), 1, 7, 1);
1554
1555                    if self.nbits == 0 {
1556                        ptr::read(pointer);
1557                        self.words.nbytes = 0;
1558                    }
1559
1560                    bit
1561                }
1562            }
1563        }
1564    }
1565
1566    /// Adds upper bit padding to a bit string.
1567    ///
1568    /// # Examples
1569    /// ```
1570    /// # use bit_byte_bit::{Bits};
1571    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1572    ///
1573    /// x1.push_left(true, 17);
1574    ///
1575    /// assert_eq!(x1.len(), 37);
1576    /// assert_eq!(x1, Bits::from([0x0A, 0x0B, 0xFC, 0xFF, 0x1F]));
1577    ///
1578    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1579    ///
1580    /// x2.push_left(false, 17);
1581    ///
1582    /// assert_eq!(x2.len(), 41);
1583    /// assert_eq!(x2, Bits::slice(&[0x0A, 0x0B, 0x0C, 0x00, 0x00, 0x00], 41));
1584    /// ```
1585    pub fn push_left(&mut self, bit: bool, count: usize) {
1586        if bit { self.push_ones(count); } else { self.push_zeros(count); }
1587    }
1588
1589    /// Adds upper bit padding to a bit string.
1590    ///
1591    /// # Examples
1592    /// ```
1593    /// # use bit_byte_bit::{Bits};
1594    /// let mut x = Bits::from([15, 15, 15]);
1595    ///
1596    /// x.push_byte_left(15, 2);
1597    ///
1598    /// assert_eq!(x.len(), 36);
1599    /// assert_eq!(x, Bits::slice(&[15, 15, 255, 240, 0], 36));
1600    ///
1601    /// x = Bits::new([15, 15, 15]);
1602    ///
1603    /// x.push_byte_left(31, 2);
1604    ///
1605    /// assert_eq!(x.len(), 40);
1606    /// assert_eq!(x, Bits::new([15, 15, 15, 31, 31]));
1607    /// ```
1608    pub fn push_byte_left(&mut self, word: u8, count: usize) {
1609        if count == 0 { return; }
1610
1611        match word {
1612            0 => self.push_zeros(count << 3),
1613            0xFF => self.push_ones(count << 3),
1614            word => unsafe {
1615                self.words.expand_to(self.size() + count);
1616
1617                let pointer = self.words.as_ptr_mut().add(self.size());
1618
1619                for i in 0..count { ptr::write(pointer.add(i), word); }
1620
1621                *pointer.add(self.size() - 1) &= self.mask;
1622
1623                if self.padding > 0 && word != 0 {
1624                    self.words.shift_right_from(
1625                        self.size(),
1626                        self.size() + count,
1627                        mask!(self.padding),
1628                        (8 - self.padding) & 7,
1629                        self.padding
1630                    );
1631                }
1632
1633                self.words.nbytes += count;
1634                self.nbits += count << 3;
1635
1636                self.shrink_to_fit()
1637            }
1638        }
1639    }
1640
1641    /// Adds lower bit padding to a bit string.
1642    ///
1643    /// # Examples
1644    /// ```
1645    /// # use bit_byte_bit::{Bits};
1646    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1647    ///
1648    /// x.push_right(true, 4);
1649    ///
1650    /// assert_eq!(x.len(), 24);
1651    /// assert_eq!(x, Bits::from([0xAF, 0xB0, 0xC0]));
1652    /// ```
1653    pub fn push_right(&mut self, bit: bool, count: usize)  {
1654        match count {
1655            0 => (),
1656            n => if bit { self.cons_bit(n, 0xFF); } else { self.cons_bit(n, 0) }
1657        }
1658    }
1659
1660    /// Adds lower bit padding to a bit string.
1661    ///
1662    /// # Examples
1663    /// ```
1664    /// # use bit_byte_bit::{Bits};
1665    /// let mut x = Bits::from([15, 15, 15]);
1666    ///
1667    /// x.push_byte_right(31, 2);
1668    ///
1669    /// assert_eq!(x.len(), 36);
1670    /// assert_eq!(x, Bits::from([31, 31, 15, 15, 15]));
1671    /// ```
1672    pub fn push_byte_right(&mut self, word: u8, count: usize) {
1673        let nbytes = self.size() + count;
1674        self.words.expand_to(nbytes);
1675
1676        unsafe {
1677            let pointer = self.words.as_ptr_mut();
1678
1679            ptr::copy(pointer, pointer.add(count), self.size());
1680
1681            for i in 0..count { ptr::write(pointer.add(i), word); }
1682        }
1683
1684        self.words.nbytes = nbytes;
1685        self.nbits += count << 3;
1686    }
1687
1688    /// Sets a bit to zero.
1689    ///
1690    /// # Examples
1691    /// ```
1692    /// # use bit_byte_bit::{Bits};
1693    /// let mut x = Bits::new([15]);
1694    ///
1695    /// assert_eq!(x.i(3), 1u8);
1696    ///
1697    /// x.reset(3);
1698    ///
1699    /// assert_eq!(x.i(3), 0u8);
1700    /// ```
1701    pub fn reset(&mut self, i: usize) {
1702        if i < self.nbits {
1703            unsafe { *self.words.as_ptr_mut().add(i >> 3) &= !(1 << (i & 7)); }
1704        }
1705    }
1706
1707    /// Sets the state of a range of bits to zero.
1708    ///
1709    /// # Examples
1710    /// ```
1711    /// # use bit_byte_bit::{Bits};
1712    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1713    /// x1.reset_bits(7, 10);
1714    ///
1715    /// assert_eq!(x1, Bits::from([0x0A, 0x00, 0x0C]));
1716    ///
1717    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1718    /// x2.reset_bits(8, 12);
1719    ///
1720    /// assert_eq!(x2, Bits::slice(&[0x0A, 0x00, 0x00], 20));
1721    /// ```
1722    ///
1723    /// ``` should_panic
1724    /// # use bit_byte_bit::{Bits};
1725    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1726    ///
1727    /// x.reset_bits(21, 14);
1728    /// ```
1729    ///
1730    /// ```should_panic
1731    /// # use bit_byte_bit::{Bits};
1732    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1733    ///
1734    /// x.reset_bits(7, 14);
1735    /// ```
1736    pub fn reset_bits(&mut self, start: usize, count: usize) {
1737        assert!(count <= self.nbits && start <= self.nbits - count, "Invalid range");
1738
1739        let end = if count > (self.nbits - start) { self.nbits } else { start + count };
1740        let mut start = start;
1741        let low_overflow = 8 - (start & 7);
1742
1743        unsafe {
1744            let pointer = self.words.as_ptr_mut();
1745
1746            if low_overflow < 8 {
1747                *pointer.add(start >> 3) &= !(((1 << low_overflow) - 1) << (start & 7));
1748                start = start + low_overflow;
1749            }
1750
1751            let bytes = (end - start) >> 3;
1752            let start_byte = start >> 3;
1753
1754            for i in start_byte..(start_byte + bytes) { *pointer.add(i) = 0 }
1755
1756            let overflow = (end - start) & 7;
1757
1758            if overflow > 0 { *pointer.add(start_byte + bytes) &= !((1 << overflow) - 1); }
1759
1760            if self.size() > 0 { *pointer.add(self.words.nbytes - 1) &= self.mask; }
1761        }
1762    }
1763
1764    /// Sets the state of a byte to zero.
1765    ///
1766    /// # Examples
1767    /// ```
1768    /// # use bit_byte_bit::{Bits};
1769    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1770    ///
1771    /// x.reset_byte(1);
1772    ///
1773    /// assert_eq!(x, Bits::from([0x0A, 0x00, 0x0C]));
1774    ///
1775    /// x.reset_byte(2);
1776    ///
1777    /// assert_eq!(x, Bits::slice(&[0x0A, 0x00, 0x00], 20));
1778    ///```
1779    ///
1780    /// ```should_panic
1781    /// # use bit_byte_bit::{Bits};
1782    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1783    ///
1784    /// x.reset_byte(3);
1785    /// ```
1786    pub fn reset_byte(&mut self, i: usize) {
1787        assert!(i < self.size(), "Index out of range");
1788
1789        unsafe {
1790            let pointer = self.words.as_ptr_mut();
1791            *pointer.add(i) = 0;
1792
1793            if self.size() > 0 { *pointer.add(self.words.nbytes - 1) &= self.mask; }
1794        }
1795    }
1796
1797    /// Sets the state of a range of bytes to zero.
1798    ///
1799    /// # Examples
1800    /// ```
1801    /// # use bit_byte_bit::{Bits};
1802    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1803    ///
1804    /// x.reset_bytes(1, 2);
1805    ///
1806    /// assert_eq!(x, Bits::slice(&[0x0A, 0x00, 0x00], 20));
1807    /// ```
1808    ///
1809    /// ```should_panic
1810    /// # use bit_byte_bit::{Bits};
1811    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1812    ///
1813    /// x.reset_bytes(3, 2);
1814    /// ```
1815    ///
1816    /// ```should_panic
1817    /// # use bit_byte_bit::{Bits};
1818    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1819    ///
1820    /// x.reset_bytes(0, 4);
1821    /// ```
1822    pub fn reset_bytes(&mut self, start: usize, count: usize) {
1823        assert!(count <= self.size() && start <= self.size() - count, "Invalid range");
1824
1825        unsafe {
1826            let pointer = self.words.as_ptr_mut();
1827
1828            let end = if count > (self.size() - start) { self.size() } else { start + count };
1829
1830            for i in start..end { *pointer.add(i) = 0; }
1831
1832            if end == self.size() && self.padding > 0 { *pointer.add(end - 1) &= self.mask; }
1833        }
1834    }
1835
1836    /// Reverses the order of the bits.
1837    ///
1838    /// # Examples
1839    /// ```
1840    /// # use bit_byte_bit::{Bits};
1841    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1842    ///
1843    /// x1.reverse();
1844    ///
1845    /// assert_eq!(x1, Bits::slice(&[0x03, 0x0D, 0x05], 20));
1846    ///
1847    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1848    ///
1849    /// x2.reverse();
1850    ///
1851    /// assert_eq!(x2, Bits::new([0x30, 0xD0, 0x50]));
1852    /// ```
1853    pub fn reverse(&mut self) {
1854        match self.size() {
1855            0 => (),
1856            n => unsafe {
1857                let aptr = self.words.as_ptr_mut();
1858                *aptr.add(n - 1) &= self.mask;
1859
1860                let mid = n >> 1;
1861                let upper_bound = n - 1;
1862
1863                for i in 0..mid {
1864                    let a = (*aptr.add(i)).reverse_bits();
1865
1866                    *aptr.add(i) = (*aptr.add(upper_bound - i)).reverse_bits();
1867                    *aptr.add(upper_bound - i) = a;
1868                }
1869
1870                if (n & 1) == 1 { *aptr.add(mid) = (*aptr.add(mid)).reverse_bits() }
1871
1872                if self.padding > 0 {
1873                    let overflow = 8 - self.padding;
1874                    let mask = (1 << overflow) - 1;
1875
1876                    self.words.shift_right(self.size(), mask, self.padding, overflow);
1877                }
1878            }
1879        }
1880    }
1881
1882    /// Reverses the order of the bits.
1883    ///
1884    /// # Examples
1885    /// ```
1886    /// # use bit_byte_bit::{Bits};
1887    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1888    ///
1889    /// assert_eq!(x1.reversed(), Bits::slice(&[0x03, 0x0D, 0x05], 20));
1890    ///
1891    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1892    ///
1893    /// assert_eq!(x2.reversed(), Bits::new([0x30, 0xD0, 0x50]));
1894    /// ```
1895    pub fn reversed(&self) -> Self {
1896        let mut cloned = self.clone();
1897
1898        cloned.reverse();
1899
1900        cloned
1901    }
1902
1903    /// Rotates bits to the left.
1904    ///
1905    /// # Examples
1906    /// ```
1907    /// # use bit_byte_bit::{Bits};
1908    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1909    ///
1910    /// x1.rotate_left(4);
1911    ///
1912    /// assert_eq!(x1, Bits::slice(&[0xAC, 0xB0, 0x00], 20));
1913    /// assert_eq!(x1.len(), 20);
1914    ///
1915    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1916    ///
1917    /// x2.rotate_left(4);
1918    ///
1919    /// assert_eq!(x2, Bits::new([0xA0, 0xB0, 0xC0]));
1920    /// assert_eq!(x2.len(), 24);
1921    /// ```
1922    pub fn rotate_left(&mut self, count: usize) {
1923        match (self.size(), count) {
1924            (0, _) | (_, 0) => (),
1925            (n, count) => {
1926                unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
1927
1928                let reduced_count = count % self.nbits;
1929                let other = self.shifted_right(self.nbits - reduced_count);
1930
1931                self.shift_left(reduced_count);
1932                self.or_mut(&other);
1933            }
1934        }
1935    }
1936
1937    /// Rotates bits to the left.
1938    ///
1939    /// # Examples
1940    /// ```
1941    /// # use bit_byte_bit::{Bits};
1942    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1943    ///
1944    /// assert_eq!(x1.rotated_left(4), Bits::slice(&[0xAC, 0xB0, 0x00], 20));
1945    /// assert_eq!(x1.len(), 20);
1946    ///
1947    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1948    ///
1949    /// assert_eq!(x2.rotated_left(4), Bits::new([0xA0, 0xB0, 0xC0]));
1950    /// assert_eq!(x2.len(), 24);
1951    /// ```
1952    pub fn rotated_left(&self, count: usize) -> Self {
1953        match (self.size(), count) {
1954            (0, _) | (_, 0) => self.clone(),
1955            (n, count) => {
1956                unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
1957
1958                let reduced_count = count % self.nbits;
1959                let mut other = self.shifted_left(reduced_count);
1960
1961                other |= self.shifted_right(self.nbits - reduced_count);
1962
1963                other
1964            }
1965        }
1966    }
1967
1968    /// Rotates bits to the right.
1969    ///
1970    /// # Examples
1971    /// ```
1972    /// # use bit_byte_bit::{Bits};
1973    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1974    ///
1975    /// x1.rotate_right(4);
1976    ///
1977    /// assert_eq!(x1, Bits::slice(&[0xB0, 0xC0, 0x0A], 20));
1978    /// assert_eq!(x1.len(), 20);
1979    ///
1980    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1981    ///
1982    /// x2.rotate_right(4);
1983    ///
1984    /// assert_eq!(x2, Bits::new([0xB0, 0xC0, 0xA0]));
1985    /// assert_eq!(x2.len(), 24);
1986    /// ```
1987    pub fn rotate_right(&mut self, count: usize) {
1988        match (self.size(), count) {
1989            (0, _) | (_, 0) => (),
1990            (n, count) => {
1991                unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
1992
1993                let reduced_count = count % self.nbits;
1994                let other = self.shifted_left(self.nbits - reduced_count);
1995
1996                self.shift_right(reduced_count);
1997                self.or_mut(&other);
1998            }
1999        }
2000    }
2001
2002    /// Rotates bits to the right.
2003    ///
2004    /// # Examples
2005    /// ```
2006    /// # use bit_byte_bit::{Bits};
2007    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2008    ///
2009    /// assert_eq!(x1.rotated_right(4), Bits::slice(&[0xB0, 0xC0, 0x0A], 20));
2010    /// assert_eq!(x1.len(), 20);
2011    ///
2012    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2013    ///
2014    /// assert_eq!(x2.rotated_right(4), Bits::new([0xB0, 0xC0, 0xA0]));
2015    /// assert_eq!(x2.len(), 24);
2016    /// ```
2017    pub fn rotated_right(&self, count: usize) -> Self {
2018        match (self.size(), count) {
2019            (0, _) | (_, 0) => self.clone(),
2020            (n, count) => {
2021                unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
2022
2023                let reduced_count = count % self.nbits;
2024                let mut other = self.shifted_right(reduced_count);
2025
2026                other |= self.shifted_left(self.nbits - reduced_count);
2027
2028                other
2029            }
2030        }
2031    }
2032
2033    /// Sets a bit to one.
2034    ///
2035    /// # Examples
2036    /// ```
2037    /// # use bit_byte_bit::{Bits};
2038    /// let mut x = Bits::new([15]);
2039    ///
2040    /// assert_eq!(x.i(4), 0u8);
2041    ///
2042    /// x.set(4);
2043    ///
2044    /// assert_eq!(x.i(4), 1u8);
2045    /// ```
2046    pub fn set(&mut self, i: usize) {
2047        assert!(i < self.nbits, "Index out of range");
2048
2049        unsafe { *self.words.as_ptr_mut().add(i >> 3) |= 1 << (i & 7); }
2050    }
2051
2052    /// Sets the state of a range of bits to one.
2053    ///
2054    /// # Examples
2055    /// ```
2056    /// # use bit_byte_bit::{Bits};
2057    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2058    /// x1.set_bits(7, 10);
2059    ///
2060    /// assert_eq!(x1, Bits::from([0x8A, 0xFF, 0x0D]));
2061    ///
2062    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2063    /// x2.set_bits(8, 12);
2064    ///
2065    /// assert_eq!(x2, Bits::slice(&[0x0A, 0xFF, 0x0F], 20));
2066    /// ```
2067    ///
2068    /// ``` should_panic
2069    /// # use bit_byte_bit::{Bits};
2070    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2071    ///
2072    /// x.set_bits(21, 14);
2073    /// ```
2074    ///
2075    /// ```should_panic
2076    /// # use bit_byte_bit::{Bits};
2077    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2078    ///
2079    /// x.set_bits(7, 14);
2080    /// ```
2081    pub fn set_bits(&mut self, start: usize, count: usize) {
2082        assert!(count <= self.nbits && start <= self.nbits - count, "Invalid range");
2083
2084        let end = if count > (self.nbits - start) { self.nbits } else { start + count };
2085        let mut start = start;
2086        let low_overflow = 8 - (start & 7);
2087
2088        unsafe {
2089            let pointer = self.words.as_ptr_mut();
2090
2091            if low_overflow < 8 {
2092                *pointer.add(start >> 3) |= ((1 << low_overflow) - 1) << (start & 7);
2093                start = start + low_overflow;
2094            }
2095
2096            let bytes = (end - start) >> 3;
2097            let start_byte = start >> 3;
2098
2099            for i in start_byte..(start_byte + bytes) { *pointer.add(i) = 0xFF }
2100
2101            let overflow = (end - start) & 7;
2102
2103            if overflow > 0 { *pointer.add(start_byte + bytes) |= (1 << overflow) - 1; }
2104        }
2105    }
2106
2107    /// Sets the state of a byte to all ones.
2108    ///
2109    /// # Examples
2110    /// ```
2111    /// # use bit_byte_bit::{Bits};
2112    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2113    ///
2114    /// x.set_byte(1);
2115    ///
2116    /// assert_eq!(x, Bits::from([0x0A, 0xFF, 0x0C]));
2117    ///
2118    /// x.set_byte(2);
2119    ///
2120    /// assert_eq!(x, Bits::slice(&[0x0A, 0xFF, 0x0F], 20));
2121    ///```
2122    ///
2123    /// ```should_panic
2124    /// # use bit_byte_bit::{Bits};
2125    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2126    ///
2127    /// x.toggle_byte(3);
2128    /// ```
2129    pub fn set_byte(&mut self, i: usize) {
2130        assert!(i < self.size(), "Index out of range");
2131
2132        unsafe {
2133            let pointer = self.words.as_ptr_mut();
2134            *pointer.add(i) = 0xFF;
2135            *pointer.add(self.size() - 1) &= self.mask;
2136        }
2137    }
2138
2139    /// Sets the state of a range of bytes to all ones.
2140    ///
2141    /// # Examples
2142    /// ```
2143    /// # use bit_byte_bit::{Bits};
2144    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2145    ///
2146    /// x.set_bytes(1, 2);
2147    ///
2148    /// assert_eq!(x, Bits::slice(&[0x0A, 0xFF, 0x0F], 20));
2149    /// ```
2150    ///
2151    /// ```should_panic
2152    /// # use bit_byte_bit::{Bits};
2153    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2154    ///
2155    /// x.set_bytes(3, 2);
2156    /// ```
2157    ///
2158    /// ```should_panic
2159    /// # use bit_byte_bit::{Bits};
2160    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2161    ///
2162    /// x.set_bytes(0, 4);
2163    /// ```
2164    pub fn set_bytes(&mut self, start: usize, count: usize) {
2165        assert!(count <= self.size() && start <= self.size() - count, "Invalid range");
2166
2167        unsafe {
2168            let pointer = self.words.as_ptr_mut();
2169
2170            let end = if count > (self.size() - start) { self.size() } else { start + count };
2171
2172            for i in start..end { *pointer.add(i) = 0xFF; }
2173
2174            if end == self.size() && self.padding > 0 { *pointer.add(end - 1) &= self.mask; }
2175        }
2176    }
2177
2178    /// Shifts out upper bits, shifting in zeros on the lower end.
2179    ///
2180    /// # Examples
2181    /// ```
2182    /// # use bit_byte_bit::{Bits};
2183    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2184    ///
2185    /// x1.shift_left(17);
2186    ///
2187    /// assert_eq!(x1, Bits::slice(&[0x00, 0x00, 0x04], 20));
2188    /// assert_eq!(x1.len(), 20);
2189    ///
2190    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2191    ///
2192    /// x2.shift_left(4);
2193    ///
2194    /// assert_eq!(x2, Bits::new([0xA0, 0xB0, 0xC0]));
2195    /// assert_eq!(x2.len(), 24);
2196    /// ```
2197    pub fn shift_left(&mut self, count: usize) {
2198        match (self.size(), count) {
2199            (0, _) | (_, 0) => (),
2200            (_, count) if count >= self.nbits => unsafe {
2201                let pointer = self.words.as_ptr_mut();
2202
2203                for i in 0..self.size() { *pointer.add(i) = 0 }
2204            },
2205            (n, count) => unsafe {
2206                let pointer = self.words.as_ptr_mut();
2207                let shift_overflow = count & 7;
2208                let shift_bytes = count >> 3;
2209
2210                if shift_bytes > 0 {
2211                    ptr::copy(pointer, pointer.add(shift_bytes), self.size() - shift_bytes);
2212
2213                    for i in 0..shift_bytes { *pointer.add(i) = 0; }
2214
2215                    *pointer.add(n - 1) &= self.mask;
2216                }
2217
2218                if shift_overflow > 0 {
2219                    let low = 8 - shift_overflow;
2220
2221                    for i in 1..n {
2222                        *pointer.add(n - i) <<= shift_overflow;
2223                        *pointer.add(i) |= *pointer.add(n - i - 1) >> low;
2224                    }
2225
2226                    *pointer <<= shift_overflow;
2227                }
2228
2229                *pointer.add(n - 1) &= self.mask;
2230            }
2231        }
2232    }
2233
2234    /// Shifts out upper bits, shifting in zeros on the lower end.
2235    ///
2236    /// # Examples
2237    /// ```
2238    /// # use bit_byte_bit::{Bits};
2239    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2240    /// let s1 = x1.shifted_left(17);
2241    ///
2242    /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
2243    /// assert_eq!(s1.len(), 20);
2244    ///
2245    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2246    /// let s2 = x2.shifted_left(4);
2247    ///
2248    /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
2249    /// assert_eq!(s2.len(), 24);
2250    /// ```
2251    pub fn shifted_left(&self, count: usize) -> Self {
2252        let mut clone = self.clone();
2253
2254        clone.shift_left(count);
2255
2256        clone
2257    }
2258
2259    /// Shifts out lower bits, shifting zeros into the upper bits.
2260    ///
2261    /// # Examples
2262    /// ```
2263    /// # use bit_byte_bit::{Bits};
2264    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2265    ///
2266    /// x1.shift_right(17);
2267    ///
2268    /// assert_eq!(x1.len(), 20);
2269    /// assert_eq!(x1, Bits::slice(&[0x06, 0x00, 0x00], 20));
2270    ///
2271    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2272    ///
2273    /// x2.shift_right(4);
2274    ///
2275    /// assert_eq!(x2.len(), 24);
2276    /// assert_eq!(x2, Bits::new([0xB0, 0xC0, 0x00]));
2277    /// ```
2278    pub fn shift_right(&mut self, count: usize) {
2279        match (self.size(), count) {
2280            (0, _) | (_, 0) => (),
2281            (_, count) if count >= self.nbits => unsafe {
2282                let pointer = self.words.as_ptr_mut();
2283
2284                for i in 0..self.size() { *pointer.add(i) = 0 }
2285            },
2286            (n, count) => unsafe {
2287                let pointer = self.words.as_ptr_mut();
2288                *pointer.add(n - 1) &= self.mask;
2289                let nbytes_shift = count >> 3;
2290
2291                ptr::copy(pointer.add(nbytes_shift), pointer, self.size() - nbytes_shift);
2292
2293                for i in (self.size() - nbytes_shift)..self.size() { *pointer.add(i) = 0; }
2294
2295                let overflow = count & 7;
2296
2297                if overflow > 0 {
2298                    let mask = (1 << overflow) - 1;
2299                    let low = 8 - overflow;
2300
2301                    self.words.shift_right(self.size() - nbytes_shift, mask, low, overflow);
2302                }
2303            }
2304        }
2305    }
2306
2307    /// Shifts out lower bits, shifting zeros into the upper bits.
2308    ///
2309    /// # Examples
2310    /// ```
2311    /// # use bit_byte_bit::{Bits};
2312    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2313    /// let s1 = x1.shifted_right(17);
2314    ///
2315    /// assert_eq!(s1.len(), 20);
2316    /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
2317    ///
2318    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2319    /// let s2 = x2.shifted_right(4);
2320    ///
2321    /// assert_eq!(s2.len(), 24);
2322    /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
2323    /// ```
2324    pub fn shifted_right(&self, count: usize) -> Self {
2325        let mut clone = self.clone();
2326
2327        clone.shift_right(count);
2328
2329        clone
2330    }
2331
2332    /// The number of bytes.
2333    ///
2334    /// # Examples
2335    /// ```
2336    /// # use bit_byte_bit::{Bits};
2337    /// let x1 = Bits::empty();
2338    ///
2339    /// assert_eq!(x1.size(), 0);
2340    ///
2341    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2342    ///
2343    /// assert_eq!(x2.size(), 3);
2344    ///
2345    /// let x3 = Bits::new([0x0A, 0x0B, 0x0C]);
2346    ///
2347    /// assert_eq!(x3.size(), 3);
2348    ///
2349    /// let x4 = Bits::slice(&[0x0A, 0x0B, 0x0C], 13);
2350    ///
2351    /// assert_eq!(x4.size(), 2);
2352    /// ```
2353    pub fn size(&self) -> usize { self.words.nbytes }
2354
2355    /// Splits the bit string.
2356    ///
2357    /// When the index is greater than or equal to the length
2358    /// of the bit string, the second element of the returned
2359    /// pair will be empty. When the index is `0`, the first
2360    /// element will be empty.
2361    ///
2362    /// # Examples
2363    /// ```
2364    /// # use bit_byte_bit::{Bits};
2365    /// let x1 = Bits::empty();
2366    /// let (l1, r1) = x1.split(11);
2367    ///
2368    /// assert_eq!(l1.len(), 0);
2369    /// assert_eq!(r1.len(), 0);
2370    ///
2371    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2372    /// let (l2, r2) = x2.split(20);
2373    ///
2374    /// assert_eq!(l2, x2);
2375    /// assert_eq!(r2.len(), 0);
2376    ///
2377    /// let (l3, r3) = x2.split(0);
2378    ///
2379    /// assert_eq!(l3.len(), 0);
2380    /// assert_eq!(r3, x2);
2381    ///
2382    /// let (l4, r4) = x2.split(11);
2383    /// assert_eq!(l4, Bits::slice(&[0x0A, 0x03], 11));
2384    /// assert_eq!(r4, Bits::slice(&[0x81, 0x01], 9));
2385    /// ```
2386    pub fn split(&self, i: usize) -> (Bits, Bits) {
2387        if i >= self.nbits { return (self.clone(), Bits::empty()) }
2388
2389        if i == 0 { return (Bits::empty(), self.clone()) }
2390
2391        let rlen = self.nbits - i;
2392        let (lsize, loverflow) = divrem8!(ceil; i);
2393        let idiv8 = i >> 3;
2394        let (rsize, roverflow) = (self.size() - idiv8, rlen & 7);
2395        let (lmask, rmask) = (mask!(loverflow), mask!(roverflow));
2396
2397        unsafe {
2398            let pointer = self.words.as_ptr_mut();
2399            let l = pointer![lsize];
2400            let r = pointer![rsize];
2401
2402            for i in 0..lsize { *l.add(i) = *pointer.add(i); }
2403            for i in 0..rsize { *r.add(i) = *pointer.add(idiv8 + i); }
2404
2405            let rbytes = RawBytes { bytes: NonNull::new(r).unwrap(), cap: rsize, nbytes: rsize };
2406
2407            let mut rbits = Bits {
2408                words: rbytes,
2409                mask: rmask,
2410                nbits: self.nbits - i,
2411                padding: (8 - roverflow) & 7
2412            };
2413
2414            if loverflow > 0 {
2415                *l.add(lsize - 1) &= lmask;
2416
2417                rbits.words.shift_right(rsize, lmask, 8 - loverflow, loverflow);
2418            }
2419
2420            let lbytes = RawBytes { bytes: NonNull::new(l).unwrap(), cap: lsize, nbytes: lsize };
2421
2422            let lbits = Bits {
2423                words: lbytes,
2424                mask: lmask,
2425                nbits: i,
2426                padding: (8 - loverflow) & 7
2427            };
2428
2429            (lbits, rbits)
2430        }
2431    }
2432
2433    /// Whether a bit is one.
2434    ///
2435    /// # Examples
2436    /// ```
2437    /// # use bit_byte_bit::{Bits};
2438    /// let mut x = Bits::from([0x0F]);
2439    ///
2440    /// assert!(x.test(3));
2441    /// assert!(!x.test(4));
2442    /// assert!(!x.test(8));
2443    /// ```
2444    pub fn test(&self, i: usize) -> bool {
2445        unsafe {
2446            i < self.nbits && (*self.words.as_ptr_mut().add(i >> 3) & (1 << (i & 7))) > 0
2447        }
2448    }
2449
2450    /// Flips the state of a bit.
2451    ///
2452    /// # Examples
2453    /// ```
2454    /// # use bit_byte_bit::{Bits};
2455    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2456    ///
2457    /// assert_eq!(x.i(0), 0u8);
2458    /// assert_eq!(x.i(1), 1u8);
2459    ///
2460    /// x.toggle(0);
2461    /// x.toggle(1);
2462    ///
2463    /// assert_eq!(x.i(0), 1u8);
2464    /// assert_eq!(x.i(1), 0u8);
2465    /// ```
2466    ///
2467    /// ```should_panic
2468    /// # use bit_byte_bit::{Bits};
2469    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2470    ///
2471    /// x.toggle(21);
2472    /// ```
2473    pub fn toggle(&mut self, i: usize) {
2474        assert!(i < self.nbits, "Index out of range");
2475
2476        unsafe { *self.words.as_ptr_mut().add(i >> 3) ^= 1 << (i & 7); }
2477    }
2478
2479    /// Flips the state of a range of bits.
2480    ///
2481    /// # Examples
2482    /// ```
2483    /// # use bit_byte_bit::{Bits};
2484    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2485    /// x1.toggle_bits(7, 10);
2486    ///
2487    /// assert_eq!(x1, Bits::from([0x8A, 0xF4, 0x0D]));
2488    ///
2489    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2490    /// x2.toggle_bits(8, 12);
2491    ///
2492    /// assert_eq!(x2, Bits::slice(&[0x0A, 0xF4, 0x03], 20));
2493    /// ```
2494    ///
2495    /// ``` should_panic
2496    /// # use bit_byte_bit::{Bits};
2497    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2498    ///
2499    /// x.toggle_bits(21, 14);
2500    /// ```
2501    ///
2502    /// ```should_panic
2503    /// # use bit_byte_bit::{Bits};
2504    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2505    ///
2506    /// x.toggle_bits(7, 14);
2507    /// ```
2508    pub fn toggle_bits(&mut self, start: usize, count: usize) {
2509        assert!(count <= self.nbits && start <= self.nbits - count, "Invalid range");
2510
2511        let end = if count > (self.nbits - start) { self.nbits } else { start + count };
2512        let mut start = start;
2513        let low_overflow = 8 - (start & 7);
2514
2515        unsafe {
2516            let pointer = self.words.as_ptr_mut();
2517
2518            if low_overflow < 8 {
2519                *pointer.add(start >> 3) ^= ((1 << low_overflow) - 1) << (start & 7);
2520                start = start + low_overflow;
2521            }
2522
2523            let bytes = (end - start) >> 3;
2524            let start_byte = start >> 3;
2525
2526            for i in start_byte..(start_byte + bytes) { *pointer.add(i) = !*pointer.add(i); }
2527
2528            let overflow = (end - start) & 7;
2529
2530            if overflow > 0 { *pointer.add(start_byte + bytes) ^= (1 << overflow) - 1; }
2531        }
2532    }
2533
2534    /// Flips the state of a byte.
2535    ///
2536    /// # Examples
2537    /// ```
2538    /// # use bit_byte_bit::{Bits};
2539    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2540    ///
2541    /// x.toggle_byte(1);
2542    ///
2543    /// assert_eq!(x, Bits::from([0x0A, 0xF4, 0x0C]));
2544    ///
2545    /// x.toggle_byte(2);
2546    ///
2547    /// assert_eq!(x, Bits::slice(&[0x0A, 0xF4, 0x03], 20));
2548    ///```
2549    ///
2550    /// ```should_panic
2551    /// # use bit_byte_bit::{Bits};
2552    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2553    ///
2554    /// x.toggle_byte(3);
2555    /// ```
2556    pub fn toggle_byte(&mut self, i: usize) {
2557        assert!(i < self.size(), "Index out of range");
2558
2559        unsafe {
2560            let pointer = self.words.as_ptr_mut();
2561            *pointer.add(i) = !*pointer.add(i);
2562            *pointer.add(self.size() - 1) &= self.mask;
2563        }
2564    }
2565
2566    /// Flips the state of a range of bytes.
2567    ///
2568    /// # Examples
2569    /// ```
2570    /// # use bit_byte_bit::{Bits};
2571    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2572    ///
2573    /// x.toggle_bytes(1, 2);
2574    ///
2575    /// assert_eq!(x, Bits::slice(&[0x0A, 0xF4, 0x03], 20));
2576    /// ```
2577    ///
2578    /// ```should_panic
2579    /// # use bit_byte_bit::{Bits};
2580    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2581    ///
2582    /// x.toggle_bytes(3, 2);
2583    /// ```
2584    ///
2585    /// ```should_panic
2586    /// # use bit_byte_bit::{Bits};
2587    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2588    ///
2589    /// x.toggle_bytes(0, 4);
2590    /// ```
2591    pub fn toggle_bytes(&mut self, start: usize, count: usize) {
2592        assert!(count <= self.size() && start <= self.size() - count, "Invalid range");
2593
2594        unsafe {
2595            let pointer = self.words.as_ptr_mut();
2596
2597            let end = if count > (self.size() - start) { self.size() } else { start + count };
2598
2599            for i in start..end { *pointer.add(i) = !*pointer.add(i); }
2600
2601            if end == self.size() && self.padding > 0 { *pointer.add(end - 1) &= self.mask; }
2602        }
2603    }
2604
2605    /// The number of trailing ones.
2606    ///
2607    /// # Examples
2608    /// ```
2609    /// # use bit_byte_bit::{Bits};
2610    /// let x = Bits::from([0xFF, 0x0B, 0x0A]);
2611    ///
2612    /// assert_eq!(x.trailing_ones(), 10);
2613    /// ```
2614    pub fn trailing_ones(&self) -> usize {
2615        match self.size() {
2616            0 => 0,
2617            n => unsafe {
2618                let pointer = self.words.as_ptr_const();
2619                let mut i = 1;
2620
2621                while i < (n - 1) && *pointer.add(i - 1) == 0xFF { i += 1; }
2622
2623                ((i - 1) << 3) + ((*pointer.add(i - 1) & self.mask).trailing_ones() as usize)
2624            }
2625        }
2626    }
2627
2628    /// The number of trailing zeros.
2629    ///
2630    /// # Examples
2631    /// ```
2632    /// # use bit_byte_bit::{Bits};
2633    /// let x1 = Bits::from([0x00, 0x0A, 0x0B]);
2634    ///
2635    /// assert_eq!(x1.trailing_zeros(), 9);
2636    ///
2637    /// let x2 = Bits::zeros(20);
2638    ///
2639    /// assert_eq!(x2.trailing_zeros(), 20);
2640    /// ```
2641    pub fn trailing_zeros(&self) -> usize {
2642        match self.size() {
2643            0 => 0,
2644            n => unsafe {
2645                let pointer = self.words.as_ptr_const();
2646                let mut i = 0;
2647
2648                while i < (n - 1) && *pointer.add(i) == 0 { i += 1; }
2649
2650                let zeros = if i == (n - 1) {
2651                    let mut trailing = (*pointer.add(i) & self.mask).trailing_zeros() as usize;
2652
2653                    if *pointer.add(i) == 0 { trailing -= self.padding; }
2654
2655                    trailing
2656                } else {
2657                    (*pointer.add(i)).trailing_zeros() as usize
2658                };
2659
2660                zeros + (i << 3)
2661            }
2662        }
2663    }
2664
2665    /// Trims leading bits.
2666    ///
2667    /// # Examples
2668    /// ```
2669    /// # use bit_byte_bit::{Bits};
2670    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2671    ///
2672    /// x1.trim_end(false);
2673    ///
2674    /// assert_eq!(x1.len(), 20);
2675    /// assert_eq!(x1, Bits::from([0x0A, 0x0B, 0x0C]));
2676    ///
2677    /// x1.trim_end(true);
2678    ///
2679    /// assert_eq!(x1.len(), 18);
2680    /// assert_eq!(x1, Bits::slice(&[0x0A, 0x0B, 0x00], 18));
2681    ///
2682    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2683    ///
2684    /// x2.trim_end(true);
2685    ///
2686    /// assert_eq!(x2.len(), 24);
2687    /// assert_eq!(x2, Bits::new([0x0A, 0x0B, 0x0C]));
2688    ///
2689    /// x2.trim_end(false);
2690    ///
2691    /// assert_eq!(x2.len(), 20);
2692    /// assert_eq!(x2, Bits::from([0x0A, 0x0B, 0x0C]));
2693    ///
2694    /// let mut x3 = Bits::slice(&[0x0A, 0x0B, 0x00], 18);
2695    ///
2696    /// x3.trim_end(false);
2697    ///
2698    /// assert_eq!(x3.len(), 12);
2699    /// assert_eq!(x3, Bits::from([0x0A, 0x0B]));
2700    ///
2701    /// let mut x4 = Bits::slice(&[0x0A, 0xFB, 0x03], 18);
2702    ///
2703    /// x4.trim_end(true);
2704    ///
2705    /// assert_eq!(x4.len(), 11);
2706    /// assert_eq!(x4, Bits::slice(&[0x0A, 0x0B], 11));
2707    /// ```
2708    pub fn trim_end(&mut self, bit: bool) {
2709        unsafe {
2710            let pointer = self.words.as_ptr_mut();
2711            *pointer.add(self.size() - 1) &= self.mask;
2712            let mut i = self.size();
2713
2714            if self.padding > 0 {
2715                let last_byte = pointer.add(self.size() - 1);
2716
2717                if bit && *last_byte != self.mask {
2718                    *last_byte <<= self.padding;
2719                    let clo = (*last_byte).leading_ones() as usize;
2720                    *last_byte <<= clo;
2721                    *last_byte >>= self.padding + clo;
2722                    self.nbits-= clo;
2723                    let overflow = self.nbits & 7;
2724                    self.padding = (8 - overflow) & 7;
2725                    self.mask = mask!(overflow);
2726
2727                    return;
2728                } else if !bit && *last_byte != 0 {
2729                    let clz = (*last_byte).leading_zeros() as usize;
2730
2731                    self.nbits = self.nbits + self.padding - clz;
2732                    let overflow = self.nbits & 7;
2733                    self.padding = (8 - overflow) & 7;
2734                    self.mask = mask!(overflow);
2735
2736                    return;
2737                }
2738
2739                i -= 1;
2740            }
2741
2742            let match_byte = if bit { 0xFF } else { 0 };
2743
2744            while i > 0 && *pointer.add(i - 1) == match_byte { i -= 1; }
2745
2746            if i == 0 {
2747                for i in 0..self.size() { *pointer.add(i) = 0; }
2748
2749                self.words.nbytes = 0;
2750                self.nbits = 0;
2751                self.padding = 0;
2752                self.mask = 0xFF;
2753                self.words.shrink_to(0);
2754
2755                return;
2756            }
2757
2758            self.words.shrink_to(i);
2759
2760            let trailing = if bit {
2761                (*pointer.add(i - 1)).leading_ones() as usize
2762            } else {
2763                (*pointer.add(i - 1)).leading_zeros() as usize
2764            };
2765
2766            self.words.nbytes = i;
2767            self.nbits = (i << 3) - trailing;
2768            let overflow = self.nbits & 7;
2769            self.padding = (8 - overflow) & 7;
2770            self.mask = mask!(overflow);
2771            *pointer.add(i - 1) &= self.mask;
2772        }
2773    }
2774
2775    /// Trims trailing bits.
2776    ///
2777    /// # Examples
2778    /// ```
2779    /// # use bit_byte_bit::{Bits};
2780    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2781    ///
2782    /// x1.trim_start(true);
2783    ///
2784    /// assert_eq!(x1.len(), 20);
2785    /// assert_eq!(x1, Bits::from([0x0A, 0x0B, 0x0C]));
2786    ///
2787    /// x1.trim_start(false);
2788    ///
2789    /// assert_eq!(x1.len(), 19);
2790    /// assert_eq!(x1, Bits::from([0x85, 0x05, 0x06]));
2791    ///
2792    /// let mut x2 = Bits::new([0x00, 0x0A, 0x0B]);
2793    ///
2794    /// x2.trim_start(false);
2795    ///
2796    /// assert_eq!(x2.len(), 15);
2797    /// assert_eq!(x2, Bits::slice(&[0x85, 0x05], 15));
2798    ///
2799    /// let mut x3 = Bits::new([0xFF, 0x0B, 0x0C]);
2800    ///
2801    /// x3.trim_start(true);
2802    ///
2803    /// assert_eq!(x3.len(), 14);
2804    /// assert_eq!(x3, Bits::slice(&[0x02, 0x03], 14));
2805    /// ```
2806    pub fn trim_start(&mut self, bit: bool) {
2807        unsafe {
2808            let pointer = self.words.as_ptr_mut();
2809            let last = pointer.add(self.size() - 1);
2810            *last &= self.mask;
2811            let mut i = 0;
2812            let match_byte = if bit { 0xFF } else { 0 };
2813
2814            while i < (self.size() - 1) && *pointer.add(i) == match_byte { i += 1; }
2815
2816
2817            if i == (self.size() - 1) {
2818                if (bit && *last == self.mask) || (!bit && *last == 0)
2819                {
2820                    for i in 0..self.size() { *pointer.add(i) = 0; }
2821
2822                    self.words.nbytes = 0;
2823                    self.nbits = 0;
2824                    self.padding = 0;
2825                    self.mask = 0xFF;
2826
2827                    self.words.shrink_to(0);
2828
2829                    return;
2830                }
2831
2832                let trailing = if bit {
2833                    (*last).trailing_ones()
2834                } else {
2835                    (*last).trailing_zeros()
2836                } as usize;
2837
2838                *pointer = *last >> trailing;
2839
2840                self.padding += trailing;
2841                self.words.nbytes = 1;
2842                self.nbits = 8 - self.padding - trailing;
2843                self.mask = mask!(self.nbits & 7);
2844
2845                self.words.shrink_to(1);
2846
2847                return;
2848            }
2849
2850            ptr::copy(pointer.add(i), pointer, self.size() - i);
2851
2852            self.words.nbytes -= i;
2853            self.nbits -= i << 3;
2854
2855            let trailing = if bit {
2856                (*pointer).trailing_ones()
2857            } else {
2858                (*pointer).trailing_zeros()
2859            } as usize;
2860
2861            if trailing > 0 {
2862                let mask = (1 << trailing) - 1;
2863                let low = 8 - trailing;
2864
2865                self.words.shift_right(self.size(), mask, low, trailing);
2866
2867                self.nbits -= trailing;
2868                let overflow = self.nbits & 7;
2869                self.padding = (8 - overflow) & 7;
2870                self.mask = mask!(overflow);
2871            }
2872
2873            self.shrink_to_fit()
2874        }
2875    }
2876
2877    /// Bitwise exclusive or of two bit strings.
2878    ///
2879    /// # Examples
2880    /// ```
2881    /// # use bit_byte_bit::{Bits};
2882    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
2883    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
2884    ///
2885    /// assert_eq!(x1.xor(&y1), Bits::from([0x80, 0x80, 0x80]));
2886    ///
2887    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
2888    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
2889    ///
2890    /// assert_eq!(x2.len(), 23);
2891    /// assert_eq!(y2.len(), 24);
2892    ///
2893    /// let z = x2.xor(&y2);
2894    ///
2895    /// assert_eq!(z.len(), 24);
2896    /// ```
2897    pub fn xor(&self, rhs: &Bits) -> Bits { bitop!(self, ^, rhs) }
2898
2899    /// Bitwise exclusive or of two bit strings.
2900    ///
2901    /// # Examples
2902    /// ```
2903    /// # use bit_byte_bit::{Bits};
2904    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
2905    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
2906    ///
2907    /// x1.xor_mut(&y1);
2908    ///
2909    /// assert_eq!(x1, Bits::from([0x80, 0x80, 0x80]));
2910    ///
2911    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
2912    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
2913    ///
2914    /// assert_eq!(x2.len(), 23);
2915    /// assert_eq!(y2.len(), 24);
2916    ///
2917    /// x2.xor_mut(&y2);
2918    ///
2919    /// assert_eq!(x2.len(), 24);
2920    /// ```
2921    pub fn xor_mut(&mut self, rhs: &Bits) { bitop!(assign; self, ^=, rhs) }
2922
2923    /// Creates a bit string by copying a range of bits.
2924    ///
2925    /// The range is truncated to take no more than the number of available bits from the
2926    /// starting bound. For alternative behavior, consider [Bits::take], which pads zeros
2927    /// when the length exceeds the number of available bits.
2928    ///
2929    /// # Examples
2930    /// ```
2931    /// # use bit_byte_bit::{Bits};
2932    /// let x1 = Bits::empty();
2933    /// let x1_r1 = x1.xrange(1..18);
2934    ///
2935    /// assert_eq!(x1_r1, Bits::empty());
2936    ///
2937    /// let x2 = Bits::zeros(24);
2938    /// let x2_r1 = x2.xrange(8..24);
2939    /// let x2_r2 = x2.xrange(8..=23);
2940    ///
2941    /// assert_eq!(x2_r1, Bits::zeros(16));
2942    /// assert_eq!(x2_r2, x2_r1);
2943    ///
2944    /// let x3 = Bits::from([0x0A, 0x0B, 0x0C]);
2945    /// let x3_r1 = x3.xrange(1..2);
2946    ///
2947    /// assert_eq!(x3_r1, Bits::from([0x01]));
2948    ///
2949    /// let x3_r2 = x3.xrange(0..);
2950    /// let x3_r3 = x3.xrange(..);
2951    ///
2952    /// assert_eq!(x3_r2, x3);
2953    /// assert_eq!(x3_r3, x3_r2);
2954    ///
2955    /// let x3_r4 = x3.xrange(..32);
2956    ///
2957    /// assert_eq!(x3_r4, Bits::from([0x0A, 0x0B, 0x0C]));
2958    /// assert_eq!(x3_r4.len(), 20);
2959    ///
2960    /// let x3_r5 = x3.xrange(18..32);
2961    ///
2962    /// assert_eq!(x3_r5, Bits::from([0x3]));
2963    /// assert_eq!(x3_r5.len(), 2);
2964    ///
2965    /// let x3_r6 = x3.xrange(8..0);
2966    ///
2967    /// assert_eq!(x3_r6, Bits::empty());
2968    /// ```
2969    pub fn xrange<R: RangeBounds<usize>>(&self, bounds: R) -> Self {
2970        if let Bound::Excluded(&usize::MAX) = bounds.start_bound() {
2971            return Bits::empty();
2972        } else if let Bound::Excluded(&0) = bounds.end_bound() {
2973            return Bits::empty();
2974        }
2975
2976        let start = match bounds.start_bound() {
2977            Bound::Included(n) if *n < self.nbits => *n,
2978            Bound::Unbounded => 0,
2979            Bound::Excluded(n) if *n < self.nbits => *n + 1,
2980            _ => self.nbits,
2981        };
2982
2983        let end = match bounds.end_bound() {
2984            Bound::Excluded(n) if *n < self.nbits => *n,
2985            Bound::Included(n) if *n < self.nbits => *n + 1,
2986            _ => self.nbits,
2987        };
2988
2989        if start >= end {
2990            Bits::empty()
2991        } else {
2992            Bits::take(self.bytes(), start, end - start)
2993        }
2994    }
2995
2996    fn cons_bit(&mut self, nbits: usize, fill: u8) {
2997        unsafe {
2998            let (nbytes_padding, overflow) = divrem8!(ceil; nbits);
2999            let nbytes = self.size() + nbytes_padding;
3000
3001            self.words.expand_to(nbytes);
3002
3003            let pointer = self.words.as_ptr_mut();
3004
3005            if self.size() > 0 { *pointer.add(self.size() - 1) &= self.mask; }
3006
3007            ptr::copy(pointer, pointer.add(nbytes_padding), self.size());
3008
3009            for i in 0..nbytes_padding { ptr::write(pointer.add(i), fill); }
3010
3011            *pointer.add(nbytes_padding - 1) &= mask!(overflow);
3012
3013            if overflow > 0 {
3014                let clz = 8 - overflow;
3015                let mask = (1 << clz) - 1;
3016
3017                self.words.shift_right_from(nbytes_padding, nbytes, mask, overflow, clz);
3018            }
3019
3020            self.words.nbytes = nbytes;
3021            self.nbits += nbits;
3022            let new_overflow = self.nbits & 7;
3023            self.padding = (8 - new_overflow) & 7;
3024            self.mask = mask!(new_overflow);
3025            self.shrink_to_fit();
3026        }
3027    }
3028
3029    fn push_ones(&mut self, count: usize) {
3030        unsafe {
3031            let pointer = self.words.as_ptr_mut();
3032            *pointer.add(self.size() - 1) &= self.mask;
3033            let overflow = self.nbits & 7;
3034
3035            if self.padding > 0 && count <= self.padding {
3036                *pointer.add(self.size() - 1) |= ((1 << count) - 1) << overflow;
3037            } else {
3038                *pointer.add(self.size() - 1) |= ((1 << self.padding) - 1) << overflow;
3039
3040                let (byte_len, overflow) = divrem8!(ceil; count - self.padding);
3041
3042                self.words.expand_to(self.size() + byte_len);
3043
3044                let pointer = self.words.as_ptr_mut().add(self.size());
3045
3046                for i in 0..(byte_len - 1) { ptr::write(pointer.add(i), 0xFF); }
3047
3048                ptr::write(pointer.add(byte_len - 1), mask!(overflow));
3049
3050                self.words.nbytes += byte_len;
3051            }
3052
3053            self.nbits += count;
3054            let overflow = self.nbits & 7;
3055            self.padding = (8 - overflow) & 7;
3056            self.mask = mask!(overflow);
3057        }
3058    }
3059
3060    fn push_zeros(&mut self, count: usize) {
3061        unsafe {
3062            let pointer = self.words.as_ptr_mut();
3063            *pointer.add(self.size() - 1) &= self.mask;
3064
3065            if self.padding == 0 || count > self.padding {
3066                let byte_len = 1 + ((count - self.padding - 1) >> 3);
3067
3068                self.words.expand_to(self.size() + byte_len);
3069
3070                let pointer = self.words.as_ptr_mut().add(self.size());
3071
3072                for i in 0..byte_len { ptr::write(pointer.add(i), 0); }
3073
3074                self.words.nbytes += byte_len;
3075            }
3076
3077            self.nbits += count;
3078            let overflow = self.nbits & 7;
3079            self.padding = (8 - overflow) & 7;
3080            self.mask = mask!(overflow);
3081        }
3082    }
3083
3084    fn shrink_to_fit(&mut self) { self.words.shrink_to(1 + ((self.nbits - 1) >> 3)); }
3085}
3086
3087impl Clone for Bits {
3088    fn clone(&self) -> Self {
3089        match self.size() {
3090            0 => Bits::empty(),
3091            nbytes => unsafe {
3092                let pointer = self.words.as_ptr_mut();
3093                let layout = Layout::array::<u8>(nbytes).unwrap();
3094                let clone = alloc::alloc(layout);
3095
3096                for i in 0..nbytes { ptr::write(clone.add(i), *pointer.add(i)); }
3097
3098                *clone.add(nbytes - 1) &= self.mask;
3099
3100                let bytes = RawBytes { bytes: NonNull::new(clone).unwrap(), cap: nbytes, nbytes };
3101
3102                Bits { words: bytes, mask: self.mask, nbits: self.nbits, padding: self.padding }
3103            }
3104        }
3105    }
3106}
3107
3108impl Drop for Bits {
3109    fn drop(&mut self) {
3110
3111        if self.words.nbytes > 0 {
3112            unsafe {
3113                let pointer = self.words.as_ptr_mut();
3114
3115                for i in 0..self.words.nbytes { ptr::read(pointer.add(i)); }
3116            }
3117        }
3118    }
3119}
3120
3121unsafe impl Send for Bits {}
3122
3123unsafe impl Sync for Bits {}
3124
3125/* Section::Display */
3126
3127impl Binary for Bits {
3128    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
3129        unsafe {
3130            let aptr = self.words.as_ptr_const();
3131
3132            if self.padding == 0 {
3133                for i in (0..self.size()).rev() { write!(f, "{:08b}", *aptr.add(i))?; }
3134            } else {
3135                write!(
3136                    f,
3137                    "{:01$b}",
3138                    *aptr.add(self.size() - 1) & self.mask,
3139                    8 - self.padding
3140                )?;
3141
3142                for i in (0..(self.size() - 1)).rev() {
3143                    write!(f, "{:08b}", *aptr.add(i))?;
3144                }
3145            }
3146
3147            Ok(())
3148        }
3149    }
3150}
3151
3152impl Debug for Bits {
3153    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
3154        write!(f, "Bits<")?;
3155        Binary::fmt(&self, f)?;
3156        write!(f, ": {}>", self.nbits)
3157    }
3158}
3159
3160impl Display for Bits {
3161    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { Binary::fmt(&self, f) }
3162}
3163
3164/* Section::Constructors */
3165
3166impl From<&[u8]> for Bits {
3167    fn from(data: &[u8]) -> Self { Self::from(data.to_vec()) }
3168}
3169
3170impl<const N: usize> From<[u8; N]> for Bits {
3171    fn from(bytes: [u8; N]) -> Self {
3172        let mut nbytes = N;
3173
3174        while nbytes > 0 && bytes[nbytes - 1] == 0 { nbytes -= 1; }
3175
3176        if nbytes == 0 {
3177            Bits::empty()
3178        } else {
3179            let nbits = (nbytes << 3) - (bytes[nbytes - 1].leading_zeros() as usize);
3180            let mut truncated_bytes = bytes[..nbytes].to_vec();
3181            let pointer = truncated_bytes.as_mut_ptr();
3182
3183            std::mem::forget(truncated_bytes);
3184
3185            let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
3186            let overflow = nbits & 7;
3187
3188            Bits { words: bytes, mask: mask!(overflow), nbits, padding: (8 - overflow) & 7 }
3189        }
3190    }
3191}
3192
3193impl From<Vec<u8>> for Bits  {
3194    fn from(mut bytes: Vec<u8>) -> Self {
3195        let mut nbytes = bytes.len();
3196
3197        while nbytes > 0 && bytes[nbytes - 1] == 0 { nbytes -= 1; }
3198
3199        match nbytes {
3200            0 => Bits::empty(),
3201            nbytes => {
3202                let nbits = (nbytes << 3) - (bytes[nbytes - 1].leading_zeros() as usize);
3203
3204                bytes.truncate(nbytes);
3205
3206                let cap = bytes.capacity();
3207                let pointer = bytes.as_mut_ptr();
3208                let overflow = nbits & 7;
3209
3210                std::mem::forget(bytes);
3211
3212                let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap, nbytes };
3213
3214                Bits { words: bytes, mask: mask!(overflow), nbits, padding: (8 - overflow) & 7 }
3215            }
3216        }
3217    }
3218}
3219
3220impl From<&[bool]> for Bits {
3221    /// Creates a bit string from booleans.
3222    ///
3223    /// # Examples
3224    /// ```
3225    /// # use bit_byte_bit::{Bits};
3226    /// let bits1 = vec![true, false, true, true, false, true, true];
3227    /// let x1 = Bits::from(bits1.as_slice());
3228    ///
3229    /// assert_eq!(x1.len(), 7);
3230    /// assert_eq!(x1, Bits::from([0x6D]));
3231    ///
3232    /// let bits2 = vec![true, false, true, false, false, false, false, false, false];
3233    /// let x2 = Bits::from(bits2.as_slice());
3234    ///
3235    /// assert_eq!(x2.len(), 9);
3236    /// assert_eq!(x2, Bits::slice(&[0x05, 0x00], 9));
3237    /// ```
3238    fn from(bits: &[bool]) -> Self {
3239        match bits.len() {
3240            0 => Bits::empty(),
3241            nbits => unsafe {
3242                let (nbytes, overflow) = divrem8!(ceil; nbits);
3243                let padding = (8 - overflow) & 7;
3244                let mask = mask!(overflow);
3245                let layout = Layout::array::<u8>(nbytes).unwrap();
3246                let pointer = alloc::alloc(layout);
3247
3248                for i in 0..(nbytes - 1) {
3249                    let mut b = 0;
3250                    let j = i << 3;
3251
3252                    if bits[j + 0] { b |= 1; }
3253                    if bits[j + 1] { b |= 2; }
3254                    if bits[j + 2] { b |= 4; }
3255                    if bits[j + 3] { b |= 8; }
3256                    if bits[j + 4] { b |= 16; }
3257                    if bits[j + 5] { b |= 32; }
3258                    if bits[j + 6] { b |= 64; }
3259                    if bits[j + 7] { b |= 128; }
3260
3261                    ptr::write(pointer.add(i), b);
3262                }
3263
3264                let mut b = 0;
3265
3266                for i in 0..(8 - padding) {
3267                    if bits[nbits - overflow + i] { b |= 1 << i; }
3268                }
3269
3270                ptr::write(pointer.add(nbytes - 1), b);
3271
3272                let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
3273
3274                Bits { words: bytes, mask, nbits, padding }
3275            }
3276        }
3277    }
3278}
3279
3280impl<const N: usize> From<[bool; N]> for Bits {
3281    /// Creates a bit string from booleans.
3282    ///
3283    /// # Examples
3284    /// ```
3285    /// # use bit_byte_bit::{Bits};
3286    /// let x1 = Bits::from([true, false, true, true, false, true, true]);
3287    ///
3288    /// assert_eq!(x1.len(), 7);
3289    /// assert_eq!(x1, Bits::from([0x6D]));
3290    ///
3291    /// let x2 = Bits::from([true, false, true, false, false, false, false, false, false]);
3292    ///
3293    /// assert_eq!(x2.len(), 9);
3294    /// assert_eq!(x2, Bits::slice(&[0x05, 0x00], 9));
3295    /// ```
3296    fn from(bits: [bool; N]) -> Self { Bits::from(bits.as_slice()) }
3297}
3298
3299impl From<Vec<bool>> for Bits {
3300    /// Creates a bit string from booleans.
3301    ///
3302    /// # Examples
3303    /// ```
3304    /// # use bit_byte_bit::{Bits};
3305    /// let bits1 = vec![true, false, true, true, false, true, true];
3306    /// let x1 = Bits::from(bits1);
3307    ///
3308    /// assert_eq!(x1.len(), 7);
3309    /// assert_eq!(x1, Bits::from([0x6D]));
3310    ///
3311    /// let bits2 = vec![true, false, true, false, false, false, false, false, false];
3312    /// let x2 = Bits::from(bits2);
3313    ///
3314    /// assert_eq!(x2.len(), 9);
3315    /// assert_eq!(x2, Bits::slice(&[0x05, 0x00], 9));
3316    /// ```
3317    fn from(bits: Vec<bool>) -> Self { Bits::from(bits.as_slice()) }
3318}
3319
3320impl FromIterator<u8> for Bits {
3321    fn from_iter<I: IntoIterator<Item=u8>>(iter: I) -> Self {
3322        Bits::from(iter.into_iter().collect::<Vec<u8>>())
3323    }
3324}
3325
3326impl FromIterator<bool> for Bits {
3327    fn from_iter<I: IntoIterator<Item=bool>>(iter: I) -> Self {
3328        Bits::from(iter.into_iter().collect::<Vec<bool>>())
3329    }
3330}
3331
3332/* Section::Order */
3333
3334impl Eq for Bits {}
3335
3336impl Ord for Bits {
3337    /// Compares a bit string with another
3338    ///
3339    /// # Examples
3340    /// ```
3341    /// # use std::cmp::Ordering;
3342    /// # use bit_byte_bit::Bits;
3343    ///
3344    /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
3345    /// let y = Bits::from([0x09, 0x0B, 0x0C]);
3346    /// let z = Bits::from([0x0A, 0x09, 0x0D]);
3347    ///
3348    /// assert_eq!(x.cmp(&y), Ordering::Greater);
3349    /// assert_eq!(x.cmp(&z), Ordering::Less);
3350    /// ```
3351    fn cmp(&self, other: &Self) -> Ordering {
3352        match other.leading_zeros().cmp(&self.leading_zeros()) {
3353            Ordering::Equal => unsafe {
3354                let aptr= self.words.as_ptr_const();
3355                let bptr = other.words.as_ptr_const();
3356
3357                for i in (0..self.size()).rev() {
3358                    match (*aptr.add(i)).cmp(&*bptr.add(i)) {
3359                        Ordering::Equal => (),
3360                        ord => return ord,
3361                    }
3362                }
3363
3364                Ordering::Equal
3365            },
3366            ord => ord,
3367        }
3368    }
3369}
3370
3371impl PartialEq for Bits {
3372    /// Whether two bit strings are equal.
3373    ///
3374    /// # Examples
3375    /// ```
3376    /// # use bit_byte_bit::{Bits};
3377    /// let x = Bits::from([0x20, 0x30, 0x40]);
3378    ///
3379    /// assert!(Bits::eq(&x, &x));
3380    ///
3381    /// let y = Bits::from([0xA0, 0xB0, 0xC0]);
3382    ///
3383    /// assert!(Bits::ne(&x, &y));
3384    ///
3385    /// let z1 = Bits::from([0x20, 0x30, 0x40, 0x00]);
3386    ///
3387    /// assert!(Bits::eq(&x, &z1));
3388    ///
3389    /// let z2 = Bits::new([0x20, 0x30, 0x40, 0x00]);
3390    ///
3391    /// assert!(Bits::ne(&x, &z2));
3392    /// ```
3393    fn eq(&self, other: &Self) -> bool {
3394        match (self.nbits, other.nbits) {
3395            (0, 0) => true,
3396            (a, b) if a != b => false,
3397            _ => unsafe {
3398                let aptr = self.words.as_ptr_const();
3399                let bptr = other.words.as_ptr_const();
3400
3401                for i in 0..(self.size() - 1) {
3402                    if *aptr.add(i) != *bptr.add(i) { return false; }
3403                }
3404
3405                let last_a = *aptr.add(self.size() - 1) & self.mask;
3406                let last_b = *bptr.add(other.size() - 1) & other.mask;
3407
3408                last_a == last_b
3409            }
3410        }
3411    }
3412}
3413
3414impl PartialOrd for Bits {
3415    /// Compares a bit string with another
3416    ///
3417    /// # Examples
3418    /// ```
3419    /// # use std::cmp::Ordering;
3420    /// # use bit_byte_bit::Bits;
3421    ///
3422    /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
3423    /// let y = Bits::from([0x09, 0x0B, 0x0C]);
3424    /// let z = Bits::from([0x0A, 0x09, 0x0D]);
3425    ///
3426    /// assert_eq!(x.partial_cmp(&y), Some(Ordering::Greater));
3427    /// assert_eq!(x.partial_cmp(&z), Some(Ordering::Less));
3428    /// ```
3429    fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(self.cmp(other)) }
3430}
3431
3432/* Section::Iteration */
3433
3434impl IntoIterator for Bits {
3435    type Item = u8;
3436    type IntoIter = IntoBits;
3437
3438    fn into_iter(self) -> Self::IntoIter { IntoBits::new(self, 0) }
3439}
3440
3441
3442struct Bytes {
3443    start: *const u8,
3444    end: *const u8
3445}
3446
3447impl Bytes {
3448    unsafe fn new(slice: &[u8]) -> Self {
3449        Bytes {
3450            start: slice.as_ptr(),
3451            end: if slice.len() == 0 {
3452                slice.as_ptr()
3453            } else {
3454                unsafe{ slice.as_ptr().add(slice.len()) }
3455            }
3456        }
3457    }
3458}
3459
3460impl DoubleEndedIterator for Bytes {
3461    fn next_back(&mut self) -> Option<Self::Item> {
3462        if self.start == self.end {
3463            None
3464        } else {
3465            unsafe {
3466                self.end = self.end.offset(-1);
3467                Some(ptr::read(self.end))
3468            }
3469        }
3470    }
3471}
3472
3473impl ExactSizeIterator for Bytes {
3474    fn len(&self) -> usize { self.end as usize - self.start as usize }
3475}
3476
3477impl FusedIterator for Bytes { }
3478
3479impl Iterator for Bytes {
3480    type Item = u8;
3481
3482    fn next(&mut self) -> Option<u8> {
3483        match self.start == self.end {
3484            true => None,
3485            false => unsafe {
3486                let old_ptr = self.start;
3487                self.start = self.start.add(1);
3488
3489                Some(ptr::read(old_ptr))
3490            }
3491        }
3492    }
3493
3494    fn size_hint(&self) -> (usize, Option<usize>) {
3495        let len = self.end as usize - self.start as usize;
3496
3497        (len, Some(len))
3498    }
3499}
3500
3501
3502pub struct Iter<'a> {
3503    bits: &'a Bits,
3504    index: usize,
3505    exhausted: bool
3506}
3507
3508impl<'a> Iter<'a> {
3509    fn new(bits: &'a Bits, index: usize) -> Self {
3510        Iter { bits, index, exhausted: bits.nbits == index }
3511    }
3512
3513    /// Moves the iterator ahead until the predicate returns true.
3514    ///
3515    /// This method behaves like [Iterator::skip_while], but doesn't
3516    /// rely on repeated calls to [Iterator::next].
3517    pub fn skip_bits_while<P: FnMut(u8) -> bool>(&mut self, mut f: P) -> usize {
3518        if self.exhausted { return 0; }
3519
3520        match (f(0), f(1)) {
3521            (true, true) => {
3522                let rem = self.bits.len() - self.index;
3523
3524                self.index = self.bits.len();
3525                self.exhausted = true;
3526
3527                rem
3528            },
3529            (false, false) => 0,
3530            (z, _) => {
3531                let ct =
3532                    if z { self.bits.trailing_zeros() } else { self.bits.trailing_ones() };
3533
3534                if ct > self.index {
3535                    let skipped = ct - self.index;
3536
3537                    self.index = ct;
3538                    self.exhausted = self.index == self.bits.len();
3539
3540                    skipped
3541                } else {
3542                    0
3543                }
3544            }
3545        }
3546    }
3547
3548    /// Moves the iterator ahead.
3549    ///
3550    /// This method behaves like [Iterator::skip], but doesn't rely on
3551    /// repeated calls to [Iterator::next].
3552    pub fn skip_bits(&mut self, n: usize) {
3553        if self.exhausted {
3554            return;
3555        } else if (self.index + n) >= self.bits.len() {
3556            self.index = self.bits.len();
3557            self.exhausted = true;
3558        } else {
3559            self.index += n;
3560        }
3561    }
3562}
3563
3564impl<'a> DoubleEndedIterator for Iter<'a> {
3565    fn next_back(&mut self) -> Option<Self::Item> {
3566        if self.index == 0 {
3567            None
3568        } else {
3569            self.index -= 1;
3570            self.exhausted = false;
3571
3572            Some(self.bits.i(self.index))
3573        }
3574    }
3575
3576    fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
3577        if self.index < n {
3578            None
3579        } else {
3580            self.index -= n;
3581            self.exhausted = false;
3582
3583            Some(self.bits.i(self.index))
3584        }
3585    }
3586}
3587
3588impl<'a> ExactSizeIterator for Iter<'a> {
3589    fn len(&self) -> usize { self.bits.len() - self.index }
3590}
3591
3592impl<'a> FusedIterator for Iter<'a> { }
3593
3594impl<'a> Iterator for Iter<'a> {
3595    type Item = u8;
3596
3597    fn next(&mut self) -> Option<Self::Item> {
3598        match self.exhausted {
3599            true => None,
3600            false => {
3601                let bit = self.bits.i(self.index);
3602                self.index += 1;
3603                self.exhausted = self.bits.len() == self.index;
3604
3605                Some(bit)
3606            }
3607        }
3608    }
3609
3610    fn size_hint(&self) -> (usize, Option<usize>) {
3611        let rem = self.bits.len() - self.index;
3612
3613        (rem, Some(rem))
3614    }
3615
3616    fn count(mut self) -> usize {
3617        let rem = self.bits.len() - self.index;
3618
3619        self.index = self.bits.len();
3620        self.exhausted = true;
3621
3622        rem
3623    }
3624
3625    fn last(mut self) -> Option<u8> {
3626        if self.exhausted {
3627            None
3628        } else {
3629            let bit = self.bits.i(self.bits.len() - 1);
3630
3631            self.index = self.bits.len();
3632            self.exhausted = true;
3633
3634            Some(bit)
3635        }
3636    }
3637
3638    fn nth(&mut self, n: usize) -> Option<u8> {
3639        if self.exhausted {
3640            None
3641        } else if self.index + n >= self.bits.len() {
3642            self.index = self.bits.len();
3643            self.exhausted = true;
3644
3645            None
3646        } else {
3647            let bit = self.bits.i(self.index + n);
3648            self.index += n + 1;
3649            self.exhausted = self.index == self.bits.len();
3650
3651            Some(bit)
3652        }
3653    }
3654}
3655
3656
3657pub struct IntoBits {
3658    bits: Bits,
3659    index: usize,
3660    exhausted: bool
3661}
3662
3663impl IntoBits {
3664    fn new(bits: Bits, index: usize) -> Self {
3665        let exhausted = bits.nbits == index;
3666
3667        IntoBits { bits, index, exhausted }
3668    }
3669
3670    /// Moves the iterator ahead until the predicate returns true.
3671    ///
3672    /// This method behaves like [Iterator::skip_while], but doesn't
3673    /// rely on repeated calls to [Iterator::next], instead on the
3674    /// return values to `f(0)` and `f(1)`.
3675    pub fn skip_bits_while<P: FnMut(u8) -> bool>(&mut self, mut f: P) -> usize {
3676        if self.exhausted { return 0; }
3677
3678        match (f(0), f(1)) {
3679            (true, true) => {
3680                let rem = self.bits.len() - self.index;
3681
3682                self.index = self.bits.len();
3683                self.exhausted = true;
3684
3685                rem
3686            },
3687            (false, false) => 0,
3688            (z, _) => {
3689                let ct =
3690                    if z { self.bits.trailing_zeros() } else { self.bits.trailing_ones() };
3691
3692                if ct > self.index {
3693                    let skipped = ct - self.index;
3694
3695                    self.index = ct;
3696                    self.exhausted = self.index == self.bits.len();
3697
3698                    skipped
3699                } else {
3700                    0
3701                }
3702            }
3703        }
3704    }
3705
3706    /// Moves the iterator ahead.
3707    ///
3708    /// This method behaves like [Iterator::skip], but doesn't rely on
3709    /// repeated calls to [Iterator::next].
3710    pub fn skip_bits(&mut self, n: usize) {
3711        if self.exhausted {
3712            return;
3713        } else if (self.index + n) >= self.bits.len() {
3714            self.index = self.bits.len();
3715            self.exhausted = true;
3716        } else {
3717            self.index += n;
3718        }
3719    }
3720}
3721
3722impl DoubleEndedIterator for IntoBits {
3723    fn next_back(&mut self) -> Option<Self::Item> {
3724        if self.index == 0 {
3725            None
3726        } else {
3727            self.index -= 1;
3728            self.exhausted = false;
3729
3730            Some(self.bits.i(self.index))
3731        }
3732    }
3733
3734    fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
3735        if self.index < n {
3736            None
3737        } else {
3738            self.index -= n;
3739            self.exhausted = false;
3740
3741            Some(self.bits.i(self.index))
3742        }
3743    }
3744}
3745
3746impl ExactSizeIterator for IntoBits {
3747    fn len(&self) -> usize { self.bits.len() - self.index }
3748}
3749
3750impl FusedIterator for IntoBits { }
3751
3752impl Iterator for IntoBits {
3753    type Item = u8;
3754
3755    fn next(&mut self) -> Option<Self::Item> {
3756        match self.exhausted {
3757            true => None,
3758            false => {
3759                let bit = self.bits.i(self.index);
3760                self.index += 1;
3761                self.exhausted = self.bits.len() == self.index;
3762
3763                Some(bit)
3764            }
3765        }
3766    }
3767
3768    fn size_hint(&self) -> (usize, Option<usize>) {
3769        let rem = self.bits.len() - self.index;
3770
3771        (rem, Some(rem))
3772    }
3773
3774    fn count(mut self) -> usize {
3775        let rem = self.bits.len() - self.index;
3776
3777        self.index = self.bits.len();
3778        self.exhausted = true;
3779
3780        rem
3781    }
3782
3783    fn last(mut self) -> Option<u8> {
3784        if self.exhausted {
3785            None
3786        } else {
3787            let bit = self.bits.i(self.bits.len() - 1);
3788
3789            self.index = self.bits.len();
3790            self.exhausted = true;
3791
3792            Some(bit)
3793        }
3794    }
3795
3796    fn nth(&mut self, n: usize) -> Option<u8> {
3797        if self.exhausted {
3798            None
3799        } else if self.index + n >= self.bits.len() {
3800            self.index = self.bits.len();
3801            self.exhausted = true;
3802
3803            None
3804        } else {
3805            let bit = self.bits.i(self.index + n);
3806            self.index += n + 1;
3807            self.exhausted = self.index == self.bits.len();
3808
3809            Some(bit)
3810        }
3811    }
3812}
3813
3814
3815pub struct IntoBytes {
3816    _bytes: RawBytes,
3817    iter: Bytes
3818}
3819
3820impl DoubleEndedIterator for IntoBytes {
3821    fn next_back(&mut self) -> Option<Self::Item> { self.iter.next_back() }
3822}
3823
3824impl Drop for IntoBytes {
3825    fn drop(&mut self) { for _ in &mut *self { } }
3826}
3827
3828impl ExactSizeIterator for IntoBytes {
3829    fn len(&self) -> usize { self.iter.len() }
3830}
3831
3832impl FusedIterator for IntoBytes { }
3833
3834impl Iterator for IntoBytes {
3835    type Item = u8;
3836
3837    fn next(&mut self) -> Option<u8> { self.iter.next() }
3838
3839    fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
3840}
3841
3842
3843/* Section::Operators */
3844
3845impl BitAnd for Bits {
3846    type Output = Self;
3847
3848    /// Bitwise and of two bit strings.
3849    ///
3850    /// # Examples
3851    /// ```
3852    /// # use bit_byte_bit::{Bits};
3853    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
3854    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3855    ///
3856    /// assert_eq!(x1 & y1, Bits::new([0x20, 0x30, 0x40]));
3857    ///
3858    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
3859    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3860    ///
3861    /// assert_eq!(x2.len(), 23);
3862    /// assert_eq!(y2.len(), 24);
3863    ///
3864    /// let z = x2 & y2;
3865    ///
3866    /// assert_eq!(z.len(), 24);
3867    /// ```
3868    fn bitand(self, rhs: Self) -> Self::Output { self.and(&rhs) }
3869}
3870
3871impl BitAnd<&Bits> for Bits {
3872    type Output = Bits;
3873
3874    /// Bitwise and of two bit strings.
3875    ///
3876    /// # Examples
3877    /// ```
3878    /// # use bit_byte_bit::{Bits};
3879    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
3880    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3881    ///
3882    /// assert_eq!(x1 & &y1, Bits::new([0x20, 0x30, 0x40]));
3883    ///
3884    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
3885    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3886    ///
3887    /// assert_eq!(x2.len(), 23);
3888    /// assert_eq!(y2.len(), 24);
3889    ///
3890    /// let z = x2 & &y2;
3891    ///
3892    /// assert_eq!(z.len(), 24);
3893    /// ```
3894    fn bitand(self, rhs: &Bits) -> Self::Output { self.and(rhs) }
3895}
3896
3897impl BitAnd<&Bits> for &Bits {
3898    type Output = Bits;
3899
3900    /// Bitwise and of two bit strings.
3901    ///
3902    /// # Examples
3903    /// ```
3904    /// # use bit_byte_bit::{Bits};
3905    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
3906    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3907    ///
3908    /// assert_eq!(x1 & &y1, Bits::new([0x20, 0x30, 0x40]));
3909    ///
3910    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
3911    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3912    ///
3913    /// assert_eq!(x2.len(), 23);
3914    /// assert_eq!(y2.len(), 24);
3915    ///
3916    /// let z = x2 & &y2;
3917    ///
3918    /// assert_eq!(z.len(), 24);
3919    /// ```
3920    fn bitand(self, rhs: &Bits) -> Self::Output { self.and(rhs) }
3921}
3922
3923impl BitAndAssign for Bits {
3924    /// Bitwise and of two bit strings.
3925    ///
3926    /// # Examples
3927    /// ```
3928    /// # use bit_byte_bit::{Bits};
3929    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
3930    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3931    ///
3932    /// x1 &= y1;
3933    ///
3934    /// assert_eq!(x1, Bits::new([0x20, 0x30, 0x40]));
3935    ///
3936    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
3937    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3938    ///
3939    /// assert_eq!(x2.len(), 23);
3940    /// assert_eq!(y2.len(), 24);
3941    ///
3942    /// x2 &= y2;
3943    ///
3944    /// assert_eq!(x2.len(), 24);
3945    /// ```
3946    fn bitand_assign(&mut self, rhs: Self) { self.and_mut(&rhs); }
3947}
3948
3949impl BitAndAssign<&Bits> for Bits {
3950    /// Bitwise and of two bit strings.
3951    ///
3952    /// # Examples
3953    /// ```
3954    /// # use bit_byte_bit::{Bits};
3955    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
3956    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3957    ///
3958    /// x1 &= &y1;
3959    ///
3960    /// assert_eq!(x1, Bits::new([0x20, 0x30, 0x40]));
3961    ///
3962    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
3963    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3964    ///
3965    /// assert_eq!(x2.len(), 23);
3966    /// assert_eq!(y2.len(), 24);
3967    ///
3968    /// x2 &= &y2;
3969    ///
3970    /// assert_eq!(x2.len(), 24);
3971    /// ```
3972    fn bitand_assign(&mut self, rhs: &Bits) { self.and_mut(rhs); }
3973}
3974
3975impl BitOr for Bits {
3976    type Output = Self;
3977
3978    /// Bitwise or of two bit strings.
3979    ///
3980    /// # Examples
3981    /// ```
3982    /// # use bit_byte_bit::{Bits};
3983    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
3984    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3985    ///
3986    /// assert_eq!(x1 | y1, Bits::from([0xA0, 0xB0, 0xC0]));
3987    ///
3988    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
3989    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3990    ///
3991    /// assert_eq!(x2.len(), 23);
3992    /// assert_eq!(y2.len(), 24);
3993    ///
3994    /// let z = x2 | y2;
3995    ///
3996    /// assert_eq!(z.len(), 24);
3997    /// ```
3998    fn bitor(self, rhs: Self) -> Self::Output { self.or(&rhs) }
3999}
4000
4001impl BitOr<&Bits> for Bits {
4002    type Output = Bits;
4003
4004    /// Bitwise or of two bit strings.
4005    ///
4006    /// # Examples
4007    /// ```
4008    /// # use bit_byte_bit::{Bits};
4009    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
4010    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4011    ///
4012    /// assert_eq!(x1 | &y1, Bits::from([0xA0, 0xB0, 0xC0]));
4013    ///
4014    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
4015    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4016    ///
4017    /// assert_eq!(x2.len(), 23);
4018    /// assert_eq!(y2.len(), 24);
4019    ///
4020    /// let z = x2 | &y2;
4021    ///
4022    /// assert_eq!(z.len(), 24);
4023    /// ```
4024    fn bitor(self, rhs: &Bits) -> Self::Output { self.or(rhs) }
4025}
4026
4027impl BitOr<&Bits> for &Bits {
4028    type Output = Bits;
4029
4030    /// Bitwise or of two bit strings.
4031    ///
4032    /// # Examples
4033    /// ```
4034    /// # use bit_byte_bit::{Bits};
4035    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
4036    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4037    ///
4038    /// assert_eq!(x1 | &y1, Bits::from([0xA0, 0xB0, 0xC0]));
4039    ///
4040    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
4041    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4042    ///
4043    /// assert_eq!(x2.len(), 23);
4044    /// assert_eq!(y2.len(), 24);
4045    ///
4046    /// let z = x2 | &y2;
4047    ///
4048    /// assert_eq!(z.len(), 24);
4049    /// ```
4050    fn bitor(self, rhs: &Bits) -> Self::Output { self.or(rhs) }
4051}
4052
4053impl BitOrAssign for Bits {
4054    /// Bitwise or of two bit strings.
4055    ///
4056    /// # Examples
4057    /// ```
4058    /// # use bit_byte_bit::{Bits};
4059    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
4060    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4061    ///
4062    /// x1 |= y1;
4063    ///
4064    /// assert_eq!(x1, Bits::from([0xA0, 0xB0, 0xC0]));
4065    ///
4066    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
4067    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4068    ///
4069    /// assert_eq!(x2.len(), 23);
4070    /// assert_eq!(y2.len(), 24);
4071    ///
4072    /// x2 |= y2;
4073    ///
4074    /// assert_eq!(x2.len(), 24);
4075    /// ```
4076    fn bitor_assign(&mut self, rhs: Self) { self.or_mut(&rhs); }
4077}
4078
4079impl BitOrAssign<&Bits> for Bits {
4080    /// Bitwise or of two bit strings.
4081    ///
4082    /// # Examples
4083    /// ```
4084    /// # use bit_byte_bit::{Bits};
4085    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
4086    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4087    ///
4088    /// x1 |= &y1;
4089    ///
4090    /// assert_eq!(x1, Bits::from([0xA0, 0xB0, 0xC0]));
4091    ///
4092    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
4093    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4094    ///
4095    /// assert_eq!(x2.len(), 23);
4096    /// assert_eq!(y2.len(), 24);
4097    ///
4098    /// x2 |= &y2;
4099    ///
4100    /// assert_eq!(x2.len(), 24);
4101    /// ```
4102    fn bitor_assign(&mut self, rhs: &Bits) { self.or_mut(rhs); }
4103}
4104
4105impl BitXor for Bits {
4106    type Output = Self;
4107
4108    /// Bitwise exclusive or of two bit strings.
4109    ///
4110    /// # Examples
4111    /// ```
4112    /// # use bit_byte_bit::{Bits};
4113    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
4114    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4115    ///
4116    /// assert_eq!(x1 ^ y1, Bits::from([0x80, 0x80, 0x80]));
4117    ///
4118    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
4119    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4120    ///
4121    /// assert_eq!(x2.len(), 23);
4122    /// assert_eq!(y2.len(), 24);
4123    ///
4124    /// let z = x2 ^ y2;
4125    ///
4126    /// assert_eq!(z.len(), 24);
4127    /// ```
4128    fn bitxor(self, rhs: Self) -> Self::Output { self.xor(&rhs) }
4129}
4130
4131impl BitXor<&Bits> for Bits {
4132    type Output = Bits;
4133
4134    /// Bitwise exclusive or of two bit strings.
4135    ///
4136    /// # Examples
4137    /// ```
4138    /// # use bit_byte_bit::{Bits};
4139    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
4140    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4141    ///
4142    /// assert_eq!(x1 ^ &y1, Bits::from([0x80, 0x80, 0x80]));
4143    ///
4144    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
4145    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4146    ///
4147    /// assert_eq!(x2.len(), 23);
4148    /// assert_eq!(y2.len(), 24);
4149    ///
4150    /// let z = x2 ^ &y2;
4151    ///
4152    /// assert_eq!(z.len(), 24);
4153    /// ```
4154    fn bitxor(self, rhs: &Bits) -> Self::Output { self.xor(&rhs) }
4155}
4156
4157impl BitXor<&Bits> for &Bits {
4158    type Output = Bits;
4159
4160    /// Bitwise exclusive or of two bit strings.
4161    ///
4162    /// # Examples
4163    /// ```
4164    /// # use bit_byte_bit::{Bits};
4165    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
4166    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4167    ///
4168    /// assert_eq!(x1 ^ &y1, Bits::from([0x80, 0x80, 0x80]));
4169    ///
4170    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
4171    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4172    ///
4173    /// assert_eq!(x2.len(), 23);
4174    /// assert_eq!(y2.len(), 24);
4175    ///
4176    /// let z = x2 ^ &y2;
4177    ///
4178    /// assert_eq!(z.len(), 24);
4179    /// ```
4180    fn bitxor(self, rhs: &Bits) -> Self::Output { self.xor(&rhs) }
4181}
4182
4183impl BitXorAssign for Bits {
4184    /// Bitwise exclusive or of two bit strings.
4185    ///
4186    /// # Examples
4187    /// ```
4188    /// # use bit_byte_bit::{Bits};
4189    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
4190    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4191    ///
4192    /// x1 ^= y1;
4193    ///
4194    /// assert_eq!(x1, Bits::from([0x80, 0x80, 0x80]));
4195    ///
4196    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
4197    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4198    ///
4199    /// assert_eq!(x2.len(), 23);
4200    /// assert_eq!(y2.len(), 24);
4201    ///
4202    /// x2 ^= y2;
4203    ///
4204    /// assert_eq!(x2.len(), 24);
4205    /// ```
4206    fn bitxor_assign(&mut self, rhs: Self) { self.xor_mut(&rhs); }
4207}
4208
4209impl BitXorAssign<&Bits> for Bits {
4210    /// Bitwise exclusive or of two bit strings.
4211    ///
4212    /// # Examples
4213    /// ```
4214    /// # use bit_byte_bit::{Bits};
4215    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
4216    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4217    ///
4218    /// x1 ^= &y1;
4219    ///
4220    /// assert_eq!(x1, Bits::from([0x80, 0x80, 0x80]));
4221    ///
4222    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
4223    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4224    ///
4225    /// assert_eq!(x2.len(), 23);
4226    /// assert_eq!(y2.len(), 24);
4227    ///
4228    /// x2 ^= &y2;
4229    ///
4230    /// assert_eq!(x2.len(), 24);
4231    /// ```
4232    fn bitxor_assign(&mut self, rhs: &Bits) { self.xor_mut(&rhs); }
4233}
4234
4235impl Div<usize> for Bits {
4236    type Output = (Bits, Bits);
4237
4238    fn div(self, index: usize) -> Self::Output { self.split(index) }
4239}
4240
4241impl Not for Bits {
4242    type Output = Self;
4243
4244    /// Flips every bit.
4245    ///
4246    /// # Examples
4247    /// ```
4248    /// # use bit_byte_bit::{Bits};
4249    /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
4250    ///
4251    /// assert_eq!(!x, Bits::slice(&[0xF5, 0xF4, 0x03], 20));
4252    /// ```
4253    fn not(self) -> Self::Output { self.complement() }
4254}
4255
4256impl Not for &Bits {
4257    type Output = Bits;
4258
4259    /// Flips every bit.
4260    ///
4261    /// # Examples
4262    /// ```
4263    /// # use bit_byte_bit::{Bits};
4264    /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
4265    ///
4266    /// assert_eq!(!&x, Bits::slice(&[0xF5, 0xF4, 0x03], 20));
4267    /// ```
4268    fn not(self) -> Self::Output { self.complement() }
4269}
4270
4271impl Shl<usize> for Bits {
4272    type Output = Self;
4273
4274    /// Shifts out upper bits, shifting in zeros on the lower end.
4275    ///
4276    /// # Examples
4277    /// ```
4278    /// # use bit_byte_bit::{Bits};
4279    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4280    /// let s1 = x1 << 17;
4281    ///
4282    /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4283    /// assert_eq!(s1.len(), 20);
4284    ///
4285    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4286    /// let s2 = x2 << 4;
4287    ///
4288    /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
4289    /// assert_eq!(s2.len(), 24);
4290    /// ```
4291    fn shl(self, count: usize) -> Self::Output { self.shifted_left(count) }
4292}
4293
4294impl Shl<usize> for &Bits {
4295    type Output = Bits;
4296
4297    /// Shifts out upper bits, shifting in zeros on the lower end.
4298    ///
4299    /// # Examples
4300    /// ```
4301    /// # use bit_byte_bit::{Bits};
4302    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4303    /// let s1 = &x1 << 17;
4304    ///
4305    /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4306    /// assert_eq!(s1.len(), x1.len());
4307    ///
4308    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4309    /// let s2 = &x2 << 4;
4310    ///
4311    /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
4312    /// assert_eq!(s2.len(), x2.len());
4313    /// ```
4314    fn shl(self, count: usize) -> Self::Output { self.shifted_left(count) }
4315}
4316
4317impl Shl<&usize> for Bits {
4318    type Output = Self;
4319
4320    /// Shifts out upper bits, shifting in zeros on the lower end.
4321    ///
4322    /// # Examples
4323    /// ```
4324    /// # use bit_byte_bit::{Bits};
4325    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4326    /// let s1 = x1 << &17;
4327    ///
4328    /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4329    /// assert_eq!(s1.len(), 20);
4330    ///
4331    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4332    /// let s2 = x2 << &4;
4333    ///
4334    /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
4335    /// assert_eq!(s2.len(), 24);
4336    /// ```
4337    fn shl(self, count: &usize) -> Self::Output { self.shifted_left(*count) }
4338}
4339
4340impl Shl<&usize> for &Bits {
4341    type Output = Bits;
4342
4343    /// Shifts out upper bits, shifting in zeros on the lower end.
4344    ///
4345    /// # Examples
4346    /// ```
4347    /// # use bit_byte_bit::{Bits};
4348    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4349    /// let s1 = &x1 << &17;
4350    ///
4351    /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4352    /// assert_eq!(s1.len(), x1.len());
4353    ///
4354    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4355    /// let s2 = &x2 << &4;
4356    ///
4357    /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
4358    /// assert_eq!(s2.len(), x2.len());
4359    /// ```
4360    fn shl(self, count: &usize) -> Self::Output { self.shifted_left(*count) }
4361}
4362
4363impl ShlAssign<usize> for Bits {
4364    /// Shifts out upper bits, shifting in zeros on the lower end.
4365    ///
4366    /// # Examples
4367    /// ```
4368    /// # use bit_byte_bit::{Bits};
4369    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4370    ///
4371    /// x1 <<= 17;
4372    ///
4373    /// assert_eq!(x1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4374    /// assert_eq!(x1.len(), 20);
4375    ///
4376    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4377    ///
4378    /// x2 <<= 4;
4379    ///
4380    /// assert_eq!(x2, Bits::new([0xA0, 0xB0, 0xC0]));
4381    /// assert_eq!(x2.len(), 24);
4382    /// ```
4383    fn shl_assign(&mut self, count: usize) { self.shift_left(count); }
4384}
4385
4386impl ShlAssign<&usize> for Bits {
4387    /// Shifts out upper bits, shifting in zeros on the lower end.
4388    ///
4389    /// # Examples
4390    /// ```
4391    /// # use bit_byte_bit::{Bits};
4392    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4393    ///
4394    /// x1 <<= &17;
4395    ///
4396    /// assert_eq!(x1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4397    /// assert_eq!(x1.len(), 20);
4398    ///
4399    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4400    ///
4401    /// x2 <<= &4;
4402    ///
4403    /// assert_eq!(x2, Bits::new([0xA0, 0xB0, 0xC0]));
4404    /// assert_eq!(x2.len(), 24);
4405    /// ```
4406    fn shl_assign(&mut self, count: &usize) { self.shift_left(*count); }
4407}
4408
4409impl Shr<usize> for Bits {
4410    type Output = Self;
4411
4412    /// Shifts out lower bits, shifting zeros into the upper bits.
4413    ///
4414    /// # Examples
4415    /// ```
4416    /// # use bit_byte_bit::{Bits};
4417    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4418    /// let s1 = x1 >> 17;
4419    ///
4420    /// assert_eq!(s1.len(), 20);
4421    /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4422    ///
4423    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4424    /// let s2 = x2 >> 4;
4425    ///
4426    /// assert_eq!(s2.len(), 24);
4427    /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
4428    /// ```
4429    fn shr(self, count: usize) -> Self::Output { self.shifted_right(count) }
4430}
4431
4432impl Shr<usize> for &Bits {
4433    type Output = Bits;
4434
4435    /// Shifts out lower bits, shifting zeros into the upper bits.
4436    ///
4437    /// # Examples
4438    /// ```
4439    /// # use bit_byte_bit::{Bits};
4440    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4441    /// let s1 = &x1 >> 17;
4442    ///
4443    /// assert_eq!(s1.len(), x1.len());
4444    /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4445    ///
4446    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4447    /// let s2 = &x2 >> 4;
4448    ///
4449    /// assert_eq!(s2.len(), x2.len());
4450    /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
4451    /// ```
4452    fn shr(self, count: usize) -> Self::Output { self.shifted_right(count) }
4453}
4454
4455impl Shr<&usize> for Bits {
4456    type Output = Self;
4457
4458    /// Shifts out lower bits, shifting zeros into the upper bits.
4459    ///
4460    /// # Examples
4461    /// ```
4462    /// # use bit_byte_bit::{Bits};
4463    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4464    /// let s1 = x1 >> &17;
4465    ///
4466    /// assert_eq!(s1.len(), 20);
4467    /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4468    ///
4469    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4470    /// let s2 = x2 >> &4;
4471    ///
4472    /// assert_eq!(s2.len(), 24);
4473    /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
4474    /// ```
4475    fn shr(self, count: &usize) -> Self::Output { self.shifted_right(*count) }
4476}
4477
4478impl Shr<&usize> for &Bits {
4479    type Output = Bits;
4480
4481    /// Shifts out lower bits, shifting zeros into the upper bits.
4482    ///
4483    /// # Examples
4484    /// ```
4485    /// # use bit_byte_bit::{Bits};
4486    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4487    /// let s1 = &x1 >> &17;
4488    ///
4489    /// assert_eq!(s1.len(), x1.len());
4490    /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4491    ///
4492    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4493    /// let s2 = &x2 >> &4;
4494    ///
4495    /// assert_eq!(s2.len(), 24);
4496    /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
4497    /// ```
4498    fn shr(self, count: &usize) -> Self::Output { self.shifted_right(*count) }
4499}
4500
4501impl ShrAssign<usize> for Bits {
4502    /// Shifts out lower bits, shifting zeros into the upper bits.
4503    ///
4504    /// # Examples
4505    /// ```
4506    /// # use bit_byte_bit::{Bits};
4507    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4508    ///
4509    /// x1 >>= 17;
4510    ///
4511    /// assert_eq!(x1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4512    /// assert_eq!(x1.len(), 20);
4513    ///
4514    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4515    ///
4516    /// x2 >>= 4;
4517    ///
4518    /// assert_eq!(x2, Bits::new([0xB0, 0xC0, 0x00]));
4519    /// assert_eq!(x2.len(), 24);
4520    /// ```
4521    fn shr_assign(&mut self, count: usize) { self.shift_right(count); }
4522}
4523
4524impl ShrAssign<&usize> for Bits {
4525    /// Shifts out lower bits, shifting zeros into the upper bits.
4526    ///
4527    /// # Examples
4528    /// ```
4529    /// # use bit_byte_bit::{Bits};
4530    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4531    ///
4532    /// x1 >>= &17;
4533    ///
4534    /// assert_eq!(x1.len(), 20);
4535    /// assert_eq!(x1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4536    ///
4537    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4538    ///
4539    /// x2 >>= &4;
4540    ///
4541    /// assert_eq!(x2.len(), 24);
4542    /// assert_eq!(x2, Bits::new([0xB0, 0xC0, 0x00]));
4543    /// ```
4544    fn shr_assign(&mut self, count: &usize) { self.shift_right(*count); }
4545}
4546
4547
4548/* Section::Macro */
4549
4550
4551/// Macro implementing a subset of the [Bits] constructors
4552///
4553/// Example
4554/// ```
4555/// # use bit_byte_bit::{Bits, bits};
4556/// let x1 = bits![];
4557///
4558/// assert_eq!(x1, Bits::empty());
4559///
4560/// let x2 = bits![0x0A, 0x0B, 0x0C];
4561///
4562/// assert_eq!(x2, Bits::new([0x0A, 0x0B, 0x0C]));
4563///
4564/// let x3 = bits![0x0A, 0x0B, 0x0C; => 16];
4565///
4566/// assert_eq!(x3, Bits::aligned(16, [0x0A, 0x0B, 0x0C]));
4567///
4568/// let x4 = bits![0x0A, 0x0B, 0x0C; %];
4569///
4570/// assert_eq!(x4, Bits::packed([0x0A, 0x0B, 0x0C]));
4571///
4572/// let x5 = bits![1; 17];
4573///
4574/// assert_eq!(x5, Bits::ones(17));
4575///
4576/// let x6 = bits![0; 17];
4577///
4578/// assert_eq!(x6, Bits::zeros(17));
4579/// assert_eq!(x6.len(), 17);
4580///
4581/// let x7 = bits![8; 0; 17];
4582///
4583/// assert_eq!(x7, Bits::new(vec![0; 17]));
4584/// assert_eq!(x7.len(), 136);
4585/// ```
4586#[macro_export]
4587macro_rules! bits {
4588    () => { Bits::empty() };
4589    (0; $n:expr) => { Bits::zeros($n) };
4590    (1; $n:expr) => { Bits::ones($n) };
4591    (8; $byte:expr; $n:expr) => { Bits::new(vec![$byte; $n]) };
4592    ($($byte:expr),+ $(,)?) => {{ Bits::new(vec![$($byte),+]) }};
4593    ($($byte:expr),+; => $n:expr) => { Bits::aligned($n, vec![$($byte),+]) };
4594    ($($byte:expr),+; %) => { Bits::packed(vec![$($byte),+]) };
4595}
4596
4597/// Packs up to 64 bits as a given integral type.
4598///
4599/// `$bytes` is a byte array large enough to pack `min($length_in_bits, 64)` bits. When
4600/// `$bytes` is an array of values that can be cast as `$int`, the result is
4601/// input-dependent.`$int` is an integral type large enough to hold a value with
4602/// `min($length_in_bits, 64)` bits.
4603///
4604/// In some cases, it could be more efficient to use one of the unrolled forms,
4605/// over the general one. This is because the general case first tries
4606/// to figure out which version of the unrolled code to use.
4607///
4608/// # Example
4609/// ```
4610/// # use bit_byte_bit::{pack_to_int};
4611/// let bytes = [0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF];
4612/// let bytes_u64 = [0x01u64, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF];
4613/// let pack_usize = pack_to_int!(usize; bytes; 17);
4614///
4615/// assert_eq!(pack_usize, 0x12301);
4616///
4617/// let pack_u64_general = pack_to_int!(u64; bytes; 48);
4618///
4619/// let pack_u64_general_u64 = pack_to_int!(bytes_u64; 48);
4620///
4621/// let pack_u64_unrolled = pack_to_int!(u64;
4622///     bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5]
4623/// );
4624///
4625/// let pack_u64_unrolled_u64 = pack_to_int!(
4626///     bytes_u64[0], bytes_u64[1], bytes_u64[2], bytes_u64[3], bytes_u64[4], bytes_u64[5]
4627/// );
4628///
4629/// let pack_u64_unrolled_bytes = pack_to_int!(u64;
4630///     0x01, 0x23, 0x45, 0x67, 0x89, 0xAB
4631/// );
4632///
4633/// let pack_u64_unrolled_u64_bytes = pack_to_int!(
4634///     0x01u64, 0x23, 0x45, 0x67, 0x89, 0xAB
4635/// );
4636///
4637/// assert_eq!(pack_u64_general, 0xAB8967452301);
4638/// assert_eq!(pack_u64_general, pack_u64_general_u64);
4639/// assert_eq!(pack_u64_general, pack_u64_unrolled);
4640/// assert_eq!(pack_u64_general, pack_u64_unrolled_u64);
4641/// assert_eq!(pack_u64_general, pack_u64_unrolled_bytes);
4642/// assert_eq!(pack_u64_general, pack_u64_unrolled_u64_bytes);
4643/// ```
4644///
4645/// ```should_panic
4646/// # use bit_byte_bit::{pack_to_int};
4647/// let bytes = vec![0x01, 0x23];
4648///
4649/// // panics since `bytes.len() == 2` and 8 bytes are expected
4650/// let pack_u16 = pack_to_int!(u64; bytes; 64);
4651/// ```
4652
4653/// ```should_panic
4654/// # use bit_byte_bit::{pack_to_int};
4655/// let bytes = [0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF];
4656///
4657/// // panics because of eventual left shift with overflow due to treating a
4658/// // u16 value as if it had 64 bits.
4659/// let pack_u16 = pack_to_int!(u16; bytes; 64);
4660/// ```
4661#[macro_export]
4662macro_rules! pack_to_int {
4663    ($int:ty; $bytes:expr; $length_in_bits:expr) =>{{
4664        if $length_in_bits == 0 {
4665            0
4666        } else {
4667            let (sat_length, mask) = if $length_in_bits >= 64 {
4668                (64, 0xFFFFFFFFFFFFFFFFu64 as $int)
4669            } else {
4670                ($length_in_bits, ((1u64 << $length_in_bits) - 1) as $int)
4671            };
4672
4673            let packed = match sat_length {
4674                n if n <= 8 => $bytes[0] as $int,
4675                n if n <= 16 => pack_to_int!($int; $bytes[0], $bytes[1]),
4676                n if n <= 24 => pack_to_int!($int; $bytes[0], $bytes[1], $bytes[2]),
4677                n if n <= 32 => pack_to_int!($int; $bytes[0], $bytes[1], $bytes[2], $bytes[3]),
4678                n if n <= 40 => pack_to_int!($int;
4679                    $bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4]
4680                ),
4681                n if n <= 48 => pack_to_int!($int;
4682                    $bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4], $bytes[5]
4683                ),
4684                n if n <= 56 => pack_to_int!($int;
4685                    $bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4], $bytes[5], $bytes[6]
4686                ),
4687                _ => pack_to_int!($int;
4688                    $bytes[0], $bytes[1], $bytes[2], $bytes[3],
4689                    $bytes[4], $bytes[5], $bytes[6], $bytes[7]
4690                )
4691            };
4692
4693            packed & mask
4694        }
4695    }};
4696    ($ty:ty; $b0:expr, $b1:expr) =>{ ($b0 as $ty) | (($b1 as $ty) << 8) };
4697    ($ty:ty; $b0:expr, $b1:expr, $b2:expr) => {
4698        pack_to_int!($ty; $b0, $b1) | (($b2 as $ty) << 16)
4699    };
4700    ($ty:ty; $b0:expr, $b1:expr, $b2:expr, $b3:expr) => {
4701        pack_to_int!($ty; $b0, $b1, $b2) | (($b3 as $ty) << 24)
4702    };
4703    ($ty:ty; $b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr) => {
4704        pack_to_int!($ty; $b0, $b1, $b2, $b3) | (($b4 as $ty) << 32)
4705    };
4706    ($ty:ty; $b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr) => {
4707        pack_to_int!($ty; $b0, $b1, $b2, $b3, $b4) | (($b5 as $ty) << 40)
4708    };
4709    ($ty:ty; $b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr, $b6:expr) => {
4710        pack_to_int!($ty; $b0, $b1, $b2, $b3, $b4, $b5) | (($b6 as $ty) << 48)
4711    };
4712    ($ty:ty; $b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr, $b6:expr, $b7:expr) => {
4713        pack_to_int!($ty; $b0, $b1, $b2, $b3, $b4, $b5, $b6) | (($b7 as $ty) << 56)
4714    };
4715    ($bytes:expr; $length_in_bits:expr) =>{{
4716        if $length_in_bits == 0 {
4717            0
4718        } else {
4719            let (sat_length, mask) = if $length_in_bits >= 64 {
4720                (64, 0xFFFFFFFFFFFFFFFFu64)
4721            } else {
4722                ($length_in_bits, ((1 << $length_in_bits) - 1))
4723            };
4724
4725            let packed = match sat_length {
4726                n if n <= 8 => $bytes[0],
4727                n if n <= 16 => pack_to_int!($bytes[0], $bytes[1]),
4728                n if n <= 24 => pack_to_int!($bytes[0], $bytes[1], $bytes[2]),
4729                n if n <= 32 => pack_to_int!($bytes[0], $bytes[1], $bytes[2], $bytes[3]),
4730                n if n <= 40 => pack_to_int!($bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4]),
4731                n if n <= 48 => pack_to_int!(
4732                    $bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4], $bytes[5]
4733                ),
4734                n if n <= 56 => pack_to_int!(
4735                    $bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4], $bytes[5], $bytes[6]
4736                ),
4737                _ => pack_to_int!(
4738                    $bytes[0], $bytes[1], $bytes[2], $bytes[3],
4739                    $bytes[4], $bytes[5], $bytes[6], $bytes[7]
4740                )
4741            };
4742
4743            packed & mask
4744        }
4745    }};
4746    ($b0:expr, $b1:expr) =>{ $b0 | ( $b1 << 8) };
4747    ($b0:expr, $b1:expr, $b2:expr) => { pack_to_int!($b0, $b1) | ($b2 << 16) };
4748    ($b0:expr, $b1:expr, $b2:expr, $b3:expr) => { pack_to_int!($b0, $b1, $b2) | ($b3 << 24) };
4749    ($b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr) => { 
4750        pack_to_int!($b0, $b1, $b2, $b3) | ($b4 << 32)
4751    };
4752    ($b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr) => {
4753        pack_to_int!($b0, $b1, $b2, $b3, $b4) | ($b5 << 40)
4754    };
4755    ($b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr, $b6:expr) => {
4756        pack_to_int!($b0, $b1, $b2, $b3, $b4, $b5) | ($b6 << 48)
4757    };
4758    ($b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr, $b6:expr, $b7:expr) => {
4759        pack_to_int!($b0, $b1, $b2, $b3, $b4, $b5, $b6) | ($b7 << 56)
4760    }
4761}