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