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 ^ &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_as, 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//! let bits = Bits::new([0xBA, 0xDC, 0xFE]);
159//! let shorts = bits_as::vec_i16(&bits);
160//! let mut shorts_iter = shorts.into_iter();
161//! 
162//! assert_eq!(shorts_iter.next(), Some(0xDCBAu16 as i16));
163//! assert_eq!(shorts_iter.next(), Some(0xFFFEu16 as i16));
164//! 
165//! let ushorts = Vec::<u16>::from(bits);
166//! let mut ushorts_iter = ushorts.into_iter();
167//! 
168//! assert_eq!(ushorts_iter.next(), Some(0xDCBA));
169//! assert_eq!(ushorts_iter.next(), Some(0x00FE));
170//! ```
171
172mod scheme;
173mod conversion;
174mod operators;
175mod iteration;
176mod bytes;
177
178pub use scheme::*;
179pub use conversion::*;
180pub use iteration::*;
181
182
183use std::ptr::NonNull;
184use std::{alloc, ptr};
185use std::alloc::Layout;
186use std::cmp::Ordering;
187use std::fmt::{Binary, Debug, Display, Formatter};
188use std::ops::{Bound, Deref, Div, RangeBounds};
189
190use bytes::RawBytes;
191
192
193/// Macro implementing a subset of the [Bits] constructors
194///
195/// Example
196/// ```
197/// # use bit_byte_bit::{Bits, bits};
198/// let x1 = bits![];
199///
200/// assert_eq!(x1, Bits::empty());
201///
202/// let x2 = bits![0x0A, 0x0B, 0x0C];
203///
204/// assert_eq!(x2, Bits::new([0x0A, 0x0B, 0x0C]));
205///
206/// let x3 = bits![0x0A, 0x0B, 0x0C; => 16];
207///
208/// assert_eq!(x3, Bits::aligned(16, [0x0A, 0x0B, 0x0C]));
209///
210/// let x4 = bits![0x0A, 0x0B, 0x0C; %];
211///
212/// assert_eq!(x4, Bits::packed([0x0A, 0x0B, 0x0C]));
213///
214/// let x5 = bits![1; 17];
215///
216/// assert_eq!(x5, Bits::ones(17));
217///
218/// let x6 = bits![0; 17];
219///
220/// assert_eq!(x6, Bits::zeros(17));
221/// assert_eq!(x6.len(), 17);
222///
223/// let x7 = bits![8; 0; 17];
224///
225/// assert_eq!(x7, Bits::new(vec![0; 17]));
226/// assert_eq!(x7.len(), 136);
227/// ```
228#[macro_export]
229macro_rules! bits {
230    () => { Bits::empty() };
231    (0; $n:expr) => { Bits::zeros($n) };
232    (1; $n:expr) => { Bits::ones($n) };
233    (8; $byte:expr; $n:expr) => { Bits::new(vec![$byte; $n]) };
234    ($($byte:expr),+ $(,)?) => {{ Bits::new(vec![$($byte),+]) }};
235    ($($byte:expr),+; => $n:expr) => { Bits::aligned($n, vec![$($byte),+]) };
236    ($($byte:expr),+; %) => { Bits::packed(vec![$($byte),+]) };
237}
238
239macro_rules! bitop {
240    ($self:expr, $op:tt, $rhs:expr) => {
241        unsafe {
242            let (mut min, mut nbytes, mut nbits) = ($self.size(), $rhs.size(), $rhs.nbits);
243            let (mut padding, mut mask) = ($rhs.padding, $rhs.mask);
244            let aptr = $self.words.as_ptr_const();
245            let bptr = $rhs.words.as_ptr_const();
246
247            if $rhs.nbits < $self.nbits {
248                (min, nbytes, nbits) = ($rhs.size(), $self.size(), $self.nbits);
249                (padding, mask) = ($self.padding, $self.mask);
250            }
251
252            let layout = Layout::array::<u8>(nbytes).unwrap();
253            let result = alloc::alloc(layout);
254
255            for i in 0..min { ptr::write(result.add(i), *aptr.add(i) $op *bptr.add(i)); }
256
257            match $self.size().cmp(&$rhs.size()) {
258                Ordering::Greater => for i in $rhs.size()..$self.size() {
259                    ptr::write(result.add(i), *aptr.add(i))
260                },
261                Ordering::Less => for i in $self.size()..$rhs.size() {
262                    ptr::write(result.add(i), *bptr.add(i));
263                },
264                _ => ()
265            }
266
267            *result.add(nbytes - 1) &= mask;
268
269            let bytes = RawBytes { bytes: NonNull::new(result).unwrap(), cap: nbytes, nbytes };
270
271            Bits { words:bytes, mask, nbits, padding }
272        }
273    };
274    (assign; $self:expr, $op:tt, $rhs:expr) => {
275        unsafe {
276            let aptr = $self.words.as_ptr_mut();
277            let bptr = $rhs.words.as_ptr_const();
278            let (lsize, rsize) = ($self.size(), $rhs.size());
279            let min = if rsize < lsize { rsize } else { lsize };
280
281            for i in 0..min { *aptr.add(i) $op *bptr.add(i); }
282
283            if $self.nbits < $rhs.nbits {
284                let aptr = $self.words.as_ptr_mut();
285
286                $self.words.expand_to(rsize);
287
288                for i in lsize..rsize { ptr::write(aptr.add(i), *bptr.add(i)); }
289
290                $self.mask = $rhs.mask;
291                $self.nbits = $rhs.nbits;
292                $self.words.nbytes = rsize;
293                $self.padding = $rhs.padding;
294
295                if lsize > 0 { *aptr.add(lsize - 1) &= $self.mask; }
296            }
297        }
298    };
299}
300
301macro_rules! divrem8 {
302    ($n:expr) => { ($n >> 3, $n & 7) };
303    (ceil; $n:expr) => { (1 + (($n - 1) >> 3), $n & 7) };
304}
305
306macro_rules! mask {
307    ($shift:expr) => {
308        if $shift == 0 { 0xFF } else { ((1 << $shift) - 1) as u8 }
309    };
310}
311
312macro_rules! pointer {
313    ($size:expr) => {{
314        let layout = Layout::array::<u8>($size).unwrap();
315
316        assert!(layout.size() <= isize::MAX as usize, "Allocation too large");
317
318        let pointer = alloc::alloc(layout);
319
320        pointer
321    }};
322    ($fill:expr; $size:expr) => {{
323        let layout = Layout::array::<u8>($size).unwrap();
324
325        assert!(layout.size() <= isize::MAX as usize, "Allocation too large");
326
327        let pointer = alloc::alloc(layout);
328
329        for i in 0..$size { ptr::write(pointer.add(i), $fill); }
330
331        pointer
332    }};
333}
334
335
336pub(crate) fn get_bits(src: &[u8], start: usize, length: usize) -> Vec<u8> {
337    let nbytes_src = src.len();
338    let (start_byte, start_idx) = divrem8!(start);
339    let (nbytes, overflow) = divrem8!(ceil; length);
340    let mut bytes = vec![0; nbytes];
341    let take_all = nbytes >= (nbytes_src - start_byte);
342
343    if start_idx > 0 {
344        let shift_mask = (1 << start_idx) - 1;
345        let upper_length = 8 - start_idx;
346        let end_byte = if take_all { nbytes_src - 1 } else { start_byte + nbytes };
347
348        for i in start_byte..end_byte {
349            bytes[i - start_byte] = src[i] >> start_idx;
350            bytes[i - start_byte] |= (src[i + 1] & shift_mask) << upper_length;
351        }
352
353        if take_all { bytes[nbytes_src - start_byte - 1] = src[nbytes_src - 1] >> start_idx; }
354    } else {
355        let end_byte = if take_all { nbytes_src } else { nbytes };
356
357        for i in start_byte..end_byte { bytes[i - start_byte] = src[i] }
358    }
359
360    bytes[nbytes - 1] &= mask!(overflow);
361
362    bytes
363}
364
365fn trim(mut bytes: Vec<u8>) -> Vec<u8> {
366    let (mut upper_bound, mut i) = (bytes.len().saturating_sub(1), 0);
367
368    while i < upper_bound {
369        if bytes[i] == 0 {
370            bytes.remove(i);
371            upper_bound -= 1;
372        } else {
373            let clz = bytes[i].leading_zeros() as usize;
374
375            if clz > 0 {
376                let (mask, low) = ((1 << clz) - 1, 8 - clz);
377
378                bytes[i] |= (bytes[i + 1] & mask) << low;
379                bytes[i + 1] >>= clz;
380
381                if bytes[i + 1] == 0 {
382                    bytes.remove(i + 1);
383                    upper_bound -= 1;
384
385                    if bytes[i].leading_zeros() == 0 { i += 1; }
386                } else {
387                    i += 1;
388                }
389            } else {
390                i += 1;
391            }
392        }
393    }
394
395    bytes
396}
397
398
399pub struct Bits {
400    words: RawBytes,
401    mask: u8,
402    nbits: usize,
403    padding: usize,
404}
405
406impl Bits {
407    /// Creates a bit string from a sequence of bytes.
408    ///
409    /// # Examples
410    /// ```
411    /// # use bit_byte_bit::{Bits};
412    /// let mut x = Bits::new([0x0A, 0x0B, 0x0C, 0x00]);
413    ///
414    /// assert_eq!(x.len(), 32);
415    /// ```
416    pub fn new<I: IntoIterator<Item = u8>>(bits: I) -> Self {
417        let mut bytes = bits.into_iter().collect::<Vec<u8>>();
418
419        match bytes.len() {
420            0 => Bits::empty(),
421            nbytes => {
422                bytes.shrink_to(nbytes);
423
424                let cap = bytes.capacity();
425                let pointer = bytes.as_mut_ptr();
426
427                std::mem::forget(bytes);
428
429                let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap, nbytes };
430
431                Bits { words: bytes, mask: 0xFF, nbits: nbytes << 3, padding: 0 }
432            }
433        }
434    }
435
436    /// Creates a bit string with an aligned length.
437    ///
438    /// # Examples
439    /// ```
440    /// # use bit_byte_bit::{Bits};
441    /// let mut x = Bits::aligned(17, [0x0A, 0x0B, 0x0C]);
442    ///
443    /// assert_eq!(x.len(), 34);
444    /// assert_eq!(x, Bits::slice(&[0x0A, 0x0B, 0x0C, 0x00, 0x00], 34));
445    /// ```
446    pub fn aligned<I: IntoIterator<Item = u8>>(units: usize, bits: I) -> Self {
447        match units {
448            0 => Bits::empty(),
449            1 => Bits::from_iter(bits),
450            8 => Bits::new(bits),
451            units => {
452                let mut bytes = bits.into_iter().collect::<Vec<u8>>();
453                let mut nbits = bytes.len() << 3;
454                let overflow = nbits % units;
455
456                if overflow > 0 {
457                    nbits += units - overflow;
458
459                    for _ in 0..(1 + ((units - 1) >> 3)) { bytes.push(0); }
460                }
461
462                let nbytes = bytes.len();
463
464                if nbytes == 0 {
465                    Bits::empty()
466                } else {
467                    bytes.shrink_to(nbytes);
468
469                    let cap = bytes.capacity();
470                    let pointer = bytes.as_mut_ptr();
471
472                    std::mem::forget(bytes);
473
474                    let overflow = nbits & 7;
475
476                    let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap, nbytes };
477
478                    Bits { words: bytes, mask: mask!(overflow), nbits, padding: (8 - overflow) & 7 }
479                }
480            }
481        }
482    }
483
484    /// Creates an empty bit string.
485    ///
486    /// # Examples
487    /// ```
488    /// # use bit_byte_bit::{Bits};
489    /// let mut x = Bits::empty();
490    ///
491    /// assert_eq!(x.len(), 0);
492    /// ```
493    pub fn empty() -> Self {
494        let bytes = RawBytes { bytes: NonNull::dangling(), cap: 0, nbytes: 0 };
495
496        Bits { words: bytes, mask: 0xFF, nbits: 0, padding: 0 }
497    }
498
499    /// Creates a bit string of ones.
500    ///
501    /// # Examples
502    /// ```
503    /// # use bit_byte_bit::{Bits};
504    /// let mut x = Bits::ones(4);
505    ///
506    /// assert_eq!(x.len(), 4);
507    /// assert_eq!(x, Bits::from([0x0F]));
508    /// ```
509    pub fn ones(length: usize) -> Self {
510        match length {
511            0 => Bits::empty(),
512            length => unsafe {
513                let nbytes = 1 + ((length - 1) >> 3);
514                let overflow = length & 7;
515                let padding = (8 - overflow) & 7;
516                let mask = mask!(overflow);
517                let pointer = pointer![0xFFu8; nbytes];
518
519                *pointer.add(nbytes - 1) &= mask;
520
521                let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
522
523                Bits { words: bytes, mask, nbits: length, padding }
524            }
525        }
526    }
527
528    /// Creates a bit string by concatenating a slice of bytes removing leading zeros.
529    ///
530    /// # Examples
531    /// ```
532    /// # use bit_byte_bit::{Bits};
533    /// let x1 = Bits::packed([0x00, 0x00, 0x00]);
534    ///
535    /// assert_eq!(x1, Bits::empty());
536    ///
537    /// let x2 = Bits::packed([0x0A, 0x0B, 0x0C]);
538    ///
539    /// assert_eq!(x2, Bits::from([0xBA, 0x0C]));
540    /// assert_eq!(x2.len(), 12);
541    /// ```
542    pub fn packed<I: IntoIterator<Item = u8>>(bytes: I) -> Self {
543        Bits::from(trim(bytes.into_iter().collect::<Vec<u8>>()))
544    }
545
546    /// Creates a bit string by copying a given number of bits from a slice of bytes.
547    ///
548    /// When the length is greater than the available number of bits in the source,
549    /// the result is padded with zeros.
550    ///
551    /// # Examples
552    /// ```
553    /// # use bit_byte_bit::{Bits};
554    /// let x1 = Bits::slice(&[], 17);
555    ///
556    /// assert_eq!(x1, Bits::zeros(17));
557    ///
558    /// let x2 = Bits::slice(&[0x0A, 0x0B, 0x0C], 0);
559    ///
560    /// assert_eq!(x2, Bits::empty());
561    ///
562    /// let x3 = Bits::slice(&[0x0A, 0x0B, 0x0C], 19);
563    ///
564    /// assert_eq!(x3, Bits::from([0x0A, 0x0B, 0x04]));
565    ///
566    /// let x4 = Bits::slice(&[0x00, 0x00, 0x00], 19);
567    ///
568    /// assert_eq!(x4, Bits::zeros(19));
569    /// ```
570    pub fn slice(src: &[u8], length: usize) -> Self { Bits::take(src, 0, length) }
571
572    /// Creates a bit string by copying a given range of bits from a slice of bytes.
573    ///
574    /// When the length is greater than the available number of bits in the source,
575    /// the result is padded with zeros.
576    ///
577    /// # Examples
578    /// ```
579    /// # use bit_byte_bit::{Bits};
580    /// let x1 = Bits::take(&[], 1, 17);
581    ///
582    /// assert_eq!(x1, Bits::zeros(17));
583    ///
584    /// let x2 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 0);
585    ///
586    /// assert_eq!(x2, Bits::empty());
587    ///
588    /// let x3 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 1);
589    ///
590    /// assert_eq!(x3, Bits::from([0x01]));
591    ///
592    /// let x4 = Bits::take(&[0x0A, 0x0B, 0x0C], 25, 17);
593    ///
594    /// assert_eq!(x4, Bits::zeros(17));
595    ///
596    /// let x5 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 17);
597    ///
598    /// assert_eq!(x5.bytes().to_vec(), vec![0x85, 0x05, 0x00]);
599    ///
600    /// let x6 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 16);
601    ///
602    /// assert_eq!(x6.bytes().to_vec(), vec![0x85, 0x05]);
603    ///
604    /// let x7 = Bits::take(&[0x00, 0x00, 0x00], 1, 17);
605    ///
606    /// assert_eq!(x7, Bits::zeros(17));
607    /// ```
608    pub fn take(src: &[u8], start: usize, length: usize) -> Self {
609        if length == 0 { return Bits::empty(); }
610
611        let nbytes_src = src.len();
612
613        if nbytes_src == 0 || start >= (nbytes_src << 3) { return Bits::zeros(length); }
614
615        let (nbytes, overflow) = divrem8!(ceil; length);
616        let mut bytes = get_bits(src, start, length);
617        let pointer = bytes.as_mut_ptr();
618
619        std::mem::forget(bytes);
620
621        let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
622
623        Bits { words: bytes, mask: mask!(overflow), nbits: length, padding: (8 - overflow) & 7 }
624    }
625
626    /// Creates a bit string of zeros.
627    ///
628    /// # Examples
629    /// ```
630    /// # use bit_byte_bit::{Bits};
631    /// let mut x = Bits::zeros(4);
632    ///
633    /// assert_eq!(x.len(), 4);
634    /// assert_eq!(x, Bits::from([false, false, false, false]));
635    /// ```
636    pub fn zeros(length: usize) -> Self {
637        match length {
638            0 => Bits::empty(),
639            length => unsafe {
640                let nbytes = 1 + ((length - 1) >> 3);
641                let overflow = length & 7;
642                let padding = (8 - overflow) & 7;
643                let mask = mask!(overflow);
644                let pointer = pointer![0u8; nbytes];
645                let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
646
647                Bits { words: bytes, mask, nbits: length, padding }
648            }
649        }
650    }
651
652    /// Pads a bit string until the length is a multiple of the given unit.
653    ///
654    /// # Examples
655    /// ```
656    /// # use bit_byte_bit::{Bits};
657    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
658    ///
659    /// x.align(16);
660    ///
661    /// assert_eq!(x, Bits::new([0x0A, 0x0B, 0x0C, 0x00]));
662    /// assert_eq!(x.len(), 32);
663    /// ```
664    pub fn align(&mut self, unit: usize) {
665        match unit {
666            0 | 1 => (),
667            8 => {
668                self.nbits = self.size() << 3;
669                self.padding = 0;
670            },
671            unit if (self.nbits % unit) == 0 => (),
672            unit => self.push_zeros(unit - (self.nbits % unit))
673        }
674    }
675
676    /// Whether all bits are one.
677    ///
678    /// # Examples
679    /// ```
680    /// # use bit_byte_bit::{Bits};
681    /// let x1 = Bits::empty();
682    ///
683    /// assert!(x1.all());
684    ///
685    /// let x2 = Bits::from([0x0F]);
686    ///
687    /// assert!(x2.all());
688    ///
689    /// let x3 = Bits::new([0x0F]);
690    ///
691    /// assert!(!x3.all());
692    pub fn all(&self) -> bool {
693        match self.size() {
694            0 => true,
695            n => unsafe {
696                let pointer = self.words.as_ptr_const();
697
698                for i in 0..(n - 1) {
699                    if *pointer.add(i) != 0xFF { return false; }
700                }
701
702                (*pointer.add(n - 1) & self.mask) == self.mask
703            }
704        }
705    }
706
707    /// Bitwise and of two bit strings.
708    ///
709    /// # Examples
710    /// ```
711    /// # use bit_byte_bit::{Bits};
712    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
713    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
714    ///
715    /// assert_eq!(x1.and(&y1), Bits::new([0x20, 0x30, 0x40]));
716    ///
717    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
718    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
719    ///
720    /// assert_eq!(x2.len(), 23);
721    /// assert_eq!(y2.len(), 24);
722    ///
723    /// let z = x2.and(&y2);
724    ///
725    /// assert_eq!(z.len(), 24);
726    /// ```
727    pub fn and(&self, rhs: &Bits) -> Bits {
728        unsafe {
729            let (mut min, mut nbytes) = (self.size(), rhs.size());
730            let mut nbits = rhs.nbits;
731            let (mut padding, mut mask) = (rhs.padding, rhs.mask);
732            let aptr = self.words.as_ptr_const();
733            let bptr = rhs.words.as_ptr_const();
734
735            if rhs.nbits < self.nbits {
736                (min, nbytes, nbits) = (rhs.size(), self.size(), self.nbits);
737                (padding, mask) = (self.padding, self.mask);
738            }
739
740            let layout = Layout::array::<u8>(nbytes).unwrap();
741            let result = alloc::alloc(layout);
742
743            for i in 0..min {
744                ptr::write(result.add(i), *aptr.add(i) & *bptr.add(i));
745            }
746
747            for i in min..nbytes { ptr::write(result.add(i), 0); }
748
749            *result.add(nbytes - 1) &= mask;
750
751            let bytes = RawBytes { bytes: NonNull::new(result).unwrap(), cap: nbytes, nbytes };
752
753            Bits { words: bytes, mask, nbits, padding }
754        }
755    }
756
757    /// Bitwise and of two bit strings.
758    ///
759    /// # Examples
760    /// ```
761    /// # use bit_byte_bit::{Bits};
762    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
763    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
764    ///
765    /// x1.and_mut(&y1);
766    ///
767    /// assert_eq!(x1, Bits::new([0x20, 0x30, 0x40]));
768    ///
769    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
770    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
771    ///
772    /// assert_eq!(x2.len(), 23);
773    /// assert_eq!(y2.len(), 24);
774    ///
775    /// x2.and_mut(&y2);
776    ///
777    /// assert_eq!(x2.len(), 24);
778    /// ```
779    pub fn and_mut(&mut self, rhs: &Bits) {
780        match self.size().cmp(&rhs.size()) {
781            Ordering::Equal => unsafe {
782                let aptr = self.words.as_ptr_mut();
783                let bptr = self.words.as_ptr_const();
784                let last_a = *aptr.add(self.size() - 1) & self.mask;
785                let last_b = *bptr.add(rhs.size() - 1) & rhs.mask;
786
787                for i in 0..(self.size() - 1) { *aptr.add(i) &= *bptr.add(i); }
788
789                *aptr.add(self.size() - 1) = last_a & last_b;
790            },
791            Ordering::Less => unsafe {
792                self.words.expand_to(rhs.size());
793
794                let aptr = self.words.as_ptr_mut();
795                let bptr = self.words.as_ptr_const();
796                let last_a = *aptr.add(self.size() - 1) & self.mask;
797
798                for i in 0..(self.size() - 1) { *aptr.add(i) &= *bptr.add(i); }
799
800                *aptr.add(self.size() - 1) = last_a & *bptr.add(self.size() - 1);
801
802                for i in self.size()..rhs.size() { ptr::write(aptr.add(i), 0); }
803            },
804            Ordering::Greater => unsafe {
805                let aptr = self.words.as_ptr_mut();
806                let bptr = self.words.as_ptr_const();
807
808                for i in 0..(rhs.size() - 1) { *aptr.add(i) &= *bptr.add(i); }
809
810                *aptr.add(rhs.size() - 1) &= *bptr.add(rhs.size() - 1) & rhs.mask;
811
812                for i in rhs.size()..self.size() { *aptr.add(i) = 0; }
813            }
814        }
815
816        if self.nbits < rhs.nbits {
817            self.nbits = rhs.nbits;
818            self.words.nbytes = rhs.size();
819            self.padding = rhs.padding;
820            self.mask = rhs.mask;
821        }
822    }
823
824    /// Whether at least one bit is one.
825    ///
826    /// # Examples
827    /// ```
828    /// # use bit_byte_bit::{Bits};
829    /// let x1 = Bits::empty();
830    ///
831    /// assert!(!x1.any());
832    ///
833    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
834    ///
835    /// assert!(x2.any());
836    ///
837    /// let x3 = Bits::zeros(20);
838    ///
839    /// assert!(!x3.any());
840    pub fn any(&self) -> bool { self.nbits > 0 && self.bytes().iter().any(|&b| b > 0u8) }
841
842    /// State of a byte.
843    ///
844    /// # Examples
845    /// ```
846    /// # use bit_byte_bit::{Bits};
847    /// let mut x = Bits::from([0x0A, 0x0B]);
848    ///
849    /// assert_eq!(x.byte(0), 0x0A);
850    /// assert_eq!(x.byte(1), 0x0B);
851    /// ```
852    ///
853    /// ```should_panic
854    /// # use bit_byte_bit::{Bits};
855    /// let mut x = Bits::from([0x0A, 0x0B]);
856    ///
857    /// assert_eq!(x.byte(2), 0x0C);
858    pub fn byte(&self, i: usize) -> u8 {
859        assert!(i < self.size(), "Index out of bounds");
860
861        unsafe { *self.words.as_ptr_const().add(i) }
862    }
863
864    /// Underlying bytes
865    ///
866    /// # Example
867    /// ```
868    /// # use bit_byte_bit::{Bits};
869    /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
870    /// let y = x.bytes().iter().cloned().collect::<Vec<u8>>();
871    ///
872    /// assert_eq!(y, vec![0xAB, 0xCD, 0xEF]);
873    /// ```
874    pub fn bytes(&self) -> &[u8] { self.words.deref() }
875
876    /// Flips every bit.
877    ///
878    /// # Examples
879    /// ```
880    /// # use bit_byte_bit::{Bits};
881    /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
882    ///
883    /// assert_eq!(x.complement(), Bits::slice(&[0xF5, 0xF4, 0x03], 20));
884    /// ```
885    pub fn complement(&self) -> Bits {
886        match self.size() {
887            0 => Bits::empty(),
888            nbytes => unsafe {
889                let pointer = self.words.as_ptr_mut();
890                let layout = Layout::array::<u8>(nbytes).unwrap();
891                let clone = alloc::alloc(layout);
892
893                for i in 0..nbytes { ptr::write(clone.add(i), !*pointer.add(i)); }
894
895                *clone.add(nbytes - 1) &= self.mask;
896
897                let bytes = RawBytes { bytes: NonNull::new(clone).unwrap(), cap: nbytes, nbytes };
898
899                Bits { words: bytes, mask: self.mask, nbits: self.nbits, padding: self.padding }
900            }
901        }
902    }
903
904    /// Flips every bit.
905    ///
906    /// # Examples
907    /// ```
908    /// # use bit_byte_bit::{Bits};
909    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
910    ///
911    /// x1.complement_mut();
912    ///
913    /// assert_eq!(x1, Bits::slice(&[0xF5, 0xF4, 0x03], 20));
914    /// ```
915    pub fn complement_mut(&mut self) {
916        unsafe {
917            let aptr = self.words.as_ptr_mut();
918
919            for i in 0..self.size() { *aptr.add(i) = !*aptr.add(i); }
920
921            *aptr.add(self.size() - 1) &= self.mask;
922        }
923    }
924
925    /// Shifts out upper bits.
926    ///
927    /// # Examples
928    /// ```
929    /// # use bit_byte_bit::{Bits};
930    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
931    ///
932    /// x1.consume_left(4);
933    /// assert_eq!(x1.len(), 16);
934    /// assert_eq!(x1, Bits::new([0x0A, 0x0B]));
935    ///
936    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
937    ///
938    /// x2.consume_left(4);
939    /// assert_eq!(x2.len(), 20);
940    /// assert_eq!(x2, Bits::from([0x0A, 0x0B, 0x0C]));
941    /// ```
942    pub fn consume_left(&mut self, count: usize) {
943        match (self.size(), count) {
944            (0, _) | (_, 0) => (),
945            (n, count) if count >= self.nbits => unsafe {
946                let pointer = self.words.as_ptr_mut();
947
948                for i in 0..n { *pointer.add(i) = 0; }
949            },
950            (n, count) => {
951                let (extra, byte_len) = (count & 7, count >> 3);
952
953                if byte_len > 0 {
954                    unsafe {
955                        let pointer = self.words.as_ptr_mut();
956
957                        for i in (n - byte_len)..n { ptr::read(pointer.add(i)); }
958
959                        self.words.nbytes -= byte_len;
960
961                        *pointer.add(self.size() - 1) &= self.mask;
962                    }
963                }
964
965                if extra > 0 {
966                    unsafe {
967                        let overflow = 8 - self.padding;
968                        let pointer = self.words.as_ptr_mut();
969
970                        let mask = match extra.cmp(&overflow) {
971                            Ordering::Less => (1 << (overflow - extra)) - 1,
972                            Ordering::Greater => (1 << (8 + overflow - extra)) - 1,
973                            Ordering::Equal => 0,
974                        };
975
976                        *pointer.add(self.size() - 1) &= mask;
977                    }
978                }
979
980                self.nbits -= count;
981                let overflow = self.nbits & 7;
982                self.padding = (8 - overflow) & 7;
983                self.mask = mask!(overflow);
984
985                self.shrink_to_fit();
986
987                unsafe { *self.words.as_ptr_mut().add(self.size() - 1) &= self.mask; }
988            }
989        }
990    }
991
992    /// Shifts out lower bits.
993    ///
994    /// # Examples
995    /// ```
996    /// # use bit_byte_bit::{Bits};
997    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
998    ///
999    /// x1.consume_right(4);
1000    ///
1001    /// assert_eq!(x1, Bits::from([0xB0, 0xC0]));
1002    /// assert_eq!(x1.len(), 16);
1003    ///
1004    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1005    ///
1006    /// x2.consume_right(4);
1007    ///
1008    /// assert_eq!(x2, Bits::slice(&[0xB0, 0xC0, 0x00], 20));
1009    /// assert_eq!(x2.len(), 20);
1010    /// ```
1011    pub fn consume_right(&mut self, count: usize) {
1012        match (self.size(), count) {
1013            (0, _) | (_, 0) => (),
1014            (_, count) if count >= self.nbits => {
1015                self.words.shrink_to(0);
1016                self.nbits = 0;
1017                self.padding = 0;
1018            },
1019            (_, count) => {
1020                unsafe {
1021                    let shift_bytes = count >> 3;
1022                    let pointer = self.words.as_ptr_mut();
1023
1024                    ptr::copy(pointer.add(shift_bytes), pointer, self.size() - shift_bytes);
1025
1026                    self.words.shrink_to(self.size() - shift_bytes);
1027
1028                    self.words.nbytes -= shift_bytes;
1029                    self.nbits -= count;
1030                    let new_overflow = self.nbits & 7;
1031                    self.padding = 8 - new_overflow;
1032                    self.mask = mask!(new_overflow);
1033
1034                    let count_overflow = count & 7;
1035
1036                    if count_overflow > 0 {
1037                        self.words.shift_right(
1038                            self.size(),
1039                            (1 << count_overflow) - 1,
1040                            8 - count_overflow,
1041                            count_overflow
1042                        );
1043
1044                        self.shrink_to_fit();
1045                    }
1046                }
1047            }
1048        }
1049    }
1050
1051    /// The number of zeros.
1052    ///
1053    /// # Examples
1054    /// ```
1055    /// # use bit_byte_bit::{Bits};
1056    /// let mut x = Bits::from([15, 15, 15]);
1057    ///
1058    /// assert_eq!(x.count_zeros(), 8);
1059    ///
1060    /// x = Bits::new([15, 15, 15]);
1061    ///
1062    /// assert_eq!(x.count_zeros(), 12);
1063    /// ```
1064    pub fn count_zeros(&self) -> usize {
1065        match self.size() {
1066            0 => 0,
1067            n => unsafe {
1068                let pointer = self.words.as_ptr_const();
1069                let mut sum = (*pointer.add(n - 1) & self.mask).count_zeros();
1070
1071                for i in 0..(n - 1) { sum += (*pointer.add(i)).count_zeros(); }
1072
1073                (sum as usize) - self.padding
1074            }
1075        }
1076    }
1077
1078    /// Adds upper bit padding to a bit string.
1079    ///
1080    /// # Examples
1081    /// ```
1082    /// # use bit_byte_bit::{Bits};
1083    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1084    ///
1085    /// x1.extend_left(&[0x0D, 0x0E, 0x0F]);
1086    ///
1087    /// assert_eq!(x1.len(), 44);
1088    /// assert_eq!(x1, Bits::slice(&[0x0A, 0x0B, 0xDC, 0xE0, 0xF0, 0x00], 44));
1089    ///
1090    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1091    ///
1092    /// x2.extend_left(&[0x0D, 0x0E, 0x0F]);
1093    ///
1094    /// assert_eq!(x2.len(), 48);
1095    /// assert_eq!(x2, Bits::new([0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F]));
1096    /// ```
1097    pub fn extend_left(&mut self, bytes: &[u8]) {
1098        let mut nbytes = bytes.len();
1099
1100        while nbytes > 0 && bytes[nbytes - 1] == 0 { nbytes -= 1; }
1101
1102        if nbytes == 0 { return; }
1103
1104        unsafe {
1105            self.words.expand_to(self.size() + nbytes);
1106
1107            let pointer = self.words.as_ptr_mut().add(self.size());
1108
1109            for i in 0..nbytes { ptr::write(pointer.add(i), bytes[i]); }
1110
1111            if self.padding > 0 {
1112                let overflow = (8 - self.padding) & 7;
1113                let mask = mask!(self.padding);
1114                let end = self.size() + nbytes;
1115
1116                self.words.shift_right_from(self.size(), end, mask, overflow, self.padding);
1117            }
1118
1119            self.words.nbytes += nbytes;
1120            self.nbits += nbytes << 3;
1121            *pointer.add(self.size() - 1) &= self.mask;
1122        }
1123    }
1124
1125    /// Adds lower bit padding to a bit string.
1126    ///
1127    /// # Examples
1128    /// ```
1129    /// # use bit_byte_bit::{Bits};
1130    /// let mut x1 = Bits::empty();
1131    ///
1132    /// x1.extend_right(&[0x0A, 0x0B, 0x0C]);
1133    ///
1134    /// assert_eq!(x1.len(), 24);
1135    /// assert_eq!(x1, Bits::new([0x0A, 0x0B, 0x0C]));
1136    ///
1137    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1138    ///
1139    /// x2.extend_right(&[0x0D, 0x0E, 0x0F]);
1140    ///
1141    /// assert_eq!(x2.len(), 44);
1142    /// assert_eq!(x2, Bits::from([0x0D, 0x0E, 0x0F, 0x0A, 0x0B, 0x0C]));
1143    /// ```
1144    pub fn extend_right(&mut self, bytes: &[u8]) {
1145        unsafe {
1146            let nbytes_padding = bytes.len();
1147            let nbytes = self.size() + nbytes_padding;
1148
1149            self.words.expand_to(nbytes);
1150
1151            let pointer = self.words.as_ptr_mut();
1152
1153            ptr::copy(pointer, pointer.add(nbytes_padding), self.size());
1154
1155            for i in 0..nbytes_padding { ptr::write(pointer.add(i), bytes[i]); }
1156
1157            self.words.nbytes = nbytes;
1158            self.nbits += nbytes_padding << 3;
1159            *pointer.add(self.size() - 1) &= self.mask;
1160        }
1161    }
1162
1163    /// The number of ones.
1164    ///
1165    /// # Examples
1166    /// ```
1167    /// # use bit_byte_bit::{Bits};
1168    /// let mut x = Bits::from([15, 15, 15]);
1169    ///
1170    /// assert_eq!(x.hamming_weight(), 12);
1171    /// ```
1172    pub fn hamming_weight(&self) -> usize {
1173        match self.size() {
1174            0 => 0,
1175            n => unsafe {
1176                let pointer = self.words.as_ptr_const();
1177                let mut sum = (*pointer.add(n - 1) & self.mask).count_ones();
1178
1179                for i in 0..(n - 1) { sum += (*pointer.add(i)).count_ones(); }
1180
1181                sum as usize
1182            }
1183        }
1184    }
1185
1186    /// State of a bit.
1187    ///
1188    /// # Examples
1189    /// ```
1190    /// # use bit_byte_bit::{Bits};
1191    /// let mut x = Bits::from([0x0F]);
1192    ///
1193    /// assert_eq!(x.i(3), 1u8);
1194    /// ```
1195    ///
1196    /// ```should_panic
1197    /// # use bit_byte_bit::{Bits};
1198    /// let mut x = Bits::from([0x0F]);
1199    ///
1200    /// assert_eq!(x.i(4), 0);
1201    /// ```
1202    pub fn i(&self, i: usize) -> u8 {
1203        assert!(i < self.nbits, "Index out of bounds");
1204
1205        unsafe { (*self.words.as_ptr_mut().add(i >> 3) >> (i & 7)) & 1 }
1206    }
1207
1208    /// An iterator over the individual bits
1209    ///
1210    /// # Examples
1211    /// ```
1212    /// # use bit_byte_bit::{Bits};
1213    /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
1214    /// let y = x.into_bytes().collect::<Vec<u8>>();
1215    ///
1216    /// assert_eq!(y, vec![0xAB, 0xCD, 0xEF]);
1217    /// ```
1218    pub fn into_bytes(self) -> IntoBytes {
1219        let (iter, bytes) = unsafe {
1220            (Bytes::new(self.bytes()), ptr::read(&self.words))
1221        };
1222
1223        std::mem::forget(self);
1224
1225        IntoBytes::new(iter, bytes)
1226    }
1227
1228    /// An iterator over the individual bits
1229    ///
1230    /// # Examples
1231    /// ```
1232    /// # use bit_byte_bit::{Bits, Iter};
1233    /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
1234    /// let mut ones = 0;
1235    ///
1236    /// for bit in x.iter() { if bit == 1 { ones += 1; } }
1237    ///
1238    /// assert_eq!(ones, 17);
1239    /// ```
1240    pub fn iter(&self) -> Iter { Iter::new(self, 0) }
1241
1242    /// An iterator over the individual bits
1243    ///
1244    /// # Examples
1245    /// ```
1246    /// # use bit_byte_bit::{Bits, Iter};
1247    /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
1248    /// let mut ones = 0;
1249    ///
1250    /// for bit in x.iter_from(0) { if bit == 1 { ones += 1; } }
1251    ///
1252    /// assert_eq!(ones, 17);
1253    ///
1254    /// ones = 0;
1255    ///
1256    /// for bit in x.iter_from(13) { if bit == 1 { ones += 1; } }
1257    ///
1258    /// assert_eq!(ones, 9);
1259    /// ```
1260    pub fn iter_from(&self, index: usize) -> Iter {
1261        assert!(index <= self.nbits, "Index out of bounds");
1262
1263        Iter::new(self, index)
1264    }
1265
1266    /// The number of leading ones.
1267    ///
1268    /// # Examples
1269    /// ```
1270    /// # use bit_byte_bit::{Bits};
1271    /// let x1 = Bits::from([0x0A, 0xFF, 0x03]);
1272    ///
1273    /// assert_eq!(x1.leading_ones(), 10);
1274    ///
1275    /// let x2 = Bits::new([0x0A, 0xFF, 0x0B]);
1276    ///
1277    /// assert_eq!(x2.leading_ones(), 0);
1278    /// ```
1279    pub fn leading_ones(&self) -> usize {
1280        match self.size() {
1281            0 => 0,
1282            n => unsafe {
1283                let pointer = self.words.as_ptr_const();
1284                let last_byte = *pointer.add(n - 1) & self.mask;
1285                let ones = (last_byte << self.padding).leading_ones() as usize;
1286
1287                if ones < (8 - self.padding) { return ones; }
1288
1289                let mut i = n - 2;
1290
1291                while i > 0 && *pointer.add(i) == 0xFF { i -= 1; }
1292
1293                ones + ((self.size() - i - 2) << 3) + ((*pointer.add(i)).leading_ones() as usize)
1294            }
1295        }
1296    }
1297
1298    /// The number of leading zeros.
1299    ///
1300    /// # Examples
1301    /// ```
1302    /// # use bit_byte_bit::{Bits};
1303    /// let x1 = Bits::from([0x0A, 0x00, 0x00]);
1304    ///
1305    /// assert_eq!(x1.leading_zeros(), 0);
1306    ///
1307    /// let x2 = Bits::zeros(20);
1308    ///
1309    /// assert_eq!(x2.leading_zeros(), 20);
1310    /// ```
1311    pub fn leading_zeros(&self) -> usize {
1312        match self.size() {
1313            0 => 0,
1314            1 => unsafe {
1315                let byte = *self.words.as_ptr_const() & self.mask;
1316                (byte.leading_zeros() as usize) - self.padding
1317            },
1318            n => unsafe {
1319                let pointer = self.words.as_ptr_const();
1320                let last_byte = *pointer.add(n - 1) & self.mask;
1321                let zeros = (last_byte.leading_zeros() as usize) - self.padding;
1322
1323                if (zeros + self.padding) < 8 { return zeros; }
1324
1325                let mut i = n - 2;
1326
1327                while i > 0 && *pointer.add(i) == 0 { i -= 1; }
1328
1329                zeros + ((n - i - 2) << 3) + ((*pointer.add(i)).leading_zeros() as usize)
1330            }
1331        }
1332    }
1333
1334    /// The number of bits.
1335    ///
1336    /// # Examples
1337    /// ```
1338    /// # use bit_byte_bit::{Bits};
1339    /// let x1 = Bits::empty();
1340    ///
1341    /// assert_eq!(x1.len(), 0);
1342    ///
1343    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1344    ///
1345    /// assert_eq!(x2.len(), 20);
1346    ///
1347    /// let x3 = Bits::new([0x0A, 0x0B, 0x0C]);
1348    ///
1349    /// assert_eq!(x3.len(), 24);
1350    ///
1351    /// let x4 = Bits::slice(&[0x0A, 0x0B, 0x0C], 17);
1352    ///
1353    /// assert_eq!(x4.len(), 17);
1354    /// ```
1355    pub fn len(&self) -> usize { self.nbits }
1356
1357    /// Whether all bits are zero.
1358    ///
1359    /// # Examples
1360    /// ```
1361    /// # use bit_byte_bit::{Bits};
1362    /// let x1 = Bits::empty();
1363    ///
1364    /// assert!(!x1.any());
1365    ///
1366    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1367    ///
1368    /// assert!(x2.any());
1369    ///
1370    /// let x3 = Bits::zeros(20);
1371    ///
1372    /// assert!(!x3.any());
1373    pub fn none(&self) -> bool {
1374        unsafe {
1375            let pointer = self.words.as_ptr_const();
1376
1377            for i in 0..(self.size() - 1) {
1378                if *pointer.add(i) != 0 { return false; }
1379            }
1380
1381            (*pointer.add(self.size() - 1) & self.mask) == 0
1382        }
1383    }
1384
1385    /// Bitwise or of two bit strings.
1386    ///
1387    /// # Examples
1388    /// ```
1389    /// # use bit_byte_bit::{Bits};
1390    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
1391    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
1392    ///
1393    /// assert_eq!(x1.or(&y1), Bits::from([0xA0, 0xB0, 0xC0]));
1394    ///
1395    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
1396    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
1397    ///
1398    /// assert_eq!(x2.len(), 23);
1399    /// assert_eq!(y2.len(), 24);
1400    ///
1401    /// let z = x2.or(&y2);
1402    ///
1403    /// assert_eq!(z.len(), 24);
1404    /// ```
1405    pub fn or(&self, rhs: &Bits) -> Bits { bitop!(self, |, rhs) }
1406
1407    /// Bitwise or of two bit strings.
1408    ///
1409    /// # Examples
1410    /// ```
1411    /// # use bit_byte_bit::{Bits};
1412    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
1413    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
1414    ///
1415    /// x1.or_mut(&y1);
1416    ///
1417    /// assert_eq!(x1, Bits::from([0xA0, 0xB0, 0xC0]));
1418    ///
1419    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
1420    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
1421    ///
1422    /// assert_eq!(x2.len(), 23);
1423    /// assert_eq!(y2.len(), 24);
1424    ///
1425    /// x2.or_mut(&y2);
1426    ///
1427    /// assert_eq!(x2.len(), 24);
1428    /// ```
1429    pub fn or_mut(&mut self, rhs: &Bits) { bitop!(assign; self, |=, rhs) }
1430
1431    /// Shifts out the most significant bit.
1432    ///
1433    /// # Examples
1434    /// ```
1435    /// # use bit_byte_bit::{Bits};
1436    /// let mut x1 = Bits::empty();
1437    ///
1438    /// assert_eq!(x1.pop_left(), 0u8);
1439    ///
1440    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1441    ///
1442    /// assert_eq!(x2.pop_left(), 1u8);
1443    /// assert_eq!(x2.len(), 19);
1444    ///
1445    /// let mut x3 = Bits::new([0x0A, 0x0B, 0x0C]);
1446    ///
1447    /// assert_eq!(x3.pop_left(), 0u8);
1448    /// assert_eq!(x3.len(), 23);
1449    /// ```
1450    pub fn pop_left(&mut self) -> u8 {
1451        match self.size() {
1452            0 => 0,
1453            n => unsafe {
1454                let pointer = self.words.as_ptr_mut();
1455                self.nbits -= 1;
1456
1457                match self.padding {
1458                    0 => {
1459                        let bit = *pointer.add(n - 1) >> 7;
1460
1461                        *pointer.add(n - 1) &= 0x7F;
1462
1463                        bit
1464                    },
1465                    7 => {
1466                        let bit = ptr::read(pointer.add(n - 1)) & 1;
1467
1468                        self.words.nbytes -= 1;
1469                        self.padding = 0;
1470
1471                        bit
1472                    },
1473                    alignment => {
1474                        let shift = 8 - alignment - 1;
1475                        let bit = *pointer.add(n- 1) >> shift;
1476                        *pointer.add(n - 1) &= mask!(shift);
1477                        self.padding += 1;
1478
1479                        bit
1480                    }
1481                }
1482            }
1483        }
1484    }
1485
1486    /// Shifts out the least significant bit.
1487    ///
1488    /// # Examples
1489    /// ```
1490    /// # use bit_byte_bit::{Bits};
1491    /// let mut x1 = Bits::empty();
1492    ///
1493    /// assert_eq!(x1.pop_right(), 0u8);
1494    ///
1495    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1496    ///
1497    /// assert_eq!(x2.pop_right(), 0u8);
1498    /// assert_eq!(x2.len(), 19);
1499    /// assert_eq!(x2.pop_right(), 1u8);
1500    /// ```
1501    pub fn pop_right(&mut self) -> u8 {
1502        match self.size() {
1503            0 => 0,
1504            _ => {
1505                self.nbits -= 1;
1506                self.padding = (self.padding + 1) & 7;
1507
1508                unsafe {
1509                    let pointer = self.words.as_ptr_mut();
1510                    let bit = *pointer & 1;
1511
1512                    self.words.shift_right(self.size(), 1, 7, 1);
1513
1514                    if self.nbits == 0 {
1515                        ptr::read(pointer);
1516                        self.words.nbytes = 0;
1517                    }
1518
1519                    bit
1520                }
1521            }
1522        }
1523    }
1524
1525    /// Adds upper bit padding to a bit string.
1526    ///
1527    /// # Examples
1528    /// ```
1529    /// # use bit_byte_bit::{Bits};
1530    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1531    ///
1532    /// x1.push_left(true, 17);
1533    ///
1534    /// assert_eq!(x1.len(), 37);
1535    /// assert_eq!(x1, Bits::from([0x0A, 0x0B, 0xFC, 0xFF, 0x1F]));
1536    ///
1537    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1538    ///
1539    /// x2.push_left(false, 17);
1540    ///
1541    /// assert_eq!(x2.len(), 41);
1542    /// assert_eq!(x2, Bits::slice(&[0x0A, 0x0B, 0x0C, 0x00, 0x00, 0x00], 41));
1543    /// ```
1544    pub fn push_left(&mut self, bit: bool, count: usize) {
1545        if bit { self.push_ones(count); } else { self.push_zeros(count); }
1546    }
1547
1548    /// Adds upper bit padding to a bit string.
1549    ///
1550    /// # Examples
1551    /// ```
1552    /// # use bit_byte_bit::{Bits};
1553    /// let mut x = Bits::from([15, 15, 15]);
1554    ///
1555    /// x.push_byte_left(15, 2);
1556    ///
1557    /// assert_eq!(x.len(), 36);
1558    /// assert_eq!(x, Bits::slice(&[15, 15, 255, 240, 0], 36));
1559    ///
1560    /// x = Bits::new([15, 15, 15]);
1561    ///
1562    /// x.push_byte_left(31, 2);
1563    ///
1564    /// assert_eq!(x.len(), 40);
1565    /// assert_eq!(x, Bits::new([15, 15, 15, 31, 31]));
1566    /// ```
1567    pub fn push_byte_left(&mut self, word: u8, count: usize) {
1568        if count == 0 { return; }
1569
1570        match word {
1571            0 => self.push_zeros(count << 3),
1572            0xFF => self.push_ones(count << 3),
1573            word => unsafe {
1574                self.words.expand_to(self.size() + count);
1575
1576                let pointer = self.words.as_ptr_mut().add(self.size());
1577
1578                for i in 0..count { ptr::write(pointer.add(i), word); }
1579
1580                *pointer.add(self.size() - 1) &= self.mask;
1581
1582                if self.padding > 0 && word != 0 {
1583                    self.words.shift_right_from(
1584                        self.size(),
1585                        self.size() + count,
1586                        mask!(self.padding),
1587                        (8 - self.padding) & 7,
1588                        self.padding
1589                    );
1590                }
1591
1592                self.words.nbytes += count;
1593                self.nbits += count << 3;
1594
1595                self.shrink_to_fit()
1596            }
1597        }
1598    }
1599
1600    /// Adds lower bit padding to a bit string.
1601    ///
1602    /// # Examples
1603    /// ```
1604    /// # use bit_byte_bit::{Bits};
1605    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1606    ///
1607    /// x.push_right(true, 4);
1608    ///
1609    /// assert_eq!(x.len(), 24);
1610    /// assert_eq!(x, Bits::from([0xAF, 0xB0, 0xC0]));
1611    /// ```
1612    pub fn push_right(&mut self, bit: bool, count: usize)  {
1613        match count {
1614            0 => (),
1615            n => if bit { self.cons_bit(n, 0xFF); } else { self.cons_bit(n, 0) }
1616        }
1617    }
1618
1619    /// Adds lower bit padding to a bit string.
1620    ///
1621    /// # Examples
1622    /// ```
1623    /// # use bit_byte_bit::{Bits};
1624    /// let mut x = Bits::from([15, 15, 15]);
1625    ///
1626    /// x.push_byte_right(31, 2);
1627    ///
1628    /// assert_eq!(x.len(), 36);
1629    /// assert_eq!(x, Bits::from([31, 31, 15, 15, 15]));
1630    /// ```
1631    pub fn push_byte_right(&mut self, word: u8, count: usize) {
1632        let nbytes = self.size() + count;
1633        self.words.expand_to(nbytes);
1634
1635        unsafe {
1636            let pointer = self.words.as_ptr_mut();
1637
1638            ptr::copy(pointer, pointer.add(count), self.size());
1639
1640            for i in 0..count { ptr::write(pointer.add(i), word); }
1641        }
1642
1643        self.words.nbytes = nbytes;
1644        self.nbits += count << 3;
1645    }
1646
1647    /// Sets a bit to zero.
1648    ///
1649    /// # Examples
1650    /// ```
1651    /// # use bit_byte_bit::{Bits};
1652    /// let mut x = Bits::new([15]);
1653    ///
1654    /// assert_eq!(x.i(3), 1u8);
1655    ///
1656    /// x.reset(3);
1657    ///
1658    /// assert_eq!(x.i(3), 0u8);
1659    /// ```
1660    pub fn reset(&mut self, i: usize) {
1661        if i < self.nbits {
1662            unsafe { *self.words.as_ptr_mut().add(i >> 3) &= !(1 << (i & 7)); }
1663        }
1664    }
1665
1666    /// Sets the state of a range of bits to zero.
1667    ///
1668    /// # Examples
1669    /// ```
1670    /// # use bit_byte_bit::{Bits};
1671    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1672    /// x1.reset_bits(7, 10);
1673    ///
1674    /// assert_eq!(x1, Bits::from([0x0A, 0x00, 0x0C]));
1675    ///
1676    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1677    /// x2.reset_bits(8, 12);
1678    ///
1679    /// assert_eq!(x2, Bits::slice(&[0x0A, 0x00, 0x00], 20));
1680    /// ```
1681    ///
1682    /// ``` should_panic
1683    /// # use bit_byte_bit::{Bits};
1684    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1685    ///
1686    /// x.reset_bits(21, 14);
1687    /// ```
1688    ///
1689    /// ```should_panic
1690    /// # use bit_byte_bit::{Bits};
1691    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1692    ///
1693    /// x.reset_bits(7, 14);
1694    /// ```
1695    pub fn reset_bits(&mut self, start: usize, count: usize) {
1696        assert!(count <= self.nbits && start <= self.nbits - count, "Invalid range");
1697
1698        let end = if count > (self.nbits - start) { self.nbits } else { start + count };
1699        let mut start = start;
1700        let low_overflow = 8 - (start & 7);
1701
1702        unsafe {
1703            let pointer = self.words.as_ptr_mut();
1704
1705            if low_overflow < 8 {
1706                *pointer.add(start >> 3) &= !(((1 << low_overflow) - 1) << (start & 7));
1707                start = start + low_overflow;
1708            }
1709
1710            let bytes = (end - start) >> 3;
1711            let start_byte = start >> 3;
1712
1713            for i in start_byte..(start_byte + bytes) { *pointer.add(i) = 0 }
1714
1715            let overflow = (end - start) & 7;
1716
1717            if overflow > 0 { *pointer.add(start_byte + bytes) &= !((1 << overflow) - 1); }
1718
1719            if self.size() > 0 { *pointer.add(self.words.nbytes - 1) &= self.mask; }
1720        }
1721    }
1722
1723    /// Sets the state of a byte to zero.
1724    ///
1725    /// # Examples
1726    /// ```
1727    /// # use bit_byte_bit::{Bits};
1728    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1729    ///
1730    /// x.reset_byte(1);
1731    ///
1732    /// assert_eq!(x, Bits::from([0x0A, 0x00, 0x0C]));
1733    ///
1734    /// x.reset_byte(2);
1735    ///
1736    /// assert_eq!(x, Bits::slice(&[0x0A, 0x00, 0x00], 20));
1737    ///```
1738    ///
1739    /// ```should_panic
1740    /// # use bit_byte_bit::{Bits};
1741    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1742    ///
1743    /// x.reset_byte(3);
1744    /// ```
1745    pub fn reset_byte(&mut self, i: usize) {
1746        assert!(i < self.size(), "Index out of range");
1747
1748        unsafe {
1749            let pointer = self.words.as_ptr_mut();
1750            *pointer.add(i) = 0;
1751
1752            if self.size() > 0 { *pointer.add(self.words.nbytes - 1) &= self.mask; }
1753        }
1754    }
1755
1756    /// Sets the state of a range of bytes to zero.
1757    ///
1758    /// # Examples
1759    /// ```
1760    /// # use bit_byte_bit::{Bits};
1761    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1762    ///
1763    /// x.reset_bytes(1, 2);
1764    ///
1765    /// assert_eq!(x, Bits::slice(&[0x0A, 0x00, 0x00], 20));
1766    /// ```
1767    ///
1768    /// ```should_panic
1769    /// # use bit_byte_bit::{Bits};
1770    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1771    ///
1772    /// x.reset_bytes(3, 2);
1773    /// ```
1774    ///
1775    /// ```should_panic
1776    /// # use bit_byte_bit::{Bits};
1777    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1778    ///
1779    /// x.reset_bytes(0, 4);
1780    /// ```
1781    pub fn reset_bytes(&mut self, start: usize, count: usize) {
1782        assert!(count <= self.size() && start <= self.size() - count, "Invalid range");
1783
1784        unsafe {
1785            let pointer = self.words.as_ptr_mut();
1786
1787            let end = if count > (self.size() - start) { self.size() } else { start + count };
1788
1789            for i in start..end { *pointer.add(i) = 0; }
1790
1791            if end == self.size() && self.padding > 0 { *pointer.add(end - 1) &= self.mask; }
1792        }
1793    }
1794
1795    /// Reverses the order of the bits.
1796    ///
1797    /// # Examples
1798    /// ```
1799    /// # use bit_byte_bit::{Bits};
1800    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1801    ///
1802    /// x1.reverse();
1803    ///
1804    /// assert_eq!(x1, Bits::slice(&[0x03, 0x0D, 0x05], 20));
1805    ///
1806    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1807    ///
1808    /// x2.reverse();
1809    ///
1810    /// assert_eq!(x2, Bits::new([0x30, 0xD0, 0x50]));
1811    /// ```
1812    pub fn reverse(&mut self) {
1813        match self.size() {
1814            0 => (),
1815            n => unsafe {
1816                let aptr = self.words.as_ptr_mut();
1817                *aptr.add(n - 1) &= self.mask;
1818
1819                let mid = n >> 1;
1820                let upper_bound = n - 1;
1821
1822                for i in 0..mid {
1823                    let a = (*aptr.add(i)).reverse_bits();
1824
1825                    *aptr.add(i) = (*aptr.add(upper_bound - i)).reverse_bits();
1826                    *aptr.add(upper_bound - i) = a;
1827                }
1828
1829                if (n & 1) == 1 { *aptr.add(mid) = (*aptr.add(mid)).reverse_bits() }
1830
1831                if self.padding > 0 {
1832                    let overflow = 8 - self.padding;
1833                    let mask = (1 << overflow) - 1;
1834
1835                    self.words.shift_right(self.size(), mask, self.padding, overflow);
1836                }
1837            }
1838        }
1839    }
1840
1841    /// Reverses the order of the bits.
1842    ///
1843    /// # Examples
1844    /// ```
1845    /// # use bit_byte_bit::{Bits};
1846    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1847    ///
1848    /// assert_eq!(x1.reversed(), Bits::slice(&[0x03, 0x0D, 0x05], 20));
1849    ///
1850    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1851    ///
1852    /// assert_eq!(x2.reversed(), Bits::new([0x30, 0xD0, 0x50]));
1853    /// ```
1854    pub fn reversed(&self) -> Self {
1855        let mut cloned = self.clone();
1856
1857        cloned.reverse();
1858
1859        cloned
1860    }
1861
1862    /// Rotates bits to the left.
1863    ///
1864    /// # Examples
1865    /// ```
1866    /// # use bit_byte_bit::{Bits};
1867    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1868    ///
1869    /// x1.rotate_left(4);
1870    ///
1871    /// assert_eq!(x1, Bits::slice(&[0xAC, 0xB0, 0x00], 20));
1872    /// assert_eq!(x1.len(), 20);
1873    ///
1874    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1875    ///
1876    /// x2.rotate_left(4);
1877    ///
1878    /// assert_eq!(x2, Bits::new([0xA0, 0xB0, 0xC0]));
1879    /// assert_eq!(x2.len(), 24);
1880    /// ```
1881    pub fn rotate_left(&mut self, count: usize) {
1882        match (self.size(), count) {
1883            (0, _) | (_, 0) => (),
1884            (n, count) => {
1885                unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
1886
1887                let reduced_count = count % self.nbits;
1888                let other = self.shifted_right(self.nbits - reduced_count);
1889
1890                self.shift_left(reduced_count);
1891                self.or_mut(&other);
1892            }
1893        }
1894    }
1895
1896    /// Rotates bits to the left.
1897    ///
1898    /// # Examples
1899    /// ```
1900    /// # use bit_byte_bit::{Bits};
1901    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1902    ///
1903    /// assert_eq!(x1.rotated_left(4), Bits::slice(&[0xAC, 0xB0, 0x00], 20));
1904    /// assert_eq!(x1.len(), 20);
1905    ///
1906    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1907    ///
1908    /// assert_eq!(x2.rotated_left(4), Bits::new([0xA0, 0xB0, 0xC0]));
1909    /// assert_eq!(x2.len(), 24);
1910    /// ```
1911    pub fn rotated_left(&self, count: usize) -> Self {
1912        match (self.size(), count) {
1913            (0, _) | (_, 0) => self.clone(),
1914            (n, count) => {
1915                unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
1916
1917                let reduced_count = count % self.nbits;
1918                let mut other = self.shifted_left(reduced_count);
1919
1920                other |= self.shifted_right(self.nbits - reduced_count);
1921
1922                other
1923            }
1924        }
1925    }
1926
1927    /// Rotates bits to the right.
1928    ///
1929    /// # Examples
1930    /// ```
1931    /// # use bit_byte_bit::{Bits};
1932    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1933    ///
1934    /// x1.rotate_right(4);
1935    ///
1936    /// assert_eq!(x1, Bits::slice(&[0xB0, 0xC0, 0x0A], 20));
1937    /// assert_eq!(x1.len(), 20);
1938    ///
1939    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1940    ///
1941    /// x2.rotate_right(4);
1942    ///
1943    /// assert_eq!(x2, Bits::new([0xB0, 0xC0, 0xA0]));
1944    /// assert_eq!(x2.len(), 24);
1945    /// ```
1946    pub fn rotate_right(&mut self, count: usize) {
1947        match (self.size(), count) {
1948            (0, _) | (_, 0) => (),
1949            (n, count) => {
1950                unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
1951
1952                let reduced_count = count % self.nbits;
1953                let other = self.shifted_left(self.nbits - reduced_count);
1954
1955                self.shift_right(reduced_count);
1956                self.or_mut(&other);
1957            }
1958        }
1959    }
1960
1961    /// Rotates bits to the right.
1962    ///
1963    /// # Examples
1964    /// ```
1965    /// # use bit_byte_bit::{Bits};
1966    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1967    ///
1968    /// assert_eq!(x1.rotated_right(4), Bits::slice(&[0xB0, 0xC0, 0x0A], 20));
1969    /// assert_eq!(x1.len(), 20);
1970    ///
1971    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1972    ///
1973    /// assert_eq!(x2.rotated_right(4), Bits::new([0xB0, 0xC0, 0xA0]));
1974    /// assert_eq!(x2.len(), 24);
1975    /// ```
1976    pub fn rotated_right(&self, count: usize) -> Self {
1977        match (self.size(), count) {
1978            (0, _) | (_, 0) => self.clone(),
1979            (n, count) => {
1980                unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
1981
1982                let reduced_count = count % self.nbits;
1983                let mut other = self.shifted_right(reduced_count);
1984
1985                other |= self.shifted_left(self.nbits - reduced_count);
1986
1987                other
1988            }
1989        }
1990    }
1991
1992    /// Sets a bit to one.
1993    ///
1994    /// # Examples
1995    /// ```
1996    /// # use bit_byte_bit::{Bits};
1997    /// let mut x = Bits::new([15]);
1998    ///
1999    /// assert_eq!(x.i(4), 0u8);
2000    ///
2001    /// x.set(4);
2002    ///
2003    /// assert_eq!(x.i(4), 1u8);
2004    /// ```
2005    pub fn set(&mut self, i: usize) {
2006        assert!(i < self.nbits, "Index out of range");
2007
2008        unsafe { *self.words.as_ptr_mut().add(i >> 3) |= 1 << (i & 7); }
2009    }
2010
2011    /// Sets the state of a range of bits to one.
2012    ///
2013    /// # Examples
2014    /// ```
2015    /// # use bit_byte_bit::{Bits};
2016    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2017    /// x1.set_bits(7, 10);
2018    ///
2019    /// assert_eq!(x1, Bits::from([0x8A, 0xFF, 0x0D]));
2020    ///
2021    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2022    /// x2.set_bits(8, 12);
2023    ///
2024    /// assert_eq!(x2, Bits::slice(&[0x0A, 0xFF, 0x0F], 20));
2025    /// ```
2026    ///
2027    /// ``` should_panic
2028    /// # use bit_byte_bit::{Bits};
2029    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2030    ///
2031    /// x.set_bits(21, 14);
2032    /// ```
2033    ///
2034    /// ```should_panic
2035    /// # use bit_byte_bit::{Bits};
2036    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2037    ///
2038    /// x.set_bits(7, 14);
2039    /// ```
2040    pub fn set_bits(&mut self, start: usize, count: usize) {
2041        assert!(count <= self.nbits && start <= self.nbits - count, "Invalid range");
2042
2043        let end = if count > (self.nbits - start) { self.nbits } else { start + count };
2044        let mut start = start;
2045        let low_overflow = 8 - (start & 7);
2046
2047        unsafe {
2048            let pointer = self.words.as_ptr_mut();
2049
2050            if low_overflow < 8 {
2051                *pointer.add(start >> 3) |= ((1 << low_overflow) - 1) << (start & 7);
2052                start = start + low_overflow;
2053            }
2054
2055            let bytes = (end - start) >> 3;
2056            let start_byte = start >> 3;
2057
2058            for i in start_byte..(start_byte + bytes) { *pointer.add(i) = 0xFF }
2059
2060            let overflow = (end - start) & 7;
2061
2062            if overflow > 0 { *pointer.add(start_byte + bytes) |= (1 << overflow) - 1; }
2063        }
2064    }
2065
2066    /// Sets the state of a byte to all ones.
2067    ///
2068    /// # Examples
2069    /// ```
2070    /// # use bit_byte_bit::{Bits};
2071    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2072    ///
2073    /// x.set_byte(1);
2074    ///
2075    /// assert_eq!(x, Bits::from([0x0A, 0xFF, 0x0C]));
2076    ///
2077    /// x.set_byte(2);
2078    ///
2079    /// assert_eq!(x, Bits::slice(&[0x0A, 0xFF, 0x0F], 20));
2080    ///```
2081    ///
2082    /// ```should_panic
2083    /// # use bit_byte_bit::{Bits};
2084    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2085    ///
2086    /// x.toggle_byte(3);
2087    /// ```
2088    pub fn set_byte(&mut self, i: usize) {
2089        assert!(i < self.size(), "Index out of range");
2090
2091        unsafe {
2092            let pointer = self.words.as_ptr_mut();
2093            *pointer.add(i) = 0xFF;
2094            *pointer.add(self.size() - 1) &= self.mask;
2095        }
2096    }
2097
2098    /// Sets the state of a range of bytes to all ones.
2099    ///
2100    /// # Examples
2101    /// ```
2102    /// # use bit_byte_bit::{Bits};
2103    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2104    ///
2105    /// x.set_bytes(1, 2);
2106    ///
2107    /// assert_eq!(x, Bits::slice(&[0x0A, 0xFF, 0x0F], 20));
2108    /// ```
2109    ///
2110    /// ```should_panic
2111    /// # use bit_byte_bit::{Bits};
2112    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2113    ///
2114    /// x.set_bytes(3, 2);
2115    /// ```
2116    ///
2117    /// ```should_panic
2118    /// # use bit_byte_bit::{Bits};
2119    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2120    ///
2121    /// x.set_bytes(0, 4);
2122    /// ```
2123    pub fn set_bytes(&mut self, start: usize, count: usize) {
2124        assert!(count <= self.size() && start <= self.size() - count, "Invalid range");
2125
2126        unsafe {
2127            let pointer = self.words.as_ptr_mut();
2128
2129            let end = if count > (self.size() - start) { self.size() } else { start + count };
2130
2131            for i in start..end { *pointer.add(i) = 0xFF; }
2132
2133            if end == self.size() && self.padding > 0 { *pointer.add(end - 1) &= self.mask; }
2134        }
2135    }
2136
2137    /// Shifts out upper bits, shifting in zeros on the lower end.
2138    ///
2139    /// # Examples
2140    /// ```
2141    /// # use bit_byte_bit::{Bits};
2142    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2143    ///
2144    /// x1.shift_left(17);
2145    ///
2146    /// assert_eq!(x1, Bits::slice(&[0x00, 0x00, 0x04], 20));
2147    /// assert_eq!(x1.len(), 20);
2148    ///
2149    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2150    ///
2151    /// x2.shift_left(4);
2152    ///
2153    /// assert_eq!(x2, Bits::new([0xA0, 0xB0, 0xC0]));
2154    /// assert_eq!(x2.len(), 24);
2155    /// ```
2156    pub fn shift_left(&mut self, count: usize) {
2157        match (self.size(), count) {
2158            (0, _) | (_, 0) => (),
2159            (_, count) if count >= self.nbits => unsafe {
2160                let pointer = self.words.as_ptr_mut();
2161
2162                for i in 0..self.size() { *pointer.add(i) = 0 }
2163            },
2164            (n, count) => unsafe {
2165                let pointer = self.words.as_ptr_mut();
2166                let shift_overflow = count & 7;
2167                let shift_bytes = count >> 3;
2168
2169                if shift_bytes > 0 {
2170                    ptr::copy(pointer, pointer.add(shift_bytes), self.size() - shift_bytes);
2171
2172                    for i in 0..shift_bytes { *pointer.add(i) = 0; }
2173
2174                    *pointer.add(n - 1) &= self.mask;
2175                }
2176
2177                if shift_overflow > 0 {
2178                    let low = 8 - shift_overflow;
2179
2180                    for i in 1..n {
2181                        *pointer.add(n - i) <<= shift_overflow;
2182                        *pointer.add(i) |= *pointer.add(n - i - 1) >> low;
2183                    }
2184
2185                    *pointer <<= shift_overflow;
2186                }
2187
2188                *pointer.add(n - 1) &= self.mask;
2189            }
2190        }
2191    }
2192
2193    /// Shifts out upper bits, shifting in zeros on the lower end.
2194    ///
2195    /// # Examples
2196    /// ```
2197    /// # use bit_byte_bit::{Bits};
2198    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2199    /// let s1 = x1.shifted_left(17);
2200    ///
2201    /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
2202    /// assert_eq!(s1.len(), 20);
2203    ///
2204    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2205    /// let s2 = x2.shifted_left(4);
2206    ///
2207    /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
2208    /// assert_eq!(s2.len(), 24);
2209    /// ```
2210    pub fn shifted_left(&self, count: usize) -> Self {
2211        let mut clone = self.clone();
2212
2213        clone.shift_left(count);
2214
2215        clone
2216    }
2217
2218    /// Shifts out lower bits, shifting zeros into the upper bits.
2219    ///
2220    /// # Examples
2221    /// ```
2222    /// # use bit_byte_bit::{Bits};
2223    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2224    ///
2225    /// x1.shift_right(17);
2226    ///
2227    /// assert_eq!(x1.len(), 20);
2228    /// assert_eq!(x1, Bits::slice(&[0x06, 0x00, 0x00], 20));
2229    ///
2230    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2231    ///
2232    /// x2.shift_right(4);
2233    ///
2234    /// assert_eq!(x2.len(), 24);
2235    /// assert_eq!(x2, Bits::new([0xB0, 0xC0, 0x00]));
2236    /// ```
2237    pub fn shift_right(&mut self, count: usize) {
2238        match (self.size(), count) {
2239            (0, _) | (_, 0) => (),
2240            (_, count) if count >= self.nbits => unsafe {
2241                let pointer = self.words.as_ptr_mut();
2242
2243                for i in 0..self.size() { *pointer.add(i) = 0 }
2244            },
2245            (n, count) => unsafe {
2246                let pointer = self.words.as_ptr_mut();
2247                *pointer.add(n - 1) &= self.mask;
2248                let nbytes_shift = count >> 3;
2249
2250                ptr::copy(pointer.add(nbytes_shift), pointer, self.size() - nbytes_shift);
2251
2252                for i in (self.size() - nbytes_shift)..self.size() { *pointer.add(i) = 0; }
2253
2254                let overflow = count & 7;
2255
2256                if overflow > 0 {
2257                    let mask = (1 << overflow) - 1;
2258                    let low = 8 - overflow;
2259
2260                    self.words.shift_right(self.size() - nbytes_shift, mask, low, overflow);
2261                }
2262            }
2263        }
2264    }
2265
2266    /// Shifts out lower bits, shifting zeros into the upper bits.
2267    ///
2268    /// # Examples
2269    /// ```
2270    /// # use bit_byte_bit::{Bits};
2271    /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2272    /// let s1 = x1.shifted_right(17);
2273    ///
2274    /// assert_eq!(s1.len(), 20);
2275    /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
2276    ///
2277    /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2278    /// let s2 = x2.shifted_right(4);
2279    ///
2280    /// assert_eq!(s2.len(), 24);
2281    /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
2282    /// ```
2283    pub fn shifted_right(&self, count: usize) -> Self {
2284        let mut clone = self.clone();
2285
2286        clone.shift_right(count);
2287
2288        clone
2289    }
2290
2291    /// The number of bytes.
2292    ///
2293    /// # Examples
2294    /// ```
2295    /// # use bit_byte_bit::{Bits};
2296    /// let x1 = Bits::empty();
2297    ///
2298    /// assert_eq!(x1.size(), 0);
2299    ///
2300    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2301    ///
2302    /// assert_eq!(x2.size(), 3);
2303    ///
2304    /// let x3 = Bits::new([0x0A, 0x0B, 0x0C]);
2305    ///
2306    /// assert_eq!(x3.size(), 3);
2307    ///
2308    /// let x4 = Bits::slice(&[0x0A, 0x0B, 0x0C], 13);
2309    ///
2310    /// assert_eq!(x4.size(), 2);
2311    /// ```
2312    pub fn size(&self) -> usize { self.words.nbytes }
2313
2314    /// Splits the bit string.
2315    ///
2316    /// When the index is greater than or equal to the length
2317    /// of the bit string, the second element of the returned
2318    /// pair will be empty. When the index is `0`, the first
2319    /// element will be empty.
2320    ///
2321    /// # Examples
2322    /// ```
2323    /// # use bit_byte_bit::{Bits};
2324    /// let x1 = Bits::empty();
2325    /// let (l1, r1) = x1.split(11);
2326    ///
2327    /// assert_eq!(l1.len(), 0);
2328    /// assert_eq!(r1.len(), 0);
2329    ///
2330    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2331    /// let (l2, r2) = x2.split(20);
2332    ///
2333    /// assert_eq!(l2, x2);
2334    /// assert_eq!(r2.len(), 0);
2335    ///
2336    /// let (l3, r3) = x2.split(0);
2337    ///
2338    /// assert_eq!(l3.len(), 0);
2339    /// assert_eq!(r3, x2);
2340    ///
2341    /// let (l4, r4) = x2.split(11);
2342    /// assert_eq!(l4, Bits::slice(&[0x0A, 0x03], 11));
2343    /// assert_eq!(r4, Bits::slice(&[0x81, 0x01], 9));
2344    /// ```
2345    pub fn split(&self, i: usize) -> (Bits, Bits) {
2346        if i >= self.nbits { return (self.clone(), Bits::empty()) }
2347
2348        if i == 0 { return (Bits::empty(), self.clone()) }
2349
2350        let rlen = self.nbits - i;
2351        let (lsize, loverflow) = divrem8!(ceil; i);
2352        let idiv8 = i >> 3;
2353        let (rsize, roverflow) = (self.size() - idiv8, rlen & 7);
2354        let (lmask, rmask) = (mask!(loverflow), mask!(roverflow));
2355
2356        unsafe {
2357            let pointer = self.words.as_ptr_mut();
2358            let l = pointer![lsize];
2359            let r = pointer![rsize];
2360
2361            for i in 0..lsize { *l.add(i) = *pointer.add(i); }
2362            for i in 0..rsize { *r.add(i) = *pointer.add(idiv8 + i); }
2363
2364            let rbytes = RawBytes { bytes: NonNull::new(r).unwrap(), cap: rsize, nbytes: rsize };
2365
2366            let mut rbits = Bits {
2367                words: rbytes,
2368                mask: rmask,
2369                nbits: self.nbits - i,
2370                padding: (8 - roverflow) & 7
2371            };
2372
2373            if loverflow > 0 {
2374                *l.add(lsize - 1) &= lmask;
2375
2376                rbits.words.shift_right(rsize, lmask, 8 - loverflow, loverflow);
2377            }
2378
2379            let lbytes = RawBytes { bytes: NonNull::new(l).unwrap(), cap: lsize, nbytes: lsize };
2380
2381            let lbits = Bits {
2382                words: lbytes,
2383                mask: lmask,
2384                nbits: i,
2385                padding: (8 - loverflow) & 7
2386            };
2387
2388            (lbits, rbits)
2389        }
2390    }
2391
2392    /// Whether a bit is one.
2393    ///
2394    /// # Examples
2395    /// ```
2396    /// # use bit_byte_bit::{Bits};
2397    /// let mut x = Bits::from([0x0F]);
2398    ///
2399    /// assert!(x.test(3));
2400    /// assert!(!x.test(4));
2401    /// assert!(!x.test(8));
2402    /// ```
2403    pub fn test(&self, i: usize) -> bool {
2404        unsafe {
2405            i < self.nbits && (*self.words.as_ptr_mut().add(i >> 3) & (1 << (i & 7))) > 0
2406        }
2407    }
2408
2409    /// Flips the state of a bit.
2410    ///
2411    /// # Examples
2412    /// ```
2413    /// # use bit_byte_bit::{Bits};
2414    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2415    ///
2416    /// assert_eq!(x.i(0), 0u8);
2417    /// assert_eq!(x.i(1), 1u8);
2418    ///
2419    /// x.toggle(0);
2420    /// x.toggle(1);
2421    ///
2422    /// assert_eq!(x.i(0), 1u8);
2423    /// assert_eq!(x.i(1), 0u8);
2424    /// ```
2425    ///
2426    /// ```should_panic
2427    /// # use bit_byte_bit::{Bits};
2428    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2429    ///
2430    /// x.toggle(21);
2431    /// ```
2432    pub fn toggle(&mut self, i: usize) {
2433        assert!(i < self.nbits, "Index out of range");
2434
2435        unsafe { *self.words.as_ptr_mut().add(i >> 3) ^= 1 << (i & 7); }
2436    }
2437
2438    /// Flips the state of a range of bits.
2439    ///
2440    /// # Examples
2441    /// ```
2442    /// # use bit_byte_bit::{Bits};
2443    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2444    /// x1.toggle_bits(7, 10);
2445    ///
2446    /// assert_eq!(x1, Bits::from([0x8A, 0xF4, 0x0D]));
2447    ///
2448    /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2449    /// x2.toggle_bits(8, 12);
2450    ///
2451    /// assert_eq!(x2, Bits::slice(&[0x0A, 0xF4, 0x03], 20));
2452    /// ```
2453    ///
2454    /// ``` should_panic
2455    /// # use bit_byte_bit::{Bits};
2456    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2457    ///
2458    /// x.toggle_bits(21, 14);
2459    /// ```
2460    ///
2461    /// ```should_panic
2462    /// # use bit_byte_bit::{Bits};
2463    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2464    ///
2465    /// x.toggle_bits(7, 14);
2466    /// ```
2467    pub fn toggle_bits(&mut self, start: usize, count: usize) {
2468        assert!(count <= self.nbits && start <= self.nbits - count, "Invalid range");
2469
2470        let end = if count > (self.nbits - start) { self.nbits } else { start + count };
2471        let mut start = start;
2472        let low_overflow = 8 - (start & 7);
2473
2474        unsafe {
2475            let pointer = self.words.as_ptr_mut();
2476
2477            if low_overflow < 8 {
2478                *pointer.add(start >> 3) ^= ((1 << low_overflow) - 1) << (start & 7);
2479                start = start + low_overflow;
2480            }
2481
2482            let bytes = (end - start) >> 3;
2483            let start_byte = start >> 3;
2484
2485            for i in start_byte..(start_byte + bytes) { *pointer.add(i) = !*pointer.add(i); }
2486
2487            let overflow = (end - start) & 7;
2488
2489            if overflow > 0 { *pointer.add(start_byte + bytes) ^= (1 << overflow) - 1; }
2490        }
2491    }
2492
2493    /// Flips the state of a byte.
2494    ///
2495    /// # Examples
2496    /// ```
2497    /// # use bit_byte_bit::{Bits};
2498    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2499    ///
2500    /// x.toggle_byte(1);
2501    ///
2502    /// assert_eq!(x, Bits::from([0x0A, 0xF4, 0x0C]));
2503    ///
2504    /// x.toggle_byte(2);
2505    ///
2506    /// assert_eq!(x, Bits::slice(&[0x0A, 0xF4, 0x03], 20));
2507    ///```
2508    ///
2509    /// ```should_panic
2510    /// # use bit_byte_bit::{Bits};
2511    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2512    ///
2513    /// x.toggle_byte(3);
2514    /// ```
2515    pub fn toggle_byte(&mut self, i: usize) {
2516        assert!(i < self.size(), "Index out of range");
2517
2518        unsafe {
2519            let pointer = self.words.as_ptr_mut();
2520            *pointer.add(i) = !*pointer.add(i);
2521            *pointer.add(self.size() - 1) &= self.mask;
2522        }
2523    }
2524
2525    /// Flips the state of a range of bytes.
2526    ///
2527    /// # Examples
2528    /// ```
2529    /// # use bit_byte_bit::{Bits};
2530    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2531    ///
2532    /// x.toggle_bytes(1, 2);
2533    ///
2534    /// assert_eq!(x, Bits::slice(&[0x0A, 0xF4, 0x03], 20));
2535    /// ```
2536    ///
2537    /// ```should_panic
2538    /// # use bit_byte_bit::{Bits};
2539    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2540    ///
2541    /// x.toggle_bytes(3, 2);
2542    /// ```
2543    ///
2544    /// ```should_panic
2545    /// # use bit_byte_bit::{Bits};
2546    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2547    ///
2548    /// x.toggle_bytes(0, 4);
2549    /// ```
2550    pub fn toggle_bytes(&mut self, start: usize, count: usize) {
2551        assert!(count <= self.size() && start <= self.size() - count, "Invalid range");
2552
2553        unsafe {
2554            let pointer = self.words.as_ptr_mut();
2555
2556            let end = if count > (self.size() - start) { self.size() } else { start + count };
2557
2558            for i in start..end { *pointer.add(i) = !*pointer.add(i); }
2559
2560            if end == self.size() && self.padding > 0 { *pointer.add(end - 1) &= self.mask; }
2561        }
2562    }
2563
2564    /// The number of trailing ones.
2565    ///
2566    /// # Examples
2567    /// ```
2568    /// # use bit_byte_bit::{Bits};
2569    /// let x = Bits::from([0xFF, 0x0B, 0x0A]);
2570    ///
2571    /// assert_eq!(x.trailing_ones(), 10);
2572    /// ```
2573    pub fn trailing_ones(&self) -> usize {
2574        match self.size() {
2575            0 => 0,
2576            n => unsafe {
2577                let pointer = self.words.as_ptr_const();
2578                let mut i = 1;
2579
2580                while i < (n - 1) && *pointer.add(i - 1) == 0xFF { i += 1; }
2581
2582                ((i - 1) << 3) + ((*pointer.add(i - 1) & self.mask).trailing_ones() as usize)
2583            }
2584        }
2585    }
2586
2587    /// The number of trailing zeros.
2588    ///
2589    /// # Examples
2590    /// ```
2591    /// # use bit_byte_bit::{Bits};
2592    /// let x1 = Bits::from([0x00, 0x0A, 0x0B]);
2593    ///
2594    /// assert_eq!(x1.trailing_zeros(), 9);
2595    ///
2596    /// let x2 = Bits::zeros(20);
2597    ///
2598    /// assert_eq!(x2.trailing_zeros(), 20);
2599    /// ```
2600    pub fn trailing_zeros(&self) -> usize {
2601        match self.size() {
2602            0 => 0,
2603            n => unsafe {
2604                let pointer = self.words.as_ptr_const();
2605                let mut i = 0;
2606
2607                while i < (n - 1) && *pointer.add(i) == 0 { i += 1; }
2608
2609                let zeros = if i == (n - 1) {
2610                    let mut trailing = (*pointer.add(i) & self.mask).trailing_zeros() as usize;
2611
2612                    if *pointer.add(i) == 0 { trailing -= self.padding; }
2613
2614                    trailing
2615                } else {
2616                    (*pointer.add(i)).trailing_zeros() as usize
2617                };
2618
2619                zeros + (i << 3)
2620            }
2621        }
2622    }
2623
2624    /// Trims leading bits.
2625    ///
2626    /// # Examples
2627    /// ```
2628    /// # use bit_byte_bit::{Bits};
2629    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2630    ///
2631    /// x1.trim_end(false);
2632    ///
2633    /// assert_eq!(x1.len(), 20);
2634    /// assert_eq!(x1, Bits::from([0x0A, 0x0B, 0x0C]));
2635    ///
2636    /// x1.trim_end(true);
2637    ///
2638    /// assert_eq!(x1.len(), 18);
2639    /// assert_eq!(x1, Bits::slice(&[0x0A, 0x0B, 0x00], 18));
2640    ///
2641    /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2642    ///
2643    /// x2.trim_end(true);
2644    ///
2645    /// assert_eq!(x2.len(), 24);
2646    /// assert_eq!(x2, Bits::new([0x0A, 0x0B, 0x0C]));
2647    ///
2648    /// x2.trim_end(false);
2649    ///
2650    /// assert_eq!(x2.len(), 20);
2651    /// assert_eq!(x2, Bits::from([0x0A, 0x0B, 0x0C]));
2652    ///
2653    /// let mut x3 = Bits::slice(&[0x0A, 0x0B, 0x00], 18);
2654    ///
2655    /// x3.trim_end(false);
2656    ///
2657    /// assert_eq!(x3.len(), 12);
2658    /// assert_eq!(x3, Bits::from([0x0A, 0x0B]));
2659    ///
2660    /// let mut x4 = Bits::slice(&[0x0A, 0xFB, 0x03], 18);
2661    ///
2662    /// x4.trim_end(true);
2663    ///
2664    /// assert_eq!(x4.len(), 11);
2665    /// assert_eq!(x4, Bits::slice(&[0x0A, 0x0B], 11));
2666    /// ```
2667    pub fn trim_end(&mut self, bit: bool) {
2668        unsafe {
2669            let pointer = self.words.as_ptr_mut();
2670            *pointer.add(self.size() - 1) &= self.mask;
2671            let mut i = self.size();
2672
2673            if self.padding > 0 {
2674                let last_byte = pointer.add(self.size() - 1);
2675
2676                if bit && *last_byte != self.mask {
2677                    *last_byte <<= self.padding;
2678                    let clo = (*last_byte).leading_ones() as usize;
2679                    *last_byte <<= clo;
2680                    *last_byte >>= self.padding + clo;
2681                    self.nbits-= clo;
2682                    let overflow = self.nbits & 7;
2683                    self.padding = (8 - overflow) & 7;
2684                    self.mask = mask!(overflow);
2685
2686                    return;
2687                } else if !bit && *last_byte != 0 {
2688                    let clz = (*last_byte).leading_zeros() as usize;
2689
2690                    self.nbits = self.nbits + self.padding - clz;
2691                    let overflow = self.nbits & 7;
2692                    self.padding = (8 - overflow) & 7;
2693                    self.mask = mask!(overflow);
2694
2695                    return;
2696                }
2697
2698                i -= 1;
2699            }
2700
2701            let match_byte = if bit { 0xFF } else { 0 };
2702
2703            while i > 0 && *pointer.add(i - 1) == match_byte { i -= 1; }
2704
2705            if i == 0 {
2706                for i in 0..self.size() { *pointer.add(i) = 0; }
2707
2708                self.words.nbytes = 0;
2709                self.nbits = 0;
2710                self.padding = 0;
2711                self.mask = 0xFF;
2712                self.words.shrink_to(0);
2713
2714                return;
2715            }
2716
2717            self.words.shrink_to(i);
2718
2719            let trailing = if bit {
2720                (*pointer.add(i - 1)).leading_ones() as usize
2721            } else {
2722                (*pointer.add(i - 1)).leading_zeros() as usize
2723            };
2724
2725            self.words.nbytes = i;
2726            self.nbits = (i << 3) - trailing;
2727            let overflow = self.nbits & 7;
2728            self.padding = (8 - overflow) & 7;
2729            self.mask = mask!(overflow);
2730            *pointer.add(i - 1) &= self.mask;
2731        }
2732    }
2733
2734    /// Trims trailing bits.
2735    ///
2736    /// # Examples
2737    /// ```
2738    /// # use bit_byte_bit::{Bits};
2739    /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2740    ///
2741    /// x1.trim_start(true);
2742    ///
2743    /// assert_eq!(x1.len(), 20);
2744    /// assert_eq!(x1, Bits::from([0x0A, 0x0B, 0x0C]));
2745    ///
2746    /// x1.trim_start(false);
2747    ///
2748    /// assert_eq!(x1.len(), 19);
2749    /// assert_eq!(x1, Bits::from([0x85, 0x05, 0x06]));
2750    ///
2751    /// let mut x2 = Bits::new([0x00, 0x0A, 0x0B]);
2752    ///
2753    /// x2.trim_start(false);
2754    ///
2755    /// assert_eq!(x2.len(), 15);
2756    /// assert_eq!(x2, Bits::slice(&[0x85, 0x05], 15));
2757    ///
2758    /// let mut x3 = Bits::new([0xFF, 0x0B, 0x0C]);
2759    ///
2760    /// x3.trim_start(true);
2761    ///
2762    /// assert_eq!(x3.len(), 14);
2763    /// assert_eq!(x3, Bits::slice(&[0x02, 0x03], 14));
2764    /// ```
2765    pub fn trim_start(&mut self, bit: bool) {
2766        unsafe {
2767            let pointer = self.words.as_ptr_mut();
2768            let last = pointer.add(self.size() - 1);
2769            *last &= self.mask;
2770            let mut i = 0;
2771            let match_byte = if bit { 0xFF } else { 0 };
2772
2773            while i < (self.size() - 1) && *pointer.add(i) == match_byte { i += 1; }
2774
2775
2776            if i == (self.size() - 1) {
2777                if (bit && *last == self.mask) || (!bit && *last == 0)
2778                {
2779                    for i in 0..self.size() { *pointer.add(i) = 0; }
2780
2781                    self.words.nbytes = 0;
2782                    self.nbits = 0;
2783                    self.padding = 0;
2784                    self.mask = 0xFF;
2785
2786                    self.words.shrink_to(0);
2787
2788                    return;
2789                }
2790
2791                let trailing = if bit {
2792                    (*last).trailing_ones()
2793                } else {
2794                    (*last).trailing_zeros()
2795                } as usize;
2796
2797                *pointer = *last >> trailing;
2798
2799                self.padding += trailing;
2800                self.words.nbytes = 1;
2801                self.nbits = 8 - self.padding - trailing;
2802                self.mask = mask!(self.nbits & 7);
2803
2804                self.words.shrink_to(1);
2805
2806                return;
2807            }
2808
2809            ptr::copy(pointer.add(i), pointer, self.size() - i);
2810
2811            self.words.nbytes -= i;
2812            self.nbits -= i << 3;
2813
2814            let trailing = if bit {
2815                (*pointer).trailing_ones()
2816            } else {
2817                (*pointer).trailing_zeros()
2818            } as usize;
2819
2820            if trailing > 0 {
2821                let mask = (1 << trailing) - 1;
2822                let low = 8 - trailing;
2823
2824                self.words.shift_right(self.size(), mask, low, trailing);
2825
2826                self.nbits -= trailing;
2827                let overflow = self.nbits & 7;
2828                self.padding = (8 - overflow) & 7;
2829                self.mask = mask!(overflow);
2830            }
2831
2832            self.shrink_to_fit()
2833        }
2834    }
2835
2836    /// Bitwise exclusive or of two bit strings.
2837    ///
2838    /// # Examples
2839    /// ```
2840    /// # use bit_byte_bit::{Bits};
2841    /// let x1 = Bits::from([0x20, 0x30, 0x40]);
2842    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
2843    ///
2844    /// assert_eq!(x1.xor(&y1), Bits::from([0x80, 0x80, 0x80]));
2845    ///
2846    /// let x2 = Bits::from([0x20, 0x30, 0x40]);
2847    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
2848    ///
2849    /// assert_eq!(x2.len(), 23);
2850    /// assert_eq!(y2.len(), 24);
2851    ///
2852    /// let z = x2.xor(&y2);
2853    ///
2854    /// assert_eq!(z.len(), 24);
2855    /// ```
2856    pub fn xor(&self, rhs: &Bits) -> Bits { bitop!(self, ^, rhs) }
2857
2858    /// Bitwise exclusive or of two bit strings.
2859    ///
2860    /// # Examples
2861    /// ```
2862    /// # use bit_byte_bit::{Bits};
2863    /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
2864    /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
2865    ///
2866    /// x1.xor_mut(&y1);
2867    ///
2868    /// assert_eq!(x1, Bits::from([0x80, 0x80, 0x80]));
2869    ///
2870    /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
2871    /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
2872    ///
2873    /// assert_eq!(x2.len(), 23);
2874    /// assert_eq!(y2.len(), 24);
2875    ///
2876    /// x2.xor_mut(&y2);
2877    ///
2878    /// assert_eq!(x2.len(), 24);
2879    /// ```
2880    pub fn xor_mut(&mut self, rhs: &Bits) { bitop!(assign; self, ^=, rhs) }
2881
2882    /// Creates a bit string by copying a range of bits.
2883    ///
2884    /// The range is truncated to take no more than the number of available bits from the
2885    /// starting bound. For alternative behavior, consider [Bits::take], which pads zeros
2886    /// when the length exceeds the number of available bits.
2887    ///
2888    /// # Examples
2889    /// ```
2890    /// # use bit_byte_bit::{Bits};
2891    /// let x1 = Bits::empty();
2892    /// let x1_r1 = x1.xrange(1..18);
2893    ///
2894    /// assert_eq!(x1_r1, Bits::empty());
2895    ///
2896    /// let x2 = Bits::zeros(24);
2897    /// let x2_r1 = x2.xrange(8..24);
2898    /// let x2_r2 = x2.xrange(8..=23);
2899    ///
2900    /// assert_eq!(x2_r1, Bits::zeros(16));
2901    /// assert_eq!(x2_r2, x2_r1);
2902    ///
2903    /// let x3 = Bits::from([0x0A, 0x0B, 0x0C]);
2904    /// let x3_r1 = x3.xrange(1..2);
2905    ///
2906    /// assert_eq!(x3_r1, Bits::from([0x01]));
2907    ///
2908    /// let x3_r2 = x3.xrange(0..);
2909    /// let x3_r3 = x3.xrange(..);
2910    ///
2911    /// assert_eq!(x3_r2, x3);
2912    /// assert_eq!(x3_r3, x3_r2);
2913    ///
2914    /// let x3_r4 = x3.xrange(..32);
2915    ///
2916    /// assert_eq!(x3_r4, Bits::from([0x0A, 0x0B, 0x0C]));
2917    /// assert_eq!(x3_r4.len(), 20);
2918    ///
2919    /// let x3_r5 = x3.xrange(18..32);
2920    ///
2921    /// assert_eq!(x3_r5, Bits::from([0x3]));
2922    /// assert_eq!(x3_r5.len(), 2);
2923    ///
2924    /// let x3_r6 = x3.xrange(8..0);
2925    ///
2926    /// assert_eq!(x3_r6, Bits::empty());
2927    /// ```
2928    pub fn xrange<R: RangeBounds<usize>>(&self, bounds: R) -> Self {
2929        if let Bound::Excluded(&usize::MAX) = bounds.start_bound() {
2930            return Bits::empty();
2931        } else if let Bound::Excluded(&0) = bounds.end_bound() {
2932            return Bits::empty();
2933        }
2934
2935        let start = match bounds.start_bound() {
2936            Bound::Included(n) if *n < self.nbits => *n,
2937            Bound::Unbounded => 0,
2938            Bound::Excluded(n) if *n < self.nbits => *n + 1,
2939            _ => self.nbits,
2940        };
2941
2942        let end = match bounds.end_bound() {
2943            Bound::Excluded(n) if *n < self.nbits => *n,
2944            Bound::Included(n) if *n < self.nbits => *n + 1,
2945            _ => self.nbits,
2946        };
2947
2948        if start >= end {
2949            Bits::empty()
2950        } else {
2951            Bits::take(self.bytes(), start, end - start)
2952        }
2953    }
2954
2955    fn cons_bit(&mut self, nbits: usize, fill: u8) {
2956        unsafe {
2957            let (nbytes_padding, overflow) = divrem8!(ceil; nbits);
2958            let nbytes = self.size() + nbytes_padding;
2959
2960            self.words.expand_to(nbytes);
2961
2962            let pointer = self.words.as_ptr_mut();
2963
2964            if self.size() > 0 { *pointer.add(self.size() - 1) &= self.mask; }
2965
2966            ptr::copy(pointer, pointer.add(nbytes_padding), self.size());
2967
2968            for i in 0..nbytes_padding { ptr::write(pointer.add(i), fill); }
2969
2970            *pointer.add(nbytes_padding - 1) &= mask!(overflow);
2971
2972            if overflow > 0 {
2973                let clz = 8 - overflow;
2974                let mask = (1 << clz) - 1;
2975
2976                self.words.shift_right_from(nbytes_padding, nbytes, mask, overflow, clz);
2977            }
2978
2979            self.words.nbytes = nbytes;
2980            self.nbits += nbits;
2981            let new_overflow = self.nbits & 7;
2982            self.padding = (8 - new_overflow) & 7;
2983            self.mask = mask!(new_overflow);
2984            self.shrink_to_fit();
2985        }
2986    }
2987
2988    fn push_ones(&mut self, count: usize) {
2989        unsafe {
2990            let pointer = self.words.as_ptr_mut();
2991            *pointer.add(self.size() - 1) &= self.mask;
2992            let overflow = self.nbits & 7;
2993
2994            if self.padding > 0 && count <= self.padding {
2995                *pointer.add(self.size() - 1) |= ((1 << count) - 1) << overflow;
2996            } else {
2997                *pointer.add(self.size() - 1) |= ((1 << self.padding) - 1) << overflow;
2998
2999                let (byte_len, overflow) = divrem8!(ceil; count - self.padding);
3000
3001                self.words.expand_to(self.size() + byte_len);
3002
3003                let pointer = self.words.as_ptr_mut().add(self.size());
3004
3005                for i in 0..(byte_len - 1) { ptr::write(pointer.add(i), 0xFF); }
3006
3007                ptr::write(pointer.add(byte_len - 1), mask!(overflow));
3008
3009                self.words.nbytes += byte_len;
3010            }
3011
3012            self.nbits += count;
3013            let overflow = self.nbits & 7;
3014            self.padding = (8 - overflow) & 7;
3015            self.mask = mask!(overflow);
3016        }
3017    }
3018
3019    fn push_zeros(&mut self, count: usize) {
3020        unsafe {
3021            let pointer = self.words.as_ptr_mut();
3022            *pointer.add(self.size() - 1) &= self.mask;
3023
3024            if self.padding == 0 || count > self.padding {
3025                let byte_len = 1 + ((count - self.padding - 1) >> 3);
3026
3027                self.words.expand_to(self.size() + byte_len);
3028
3029                let pointer = self.words.as_ptr_mut().add(self.size());
3030
3031                for i in 0..byte_len { ptr::write(pointer.add(i), 0); }
3032
3033                self.words.nbytes += byte_len;
3034            }
3035
3036            self.nbits += count;
3037            let overflow = self.nbits & 7;
3038            self.padding = (8 - overflow) & 7;
3039            self.mask = mask!(overflow);
3040        }
3041    }
3042
3043    fn shrink_to_fit(&mut self) { self.words.shrink_to(1 + ((self.nbits - 1) >> 3)); }
3044}
3045
3046impl Binary for Bits {
3047    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
3048        unsafe {
3049            let aptr = self.words.as_ptr_const();
3050
3051            if self.padding == 0 {
3052                for i in (0..self.size()).rev() { write!(f, "{:08b}", *aptr.add(i))?; }
3053            } else {
3054                write!(
3055                    f,
3056                    "{:01$b}",
3057                    *aptr.add(self.size() - 1) & self.mask,
3058                    8 - self.padding
3059                )?;
3060
3061                for i in (0..(self.size() - 1)).rev() {
3062                    write!(f, "{:08b}", *aptr.add(i))?;
3063                }
3064            }
3065
3066            Ok(())
3067        }
3068    }
3069}
3070
3071impl Clone for Bits {
3072    fn clone(&self) -> Self {
3073        match self.size() {
3074            0 => Bits::empty(),
3075            nbytes => unsafe {
3076                let pointer = self.words.as_ptr_mut();
3077                let layout = Layout::array::<u8>(nbytes).unwrap();
3078                let clone = alloc::alloc(layout);
3079
3080                for i in 0..nbytes { ptr::write(clone.add(i), *pointer.add(i)); }
3081
3082                *clone.add(nbytes - 1) &= self.mask;
3083
3084                let bytes = RawBytes { bytes: NonNull::new(clone).unwrap(), cap: nbytes, nbytes };
3085
3086                Bits { words: bytes, mask: self.mask, nbits: self.nbits, padding: self.padding }
3087            }
3088        }
3089    }
3090}
3091
3092impl Debug for Bits {
3093    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
3094        write!(f, "Bits<")?;
3095        Binary::fmt(&self, f)?;
3096        write!(f, ": {}>", self.nbits)
3097    }
3098}
3099
3100impl Display for Bits {
3101    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { Binary::fmt(&self, f) }
3102}
3103
3104impl Div<usize> for &Bits {
3105    type Output = (Bits, Bits);
3106
3107    /// Splits the bit string.
3108    ///
3109    /// When the index is greater than or equal to the length
3110    /// of the bit string, the second element of the returned
3111    /// pair will be empty. When the index is `0`, the first
3112    /// element will be empty.
3113    ///
3114    /// # Examples
3115    /// ```
3116    /// # use bit_byte_bit::{Bits};
3117    /// let x1 = Bits::empty();
3118    /// let (l1, r1) = &x1 / 11;
3119    ///
3120    /// assert_eq!(l1.len(), 0);
3121    /// assert_eq!(r1.len(), 0);
3122    ///
3123    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
3124    /// let (l2, r2) = &x2 / 20;
3125    ///
3126    /// assert_eq!(l2, x2);
3127    /// assert_eq!(r2.len(), 0);
3128    ///
3129    /// let (l3, r3) = &x2 / 0;
3130    ///
3131    /// assert_eq!(l3.len(), 0);
3132    /// assert_eq!(r3, x2);
3133    ///
3134    /// let (l4, r4) = &x2 / 11;
3135    ///
3136    /// assert_eq!(l4, Bits::slice(&[0x0A, 0x03], 11));
3137    /// assert_eq!(r4, Bits::slice(&[0x81, 0x01], 9));
3138    /// ```
3139    fn div(self, index: usize) -> Self::Output { self.split(index) }
3140}
3141
3142impl Div<usize> for Bits {
3143    type Output = (Bits, Bits);
3144
3145    /// Splits the bit string.
3146    ///
3147    /// When the index is greater than or equal to the length
3148    /// of the bit string, the second element of the returned
3149    /// pair will be empty. When the index is `0`, the first
3150    /// element will be empty.
3151    ///
3152    /// # Examples
3153    /// ```
3154    /// # use bit_byte_bit::{Bits};
3155    /// let x1 = Bits::empty();
3156    /// let (l1, r1) = x1 / 11;
3157    ///
3158    /// assert_eq!(l1.len(), 0);
3159    /// assert_eq!(r1.len(), 0);
3160    ///
3161    /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
3162    ///
3163    /// let (l2, r2) = x2 / 11;
3164    ///
3165    /// assert_eq!(l2, Bits::slice(&[0x0A, 0x03], 11));
3166    /// assert_eq!(r2, Bits::slice(&[0x81, 0x01], 9));
3167    /// ```
3168    fn div(self, index: usize) -> Self::Output { self.split(index) }
3169}
3170
3171impl Drop for Bits {
3172    fn drop(&mut self) {
3173
3174        if self.words.nbytes > 0 {
3175            unsafe {
3176                let pointer = self.words.as_ptr_mut();
3177
3178                for i in 0..self.words.nbytes { ptr::read(pointer.add(i)); }
3179            }
3180        }
3181    }
3182}
3183
3184impl Eq for Bits {}
3185
3186impl From<&[u8]> for Bits {
3187    /// Creates a bit string from a sequence of bytes, ignoring leading zeros.
3188    ///
3189    /// # Examples
3190    /// ```
3191    /// # use bit_byte_bit::{Bits};
3192    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C, 0x00].as_slice());
3193    ///
3194    /// assert_eq!(x.len(), 20);
3195    /// ```
3196    fn from(data: &[u8]) -> Self { Self::from(data.to_vec()) }
3197}
3198
3199impl<const N: usize> From<[u8; N]> for Bits {
3200    /// Creates a bit string from a sequence of bytes, ignoring leading zeros.
3201    ///
3202    /// # Examples
3203    /// ```
3204    /// # use bit_byte_bit::{Bits};
3205    /// let mut x = Bits::from([0x0A, 0x0B, 0x0C, 0x00]);
3206    ///
3207    /// assert_eq!(x.len(), 20);
3208    /// ```
3209    fn from(bytes: [u8; N]) -> Self {
3210        let mut nbytes = N;
3211
3212        while nbytes > 0 && bytes[nbytes - 1] == 0 { nbytes -= 1; }
3213
3214        if nbytes == 0 {
3215            Bits::empty()
3216        } else {
3217            let nbits = (nbytes << 3) - (bytes[nbytes - 1].leading_zeros() as usize);
3218            let mut truncated_bytes = bytes[..nbytes].to_vec();
3219            let pointer = truncated_bytes.as_mut_ptr();
3220
3221            std::mem::forget(truncated_bytes);
3222
3223            let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
3224            let overflow = nbits & 7;
3225
3226            Bits { words: bytes, mask: mask!(overflow), nbits, padding: (8 - overflow) & 7 }
3227        }
3228    }
3229}
3230
3231impl From<Vec<u8>> for Bits  {
3232    /// Creates a bit string from a sequence of bytes, ignoring leading zeros.
3233    ///
3234    /// # Examples
3235    /// ```
3236    /// # use bit_byte_bit::{Bits};
3237    /// let mut x = Bits::from(vec![0x0A, 0x0B, 0x0C, 0x00]);
3238    ///
3239    /// assert_eq!(x.len(), 20);
3240    /// ```
3241    fn from(mut bytes: Vec<u8>) -> Self {
3242        let mut nbytes = bytes.len();
3243
3244        while nbytes > 0 && bytes[nbytes - 1] == 0 { nbytes -= 1; }
3245
3246        match nbytes {
3247            0 => Bits::empty(),
3248            nbytes => {
3249                let nbits = (nbytes << 3) - (bytes[nbytes - 1].leading_zeros() as usize);
3250
3251                bytes.truncate(nbytes);
3252
3253                let cap = bytes.capacity();
3254                let pointer = bytes.as_mut_ptr();
3255                let overflow = nbits & 7;
3256
3257                std::mem::forget(bytes);
3258
3259                let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap, nbytes };
3260
3261                Bits { words: bytes, mask: mask!(overflow), nbits, padding: (8 - overflow) & 7 }
3262            }
3263        }
3264    }
3265}
3266
3267impl From<&[bool]> for Bits {
3268    /// Creates a bit string from booleans.
3269    ///
3270    /// # Examples
3271    /// ```
3272    /// # use bit_byte_bit::{Bits};
3273    /// let bits1 = vec![true, false, true, true, false, true, true];
3274    /// let x1 = Bits::from(bits1.as_slice());
3275    ///
3276    /// assert_eq!(x1.len(), 7);
3277    /// assert_eq!(x1, Bits::from([0x6D]));
3278    ///
3279    /// let bits2 = vec![true, false, true, false, false, false, false, false, false];
3280    /// let x2 = Bits::from(bits2.as_slice());
3281    ///
3282    /// assert_eq!(x2.len(), 9);
3283    /// assert_eq!(x2, Bits::slice(&[0x05, 0x00], 9));
3284    /// ```
3285    fn from(bits: &[bool]) -> Self {
3286        match bits.len() {
3287            0 => Bits::empty(),
3288            nbits => unsafe {
3289                let (nbytes, overflow) = divrem8!(ceil; nbits);
3290                let padding = (8 - overflow) & 7;
3291                let mask = mask!(overflow);
3292                let layout = Layout::array::<u8>(nbytes).unwrap();
3293                let pointer = alloc::alloc(layout);
3294
3295                for i in 0..(nbytes - 1) {
3296                    let mut b = 0;
3297                    let j = i << 3;
3298
3299                    if bits[j + 0] { b |= 1; }
3300                    if bits[j + 1] { b |= 2; }
3301                    if bits[j + 2] { b |= 4; }
3302                    if bits[j + 3] { b |= 8; }
3303                    if bits[j + 4] { b |= 16; }
3304                    if bits[j + 5] { b |= 32; }
3305                    if bits[j + 6] { b |= 64; }
3306                    if bits[j + 7] { b |= 128; }
3307
3308                    ptr::write(pointer.add(i), b);
3309                }
3310
3311                let mut b = 0;
3312
3313                for i in 0..(8 - padding) {
3314                    if bits[nbits - overflow + i] { b |= 1 << i; }
3315                }
3316
3317                ptr::write(pointer.add(nbytes - 1), b);
3318
3319                let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
3320
3321                Bits { words: bytes, mask, nbits, padding }
3322            }
3323        }
3324    }
3325}
3326
3327impl<const N: usize> From<[bool; N]> for Bits {
3328    /// Creates a bit string from booleans.
3329    ///
3330    /// # Examples
3331    /// ```
3332    /// # use bit_byte_bit::{Bits};
3333    /// let x1 = Bits::from([true, false, true, true, false, true, true]);
3334    ///
3335    /// assert_eq!(x1.len(), 7);
3336    /// assert_eq!(x1, Bits::from([0x6D]));
3337    ///
3338    /// let x2 = Bits::from([true, false, true, false, false, false, false, false, false]);
3339    ///
3340    /// assert_eq!(x2.len(), 9);
3341    /// assert_eq!(x2, Bits::slice(&[0x05, 0x00], 9));
3342    /// ```
3343    fn from(bits: [bool; N]) -> Self { Bits::from(bits.as_slice()) }
3344}
3345
3346impl From<Vec<bool>> for Bits {
3347    /// Creates a bit string from booleans.
3348    ///
3349    /// # Examples
3350    /// ```
3351    /// # use bit_byte_bit::{Bits};
3352    /// let bits1 = vec![true, false, true, true, false, true, true];
3353    /// let x1 = Bits::from(bits1);
3354    ///
3355    /// assert_eq!(x1.len(), 7);
3356    /// assert_eq!(x1, Bits::from([0x6D]));
3357    ///
3358    /// let bits2 = vec![true, false, true, false, false, false, false, false, false];
3359    /// let x2 = Bits::from(bits2);
3360    ///
3361    /// assert_eq!(x2.len(), 9);
3362    /// assert_eq!(x2, Bits::slice(&[0x05, 0x00], 9));
3363    /// ```
3364    fn from(bits: Vec<bool>) -> Self { Bits::from(bits.as_slice()) }
3365}
3366
3367impl FromIterator<u8> for Bits {
3368    /// Creates a bit string from a sequence of bytes, ignoring leading zeros.
3369    ///
3370    /// # Examples
3371    /// ```
3372    /// # use bit_byte_bit::{Bits};
3373    /// let mut x = Bits::from_iter([0x0A, 0x0B, 0x0C, 0x00]);
3374    ///
3375    /// assert_eq!(x.len(), 20);
3376    /// ```
3377    fn from_iter<I: IntoIterator<Item=u8>>(iter: I) -> Self {
3378        Bits::from(iter.into_iter().collect::<Vec<u8>>())
3379    }
3380}
3381
3382impl FromIterator<bool> for Bits {
3383    fn from_iter<I: IntoIterator<Item=bool>>(iter: I) -> Self {
3384        Bits::from(iter.into_iter().collect::<Vec<bool>>())
3385    }
3386}
3387
3388impl Ord for Bits {
3389    /// Compares a bit string with another
3390    ///
3391    /// # Examples
3392    /// ```
3393    /// # use std::cmp::Ordering;
3394    /// # use bit_byte_bit::Bits;
3395    ///
3396    /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
3397    /// let y = Bits::from([0x09, 0x0B, 0x0C]);
3398    /// let z = Bits::from([0x0A, 0x09, 0x0D]);
3399    ///
3400    /// assert_eq!(x.cmp(&y), Ordering::Greater);
3401    /// assert_eq!(x.cmp(&z), Ordering::Less);
3402    /// ```
3403    fn cmp(&self, other: &Self) -> Ordering {
3404        match other.leading_zeros().cmp(&self.leading_zeros()) {
3405            Ordering::Equal => unsafe {
3406                let aptr= self.words.as_ptr_const();
3407                let bptr = other.words.as_ptr_const();
3408
3409                for i in (0..self.size()).rev() {
3410                    match (*aptr.add(i)).cmp(&*bptr.add(i)) {
3411                        Ordering::Equal => (),
3412                        ord => return ord,
3413                    }
3414                }
3415
3416                Ordering::Equal
3417            },
3418            ord => ord,
3419        }
3420    }
3421}
3422
3423impl PartialEq for Bits {
3424    /// Whether two bit strings are equal.
3425    ///
3426    /// # Examples
3427    /// ```
3428    /// # use bit_byte_bit::{Bits};
3429    /// let x = Bits::from([0x20, 0x30, 0x40]);
3430    ///
3431    /// assert!(Bits::eq(&x, &x));
3432    ///
3433    /// let y = Bits::from([0xA0, 0xB0, 0xC0]);
3434    ///
3435    /// assert!(Bits::ne(&x, &y));
3436    ///
3437    /// let z1 = Bits::from([0x20, 0x30, 0x40, 0x00]);
3438    ///
3439    /// assert!(Bits::eq(&x, &z1));
3440    ///
3441    /// let z2 = Bits::new([0x20, 0x30, 0x40, 0x00]);
3442    ///
3443    /// assert!(Bits::ne(&x, &z2));
3444    /// ```
3445    fn eq(&self, other: &Self) -> bool {
3446        match (self.nbits, other.nbits) {
3447            (0, 0) => true,
3448            (a, b) if a != b => false,
3449            _ => unsafe {
3450                let aptr = self.words.as_ptr_const();
3451                let bptr = other.words.as_ptr_const();
3452
3453                for i in 0..(self.size() - 1) {
3454                    if *aptr.add(i) != *bptr.add(i) { return false; }
3455                }
3456
3457                let last_a = *aptr.add(self.size() - 1) & self.mask;
3458                let last_b = *bptr.add(other.size() - 1) & other.mask;
3459
3460                last_a == last_b
3461            }
3462        }
3463    }
3464}
3465
3466impl PartialOrd for Bits {
3467    /// Compares a bit string with another
3468    ///
3469    /// # Examples
3470    /// ```
3471    /// # use std::cmp::Ordering;
3472    /// # use bit_byte_bit::Bits;
3473    ///
3474    /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
3475    /// let y = Bits::from([0x09, 0x0B, 0x0C]);
3476    /// let z = Bits::from([0x0A, 0x09, 0x0D]);
3477    ///
3478    /// assert_eq!(x.partial_cmp(&y), Some(Ordering::Greater));
3479    /// assert_eq!(x.partial_cmp(&z), Some(Ordering::Less));
3480    /// ```
3481    fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(self.cmp(other)) }
3482}
3483
3484unsafe impl Send for Bits {}
3485
3486unsafe impl Sync for Bits {}