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