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