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 {}