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