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.xor(&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};
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//!
159//! ## Note about endianness
160//!
161//! While the library does not implement any notion of endianness, indexing and methods ending
162//! in either `_left` or `_right` assume bit<sub>0</sub> of an n-bit string is the most right bit,
163//! while bit<sub>n-1</sub> is most left.
164
165use std::ptr::NonNull;
166use std::{alloc, ptr, slice};
167use std::alloc::Layout;
168use std::cmp::Ordering;
169use std::fmt::{Binary, Debug, Display, Formatter};
170use std::iter::FusedIterator;
171use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Bound, Div, Not, RangeBounds, Shl, ShlAssign, Shr, ShrAssign};
172
173
174macro_rules! bitop {
175 ($self:expr, $op:tt, $rhs:expr) => {
176 unsafe {
177 let (mut min, mut nbytes, mut nbits) = ($self.size(), $rhs.size(), $rhs.nbits);
178 let (mut padding, mut mask) = ($rhs.padding, $rhs.mask);
179 let aptr = $self.words.as_ptr_const();
180 let bptr = $rhs.words.as_ptr_const();
181
182 if $rhs.nbits < $self.nbits {
183 (min, nbytes, nbits) = ($rhs.size(), $self.size(), $self.nbits);
184 (padding, mask) = ($self.padding, $self.mask);
185 }
186
187 let layout = Layout::array::<u8>(nbytes).unwrap();
188 let result = alloc::alloc(layout);
189
190 for i in 0..min { ptr::write(result.add(i), *aptr.add(i) $op *bptr.add(i)); }
191
192 match $self.size().cmp(&$rhs.size()) {
193 Ordering::Greater => for i in $rhs.size()..$self.size() {
194 ptr::write(result.add(i), *aptr.add(i))
195 },
196 Ordering::Less => for i in $self.size()..$rhs.size() {
197 ptr::write(result.add(i), *bptr.add(i));
198 },
199 _ => ()
200 }
201
202 *result.add(nbytes - 1) &= mask;
203
204 let bytes = RawBytes { bytes: NonNull::new(result).unwrap(), cap: nbytes, nbytes };
205
206 Bits { words:bytes, mask, nbits, padding }
207 }
208 };
209 (assign; $self:expr, $op:tt, $rhs:expr) => {
210 unsafe {
211 let aptr = $self.words.as_ptr_mut();
212 let bptr = $rhs.words.as_ptr_const();
213 let (lsize, rsize) = ($self.size(), $rhs.size());
214 let min = if rsize < lsize { rsize } else { lsize };
215
216 for i in 0..min { *aptr.add(i) $op *bptr.add(i); }
217
218 if $self.nbits < $rhs.nbits {
219 let aptr = $self.words.as_ptr_mut();
220
221 $self.words.expand_to(rsize);
222
223 for i in lsize..rsize { ptr::write(aptr.add(i), *bptr.add(i)); }
224
225 $self.mask = $rhs.mask;
226 $self.nbits = $rhs.nbits;
227 $self.words.nbytes = rsize;
228 $self.padding = $rhs.padding;
229
230 if lsize > 0 { *aptr.add(lsize - 1) &= $self.mask; }
231 }
232 }
233 };
234}
235
236macro_rules! divrem8 {
237 ($n:expr) => { ($n >> 3, $n & 7) };
238 (ceil; $n:expr) => { (1 + (($n - 1) >> 3), $n & 7) };
239}
240
241macro_rules! mask {
242 ($shift:expr) => {
243 if $shift == 0 { 0xFF } else { ((1 << $shift) - 1) as u8 }
244 };
245}
246
247macro_rules! pointer {
248 ($size:expr) => {{
249 let layout = Layout::array::<u8>($size).unwrap();
250
251 assert!(layout.size() <= isize::MAX as usize, "Allocation too large");
252
253 let pointer = alloc::alloc(layout);
254
255 pointer
256 }};
257 ($fill:expr; $size:expr) => {{
258 let layout = Layout::array::<u8>($size).unwrap();
259
260 assert!(layout.size() <= isize::MAX as usize, "Allocation too large");
261
262 let pointer = alloc::alloc(layout);
263
264 for i in 0..$size { ptr::write(pointer.add(i), $fill); }
265
266 pointer
267 }};
268}
269
270
271pub(crate) fn get_bits(src: &[u8], start: usize, length: usize) -> Vec<u8> {
272 let nbytes_src = src.len();
273 let (start_byte, start_idx) = divrem8!(start);
274 let (nbytes, overflow) = divrem8!(ceil; length);
275 let mut bytes = vec![0; nbytes];
276 let take_all = nbytes >= (nbytes_src - start_byte);
277
278 if start_idx > 0 {
279 let shift_mask = (1 << start_idx) - 1;
280 let upper_length = 8 - start_idx;
281 let end_byte = if take_all { nbytes_src - 1 } else { start_byte + nbytes };
282
283 for i in start_byte..end_byte {
284 bytes[i - start_byte] = src[i] >> start_idx;
285 bytes[i - start_byte] |= (src[i + 1] & shift_mask) << upper_length;
286 }
287
288 if take_all { bytes[nbytes_src - start_byte - 1] = src[nbytes_src - 1] >> start_idx; }
289 } else {
290 let end_byte = if take_all { nbytes_src } else { nbytes };
291
292 for i in start_byte..end_byte { bytes[i - start_byte] = src[i] }
293 }
294
295 bytes[nbytes - 1] &= mask!(overflow);
296
297 bytes
298}
299
300fn trim(mut bytes: Vec<u8>) -> Vec<u8> {
301 let (mut upper_bound, mut i) = (bytes.len().saturating_sub(1), 0);
302
303 while i < upper_bound {
304 if bytes[i] == 0 {
305 bytes.remove(i);
306 upper_bound -= 1;
307 } else {
308 let clz = bytes[i].leading_zeros() as usize;
309
310 if clz > 0 {
311 let (mask, low) = ((1 << clz) - 1, 8 - clz);
312
313 bytes[i] |= (bytes[i + 1] & mask) << low;
314 bytes[i + 1] >>= clz;
315
316 if bytes[i + 1] == 0 {
317 bytes.remove(i + 1);
318 upper_bound -= 1;
319
320 if bytes[i].leading_zeros() == 0 { i += 1; }
321 } else {
322 i += 1;
323 }
324 } else {
325 i += 1;
326 }
327 }
328 }
329
330 bytes
331}
332
333
334struct RawBytes {
335 cap: usize,
336 bytes: NonNull<u8>,
337 nbytes: usize
338}
339
340impl RawBytes {
341 fn as_ptr_const(&self) -> *const u8 { self.bytes.as_ptr().cast_const() }
342
343 fn as_ptr_mut(&self) -> *mut u8 { self.bytes.as_ptr() }
344
345 fn expand_to(&mut self, nbytes: usize) {
346 let new_layout = Layout::array::<u8>(nbytes).unwrap();
347
348 assert!(new_layout.size() <= isize::MAX as usize, "Allocation too large");
349
350 let pointer = if self.cap == 0 {
351 unsafe { alloc::alloc(new_layout) }
352 } else {
353 let old_layout = Layout::array::<u8>(self.cap).unwrap();
354 let old_pointer = self.bytes.as_ptr();
355
356 unsafe { alloc::realloc(old_pointer, old_layout, new_layout.size()) }
357 };
358
359 self.bytes = match NonNull::new(pointer) {
360 Some(p) => p,
361 None => alloc::handle_alloc_error(new_layout)
362 };
363
364 self.cap = nbytes;
365 }
366
367 fn shift_right(&mut self, end: usize, mask: u8, up: usize, down: usize) {
368 unsafe {
369 let pointer = self.bytes.as_ptr();
370
371 for i in 0..(end - 1) {
372 *pointer.add(i) >>= down;
373 *pointer.add(i) |= (*pointer.add(i + 1) & mask) << up;
374 }
375
376 *pointer.add(end - 1) >>= down;
377 }
378 }
379
380 fn shift_right_from(&mut self, start: usize, end: usize, mask: u8, up: usize, down: usize) {
381 unsafe {
382 let pointer = self.bytes.as_ptr();
383
384 for i in start..end {
385 *pointer.add(i - 1) |= (*pointer.add(i) & mask) << up;
386 *pointer.add(i) >>= down;
387 }
388 }
389 }
390
391 fn shrink_to(&mut self, nbytes: usize) {
392 if self.cap <= nbytes { return; }
393
394 let old_layout = Layout::array::<u8>(self.cap).unwrap();
395 let old_pointer = self.bytes.as_ptr();
396
397 unsafe {
398 for i in nbytes..self.nbytes { ptr::read(old_pointer.add(i)); }
399
400 if nbytes == 0 {
401 alloc::dealloc(old_pointer, old_layout);
402 self.bytes = NonNull::dangling();
403 } else {
404 let new_layout = Layout::array::<u8>(nbytes).unwrap();
405 let pointer = alloc::realloc(old_pointer, old_layout, new_layout.size());
406
407 self.bytes = match NonNull::new(pointer) {
408 Some(p) => p,
409 None => alloc::handle_alloc_error(new_layout)
410 };
411 }
412 }
413
414 self.cap = nbytes;
415 self.nbytes = nbytes;
416 }
417}
418
419impl Drop for RawBytes {
420 fn drop(&mut self) {
421
422 if self.cap != 0 {
423 unsafe {
424 alloc::dealloc(self.bytes.as_ptr(), Layout::array::<u8>(self.cap).unwrap());
425 }
426 }
427 }
428}
429
430unsafe impl Send for RawBytes {}
431
432unsafe impl Sync for RawBytes {}
433
434
435
436pub struct Bits {
437 words: RawBytes,
438 mask: u8,
439 nbits: usize,
440 padding: usize,
441}
442
443impl Bits {
444 /// Creates a bit string from a sequence of bytes.
445 ///
446 /// To ignore leading zeros use [Bits::from] or [Bits::from_iter].
447 ///
448 /// # Examples
449 /// ```
450 /// # use bit_byte_bit::{Bits};
451 /// let mut x = Bits::new([0x0A, 0x0B, 0x0C, 0x00]);
452 ///
453 /// assert_eq!(x.len(), 32);
454 /// ```
455 pub fn new<I: IntoIterator<Item = u8>>(bits: I) -> Self {
456 let mut bytes = bits.into_iter().collect::<Vec<u8>>();
457
458 match bytes.len() {
459 0 => Bits::empty(),
460 nbytes => {
461 bytes.shrink_to(nbytes);
462
463 let cap = bytes.capacity();
464 let pointer = bytes.as_mut_ptr();
465
466 std::mem::forget(bytes);
467
468 let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap, nbytes };
469
470 Bits { words: bytes, mask: 0xFF, nbits: nbytes << 3, padding: 0 }
471 }
472 }
473 }
474
475 /// Creates a bit string with an aligned length.
476 ///
477 /// # Examples
478 /// ```
479 /// # use bit_byte_bit::{Bits};
480 /// let mut x = Bits::aligned(17, [0x0A, 0x0B, 0x0C]);
481 ///
482 /// assert_eq!(x.len(), 34);
483 /// assert_eq!(x, Bits::slice(&[0x0A, 0x0B, 0x0C, 0x00, 0x00], 34));
484 /// ```
485 pub fn aligned<I: IntoIterator<Item = u8>>(units: usize, bits: I) -> Self {
486 match units {
487 0 => Bits::empty(),
488 1 => Bits::from_iter(bits),
489 8 => Bits::new(bits),
490 units => {
491 let mut bytes = bits.into_iter().collect::<Vec<u8>>();
492 let mut nbits = bytes.len() << 3;
493 let overflow = nbits % units;
494
495 if overflow > 0 {
496 nbits += units - overflow;
497
498 for _ in 0..(1 + ((units - 1) >> 3)) { bytes.push(0); }
499 }
500
501 let nbytes = bytes.len();
502
503 if nbytes == 0 {
504 Bits::empty()
505 } else {
506 bytes.shrink_to(nbytes);
507
508 let cap = bytes.capacity();
509 let pointer = bytes.as_mut_ptr();
510
511 std::mem::forget(bytes);
512
513 let overflow = nbits & 7;
514
515 let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap, nbytes };
516
517 Bits { words: bytes, mask: mask!(overflow), nbits, padding: (8 - overflow) & 7 }
518 }
519 }
520 }
521 }
522
523 /// Creates an empty bit string.
524 ///
525 /// # Examples
526 /// ```
527 /// # use bit_byte_bit::{Bits};
528 /// let mut x = Bits::empty();
529 ///
530 /// assert_eq!(x.len(), 0);
531 /// ```
532 pub fn empty() -> Self {
533 let bytes = RawBytes { bytes: NonNull::dangling(), cap: 0, nbytes: 0 };
534
535 Bits { words: bytes, mask: 0xFF, nbits: 0, padding: 0 }
536 }
537
538 /// Creates a bit string of ones.
539 ///
540 /// # Examples
541 /// ```
542 /// # use bit_byte_bit::{Bits};
543 /// let mut x = Bits::ones(4);
544 ///
545 /// assert_eq!(x.len(), 4);
546 /// assert_eq!(x, Bits::from([0x0F]));
547 /// ```
548 pub fn ones(length: usize) -> Self {
549 match length {
550 0 => Bits::empty(),
551 length => unsafe {
552 let nbytes = 1 + ((length - 1) >> 3);
553 let overflow = length & 7;
554 let padding = (8 - overflow) & 7;
555 let mask = mask!(overflow);
556 let pointer = pointer![0xFFu8; nbytes];
557
558 *pointer.add(nbytes - 1) &= mask;
559
560 let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
561
562 Bits { words: bytes, mask, nbits: length, padding }
563 }
564 }
565 }
566
567 /// Creates a bit string by concatenating a slice of bytes removing leading zeros.
568 ///
569 /// # Examples
570 /// ```
571 /// # use bit_byte_bit::{Bits};
572 /// let x1 = Bits::packed([0x00, 0x00, 0x00]);
573 ///
574 /// assert_eq!(x1, Bits::empty());
575 ///
576 /// let x2 = Bits::packed([0x0A, 0x0B, 0x0C]);
577 ///
578 /// assert_eq!(x2, Bits::from([0xBA, 0x0C]));
579 /// assert_eq!(x2.len(), 12);
580 /// ```
581 pub fn packed<I: IntoIterator<Item = u8>>(bytes: I) -> Self {
582 Bits::from(trim(bytes.into_iter().collect::<Vec<u8>>()))
583 }
584
585 /// Creates a bit string by copying a given number of bits from a slice of bytes.
586 ///
587 /// When the length is greater than the available number of bits in the source,
588 /// the result is padded with zeros.
589 ///
590 /// # Examples
591 /// ```
592 /// # use bit_byte_bit::{Bits};
593 /// let x1 = Bits::slice(&[], 17);
594 ///
595 /// assert_eq!(x1, Bits::zeros(17));
596 ///
597 /// let x2 = Bits::slice(&[0x0A, 0x0B, 0x0C], 0);
598 ///
599 /// assert_eq!(x2, Bits::empty());
600 ///
601 /// let x3 = Bits::slice(&[0x0A, 0x0B, 0x0C], 19);
602 ///
603 /// assert_eq!(x3, Bits::from([0x0A, 0x0B, 0x04]));
604 ///
605 /// let x4 = Bits::slice(&[0x00, 0x00, 0x00], 19);
606 ///
607 /// assert_eq!(x4, Bits::zeros(19));
608 /// ```
609 pub fn slice(src: &[u8], length: usize) -> Self { Bits::take(src, 0, length) }
610
611 /// Creates a bit string by copying a given range of bits from a slice of bytes.
612 ///
613 /// When the length is greater than the available number of bits in the source,
614 /// the result is padded with zeros.
615 ///
616 /// # Examples
617 /// ```
618 /// # use bit_byte_bit::{Bits};
619 /// let x1 = Bits::take(&[], 1, 17);
620 ///
621 /// assert_eq!(x1, Bits::zeros(17));
622 ///
623 /// let x2 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 0);
624 ///
625 /// assert_eq!(x2, Bits::empty());
626 ///
627 /// let x3 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 1);
628 ///
629 /// assert_eq!(x3, Bits::from([0x01]));
630 ///
631 /// let x4 = Bits::take(&[0x0A, 0x0B, 0x0C], 25, 17);
632 ///
633 /// assert_eq!(x4, Bits::zeros(17));
634 ///
635 /// let x5 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 17);
636 ///
637 /// assert_eq!(x5.bytes().to_vec(), vec![0x85, 0x05, 0x00]);
638 ///
639 /// let x6 = Bits::take(&[0x0A, 0x0B, 0x0C], 1, 16);
640 ///
641 /// assert_eq!(x6.bytes().to_vec(), vec![0x85, 0x05]);
642 ///
643 /// let x7 = Bits::take(&[0x00, 0x00, 0x00], 1, 17);
644 ///
645 /// assert_eq!(x7, Bits::zeros(17));
646 /// ```
647 pub fn take(src: &[u8], start: usize, length: usize) -> Self {
648 if length == 0 { return Bits::empty(); }
649
650 let nbytes_src = src.len();
651
652 if nbytes_src == 0 || start >= (nbytes_src << 3) { return Bits::zeros(length); }
653
654 let (nbytes, overflow) = divrem8!(ceil; length);
655 let mut bytes = get_bits(src, start, length);
656 let pointer = bytes.as_mut_ptr();
657
658 std::mem::forget(bytes);
659
660 let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
661
662 Bits { words: bytes, mask: mask!(overflow), nbits: length, padding: (8 - overflow) & 7 }
663 }
664
665 /// Creates a bit string of zeros.
666 ///
667 /// # Examples
668 /// ```
669 /// # use bit_byte_bit::{Bits};
670 /// let mut x = Bits::zeros(4);
671 ///
672 /// assert_eq!(x.len(), 4);
673 /// assert_eq!(x, Bits::from([false, false, false, false]));
674 /// ```
675 pub fn zeros(length: usize) -> Self {
676 match length {
677 0 => Bits::empty(),
678 length => unsafe {
679 let nbytes = 1 + ((length - 1) >> 3);
680 let overflow = length & 7;
681 let padding = (8 - overflow) & 7;
682 let mask = mask!(overflow);
683 let pointer = pointer![0u8; nbytes];
684 let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
685
686 Bits { words: bytes, mask, nbits: length, padding }
687 }
688 }
689 }
690
691 /// Pads a bit string until the length is a multiple of the given unit.
692 ///
693 /// # Examples
694 /// ```
695 /// # use bit_byte_bit::{Bits};
696 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
697 ///
698 /// x.align(16);
699 ///
700 /// assert_eq!(x, Bits::new([0x0A, 0x0B, 0x0C, 0x00]));
701 /// assert_eq!(x.len(), 32);
702 /// ```
703 pub fn align(&mut self, unit: usize) {
704 match unit {
705 0 | 1 => (),
706 8 => {
707 self.nbits = self.size() << 3;
708 self.padding = 0;
709 },
710 unit if (self.nbits % unit) == 0 => (),
711 unit => self.push_zeros(unit - (self.nbits % unit))
712 }
713 }
714
715 /// Whether all bits are one.
716 ///
717 /// # Examples
718 /// ```
719 /// # use bit_byte_bit::{Bits};
720 /// let x1 = Bits::empty();
721 ///
722 /// assert!(x1.all());
723 ///
724 /// let x2 = Bits::from([0x0F]);
725 ///
726 /// assert!(x2.all());
727 ///
728 /// let x3 = Bits::new([0x0F]);
729 ///
730 /// assert!(!x3.all());
731 pub fn all(&self) -> bool {
732 match self.size() {
733 0 => true,
734 n => unsafe {
735 let pointer = self.words.as_ptr_const();
736
737 for i in 0..(n - 1) {
738 if *pointer.add(i) != 0xFF { return false; }
739 }
740
741 (*pointer.add(n - 1) & self.mask) == self.mask
742 }
743 }
744 }
745
746 /// Bitwise and of two bit strings.
747 ///
748 /// # Examples
749 /// ```
750 /// # use bit_byte_bit::{Bits};
751 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
752 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
753 ///
754 /// assert_eq!(x1.and(&y1), Bits::new([0x20, 0x30, 0x40]));
755 ///
756 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
757 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
758 ///
759 /// assert_eq!(x2.len(), 23);
760 /// assert_eq!(y2.len(), 24);
761 ///
762 /// let z = x2.and(&y2);
763 ///
764 /// assert_eq!(z.len(), 24);
765 /// ```
766 pub fn and(&self, rhs: &Bits) -> Bits {
767 unsafe {
768 let (mut min, mut nbytes) = (self.size(), rhs.size());
769 let mut nbits = rhs.nbits;
770 let (mut padding, mut mask) = (rhs.padding, rhs.mask);
771 let aptr = self.words.as_ptr_const();
772 let bptr = rhs.words.as_ptr_const();
773
774 if rhs.nbits < self.nbits {
775 (min, nbytes, nbits) = (rhs.size(), self.size(), self.nbits);
776 (padding, mask) = (self.padding, self.mask);
777 }
778
779 let layout = Layout::array::<u8>(nbytes).unwrap();
780 let result = alloc::alloc(layout);
781
782 for i in 0..min {
783 ptr::write(result.add(i), *aptr.add(i) & *bptr.add(i));
784 }
785
786 for i in min..nbytes { ptr::write(result.add(i), 0); }
787
788 *result.add(nbytes - 1) &= mask;
789
790 let bytes = RawBytes { bytes: NonNull::new(result).unwrap(), cap: nbytes, nbytes };
791
792 Bits { words: bytes, mask, nbits, padding }
793 }
794 }
795
796 /// Bitwise and of two bit strings.
797 ///
798 /// # Examples
799 /// ```
800 /// # use bit_byte_bit::{Bits};
801 /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
802 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
803 ///
804 /// x1.and_mut(&y1);
805 ///
806 /// assert_eq!(x1, Bits::new([0x20, 0x30, 0x40]));
807 ///
808 /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
809 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
810 ///
811 /// assert_eq!(x2.len(), 23);
812 /// assert_eq!(y2.len(), 24);
813 ///
814 /// x2.and_mut(&y2);
815 ///
816 /// assert_eq!(x2.len(), 24);
817 /// ```
818 pub fn and_mut(&mut self, rhs: &Bits) {
819 match self.size().cmp(&rhs.size()) {
820 Ordering::Equal => unsafe {
821 let aptr = self.words.as_ptr_mut();
822 let bptr = self.words.as_ptr_const();
823 let last_a = *aptr.add(self.size() - 1) & self.mask;
824 let last_b = *bptr.add(rhs.size() - 1) & rhs.mask;
825
826 for i in 0..(self.size() - 1) { *aptr.add(i) &= *bptr.add(i); }
827
828 *aptr.add(self.size() - 1) = last_a & last_b;
829 },
830 Ordering::Less => unsafe {
831 self.words.expand_to(rhs.size());
832
833 let aptr = self.words.as_ptr_mut();
834 let bptr = self.words.as_ptr_const();
835 let last_a = *aptr.add(self.size() - 1) & self.mask;
836
837 for i in 0..(self.size() - 1) { *aptr.add(i) &= *bptr.add(i); }
838
839 *aptr.add(self.size() - 1) = last_a & *bptr.add(self.size() - 1);
840
841 for i in self.size()..rhs.size() { ptr::write(aptr.add(i), 0); }
842 },
843 Ordering::Greater => unsafe {
844 let aptr = self.words.as_ptr_mut();
845 let bptr = self.words.as_ptr_const();
846
847 for i in 0..(rhs.size() - 1) { *aptr.add(i) &= *bptr.add(i); }
848
849 *aptr.add(rhs.size() - 1) &= *bptr.add(rhs.size() - 1) & rhs.mask;
850
851 for i in rhs.size()..self.size() { *aptr.add(i) = 0; }
852 }
853 }
854
855 if self.nbits < rhs.nbits {
856 self.nbits = rhs.nbits;
857 self.words.nbytes = rhs.size();
858 self.padding = rhs.padding;
859 self.mask = rhs.mask;
860 }
861 }
862
863 /// Whether at least one bit is one.
864 ///
865 /// # Examples
866 /// ```
867 /// # use bit_byte_bit::{Bits};
868 /// let x1 = Bits::empty();
869 ///
870 /// assert!(!x1.any());
871 ///
872 /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
873 ///
874 /// assert!(x2.any());
875 ///
876 /// let x3 = Bits::zeros(20);
877 ///
878 /// assert!(!x3.any());
879 pub fn any(&self) -> bool { self.nbits > 0 && self.bytes().iter().any(|&b| b > 0u8) }
880
881 /// State of a byte.
882 ///
883 /// # Examples
884 /// ```
885 /// # use bit_byte_bit::{Bits};
886 /// let mut x = Bits::from([0x0A, 0x0B]);
887 ///
888 /// assert_eq!(x.byte(0), 0x0A);
889 /// assert_eq!(x.byte(1), 0x0B);
890 /// ```
891 ///
892 /// ```should_panic
893 /// # use bit_byte_bit::{Bits};
894 /// let mut x = Bits::from([0x0A, 0x0B]);
895 ///
896 /// assert_eq!(x.byte(2), 0x0C);
897 pub fn byte(&self, i: usize) -> u8 {
898 assert!(i < self.size(), "Index out of bounds");
899
900 unsafe { *self.words.as_ptr_mut().add(i) }
901 }
902
903 /// Underlying bytes
904 ///
905 /// # Example
906 /// ```
907 /// # use bit_byte_bit::{Bits};
908 /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
909 /// let y = x.bytes().iter().cloned().collect::<Vec<u8>>();
910 ///
911 /// assert_eq!(y, vec![0xAB, 0xCD, 0xEF]);
912 /// ```
913 pub fn bytes(&self) -> &[u8] {
914 unsafe { slice::from_raw_parts(self.words.as_ptr_const(), self.size()) }
915 }
916
917 /// Flips every bit.
918 ///
919 /// # Examples
920 /// ```
921 /// # use bit_byte_bit::{Bits};
922 /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
923 ///
924 /// assert_eq!(x.complement(), Bits::slice(&[0xF5, 0xF4, 0x03], 20));
925 /// ```
926 pub fn complement(&self) -> Bits {
927 match self.size() {
928 0 => Bits::empty(),
929 nbytes => unsafe {
930 let pointer = self.words.as_ptr_mut();
931 let layout = Layout::array::<u8>(nbytes).unwrap();
932 let clone = alloc::alloc(layout);
933
934 for i in 0..nbytes { ptr::write(clone.add(i), !*pointer.add(i)); }
935
936 *clone.add(nbytes - 1) &= self.mask;
937
938 let bytes = RawBytes { bytes: NonNull::new(clone).unwrap(), cap: nbytes, nbytes };
939
940 Bits { words: bytes, mask: self.mask, nbits: self.nbits, padding: self.padding }
941 }
942 }
943 }
944
945 /// Flips every bit.
946 ///
947 /// # Examples
948 /// ```
949 /// # use bit_byte_bit::{Bits};
950 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
951 ///
952 /// x1.complement_mut();
953 ///
954 /// assert_eq!(x1, Bits::slice(&[0xF5, 0xF4, 0x03], 20));
955 /// ```
956 pub fn complement_mut(&mut self) {
957 unsafe {
958 let aptr = self.words.as_ptr_mut();
959
960 for i in 0..self.size() { *aptr.add(i) = !*aptr.add(i); }
961
962 *aptr.add(self.size() - 1) &= self.mask;
963 }
964 }
965
966 /// Shifts out upper bits.
967 ///
968 /// # Examples
969 /// ```
970 /// # use bit_byte_bit::{Bits};
971 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
972 ///
973 /// x1.consume_left(4);
974 /// assert_eq!(x1.len(), 16);
975 /// assert_eq!(x1, Bits::new([0x0A, 0x0B]));
976 ///
977 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
978 ///
979 /// x2.consume_left(4);
980 /// assert_eq!(x2.len(), 20);
981 /// assert_eq!(x2, Bits::from([0x0A, 0x0B, 0x0C]));
982 /// ```
983 pub fn consume_left(&mut self, count: usize) {
984 match (self.size(), count) {
985 (0, _) | (_, 0) => (),
986 (n, count) if count >= self.nbits => unsafe {
987 let pointer = self.words.as_ptr_mut();
988
989 for i in 0..n { *pointer.add(i) = 0; }
990 },
991 (n, count) => {
992 let (extra, byte_len) = (count & 7, count >> 3);
993
994 if byte_len > 0 {
995 unsafe {
996 let pointer = self.words.as_ptr_mut();
997
998 for i in (n - byte_len)..n { ptr::read(pointer.add(i)); }
999
1000 self.words.nbytes -= byte_len;
1001
1002 *pointer.add(self.size() - 1) &= self.mask;
1003 }
1004 }
1005
1006 if extra > 0 {
1007 unsafe {
1008 let overflow = 8 - self.padding;
1009 let pointer = self.words.as_ptr_mut();
1010
1011 let mask = match extra.cmp(&overflow) {
1012 Ordering::Less => (1 << (overflow - extra)) - 1,
1013 Ordering::Greater => (1 << (8 + overflow - extra)) - 1,
1014 Ordering::Equal => 0,
1015 };
1016
1017 *pointer.add(self.size() - 1) &= mask;
1018 }
1019 }
1020
1021 self.nbits -= count;
1022 let overflow = self.nbits & 7;
1023 self.padding = (8 - overflow) & 7;
1024 self.mask = mask!(overflow);
1025
1026 self.shrink_to_fit();
1027
1028 unsafe { *self.words.as_ptr_mut().add(self.size() - 1) &= self.mask; }
1029 }
1030 }
1031 }
1032
1033 /// Shifts out lower bits.
1034 ///
1035 /// # Examples
1036 /// ```
1037 /// # use bit_byte_bit::{Bits};
1038 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1039 ///
1040 /// x1.consume_right(4);
1041 ///
1042 /// assert_eq!(x1, Bits::from([0xB0, 0xC0]));
1043 /// assert_eq!(x1.len(), 16);
1044 ///
1045 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1046 ///
1047 /// x2.consume_right(4);
1048 ///
1049 /// assert_eq!(x2, Bits::slice(&[0xB0, 0xC0, 0x00], 20));
1050 /// assert_eq!(x2.len(), 20);
1051 /// ```
1052 pub fn consume_right(&mut self, count: usize) {
1053 match (self.size(), count) {
1054 (0, _) | (_, 0) => (),
1055 (_, count) if count >= self.nbits => {
1056 self.words.shrink_to(0);
1057 self.nbits = 0;
1058 self.padding = 0;
1059 },
1060 (_, count) => {
1061 unsafe {
1062 let shift_bytes = count >> 3;
1063 let pointer = self.words.as_ptr_mut();
1064
1065 ptr::copy(pointer.add(shift_bytes), pointer, self.size() - shift_bytes);
1066
1067 self.words.shrink_to(self.size() - shift_bytes);
1068
1069 self.words.nbytes -= shift_bytes;
1070 self.nbits -= count;
1071 let new_overflow = self.nbits & 7;
1072 self.padding = 8 - new_overflow;
1073 self.mask = mask!(new_overflow);
1074
1075 let count_overflow = count & 7;
1076
1077 if count_overflow > 0 {
1078 self.words.shift_right(
1079 self.size(),
1080 (1 << count_overflow) - 1,
1081 8 - count_overflow,
1082 count_overflow
1083 );
1084
1085 self.shrink_to_fit();
1086 }
1087 }
1088 }
1089 }
1090 }
1091
1092 /// The number of zeros.
1093 ///
1094 /// # Examples
1095 /// ```
1096 /// # use bit_byte_bit::{Bits};
1097 /// let mut x = Bits::from([15, 15, 15]);
1098 ///
1099 /// assert_eq!(x.count_zeros(), 8);
1100 ///
1101 /// x = Bits::new([15, 15, 15]);
1102 ///
1103 /// assert_eq!(x.count_zeros(), 12);
1104 /// ```
1105 pub fn count_zeros(&self) -> usize {
1106 match self.size() {
1107 0 => 0,
1108 n => unsafe {
1109 let pointer = self.words.as_ptr_const();
1110 let mut sum = (*pointer.add(n - 1) & self.mask).count_zeros();
1111
1112 for i in 0..(n - 1) { sum += (*pointer.add(i)).count_zeros(); }
1113
1114 (sum as usize) - self.padding
1115 }
1116 }
1117 }
1118
1119 /// Adds upper bit padding to a bit string.
1120 ///
1121 /// # Examples
1122 /// ```
1123 /// # use bit_byte_bit::{Bits};
1124 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1125 ///
1126 /// x1.extend_left(&[0x0D, 0x0E, 0x0F]);
1127 ///
1128 /// assert_eq!(x1.len(), 44);
1129 /// assert_eq!(x1, Bits::slice(&[0x0A, 0x0B, 0xDC, 0xE0, 0xF0, 0x00], 44));
1130 ///
1131 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1132 ///
1133 /// x2.extend_left(&[0x0D, 0x0E, 0x0F]);
1134 ///
1135 /// assert_eq!(x2.len(), 48);
1136 /// assert_eq!(x2, Bits::new([0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F]));
1137 /// ```
1138 pub fn extend_left(&mut self, bytes: &[u8]) {
1139 let mut nbytes = bytes.len();
1140
1141 while nbytes > 0 && bytes[nbytes - 1] == 0 { nbytes -= 1; }
1142
1143 if nbytes == 0 { return; }
1144
1145 unsafe {
1146 self.words.expand_to(self.size() + nbytes);
1147
1148 let pointer = self.words.as_ptr_mut().add(self.size());
1149
1150 for i in 0..nbytes { ptr::write(pointer.add(i), bytes[i]); }
1151
1152 if self.padding > 0 {
1153 let overflow = (8 - self.padding) & 7;
1154 let mask = mask!(self.padding);
1155 let end = self.size() + nbytes;
1156
1157 self.words.shift_right_from(self.size(), end, mask, overflow, self.padding);
1158 }
1159
1160 self.words.nbytes += nbytes;
1161 self.nbits += nbytes << 3;
1162 *pointer.add(self.size() - 1) &= self.mask;
1163 }
1164 }
1165
1166 /// Adds lower bit padding to a bit string.
1167 ///
1168 /// # Examples
1169 /// ```
1170 /// # use bit_byte_bit::{Bits};
1171 /// let mut x1 = Bits::empty();
1172 ///
1173 /// x1.extend_right(&[0x0A, 0x0B, 0x0C]);
1174 ///
1175 /// assert_eq!(x1.len(), 24);
1176 /// assert_eq!(x1, Bits::new([0x0A, 0x0B, 0x0C]));
1177 ///
1178 /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1179 ///
1180 /// x2.extend_right(&[0x0D, 0x0E, 0x0F]);
1181 ///
1182 /// assert_eq!(x2.len(), 44);
1183 /// assert_eq!(x2, Bits::from([0x0D, 0x0E, 0x0F, 0x0A, 0x0B, 0x0C]));
1184 /// ```
1185 pub fn extend_right(&mut self, bytes: &[u8]) {
1186 unsafe {
1187 let nbytes_padding = bytes.len();
1188 let nbytes = self.size() + nbytes_padding;
1189
1190 self.words.expand_to(nbytes);
1191
1192 let pointer = self.words.as_ptr_mut();
1193
1194 ptr::copy(pointer, pointer.add(nbytes_padding), self.size());
1195
1196 for i in 0..nbytes_padding { ptr::write(pointer.add(i), bytes[i]); }
1197
1198 self.words.nbytes = nbytes;
1199 self.nbits += nbytes_padding << 3;
1200 *pointer.add(self.size() - 1) &= self.mask;
1201 }
1202 }
1203
1204 /// The number of ones.
1205 ///
1206 /// # Examples
1207 /// ```
1208 /// # use bit_byte_bit::{Bits};
1209 /// let mut x = Bits::from([15, 15, 15]);
1210 ///
1211 /// assert_eq!(x.hamming_weight(), 12);
1212 /// ```
1213 pub fn hamming_weight(&self) -> usize {
1214 match self.size() {
1215 0 => 0,
1216 n => unsafe {
1217 let pointer = self.words.as_ptr_const();
1218 let mut sum = (*pointer.add(n - 1) & self.mask).count_ones();
1219
1220 for i in 0..(n - 1) { sum += (*pointer.add(i)).count_ones(); }
1221
1222 sum as usize
1223 }
1224 }
1225 }
1226
1227 /// State of a bit.
1228 ///
1229 /// # Examples
1230 /// ```
1231 /// # use bit_byte_bit::{Bits};
1232 /// let mut x = Bits::from([0x0F]);
1233 ///
1234 /// assert_eq!(x.i(3), 1u8);
1235 /// ```
1236 ///
1237 /// ```should_panic
1238 /// # use bit_byte_bit::{Bits};
1239 /// let mut x = Bits::from([0x0F]);
1240 ///
1241 /// assert_eq!(x.i(4), 0);
1242 /// ```
1243 pub fn i(&self, i: usize) -> u8 {
1244 assert!(i < self.nbits, "Index out of bounds");
1245
1246 unsafe { (*self.words.as_ptr_mut().add(i >> 3) >> (i & 7)) & 1 }
1247 }
1248
1249 /// An iterator over the individual bits
1250 ///
1251 /// # Examples
1252 /// ```
1253 /// # use bit_byte_bit::{Bits};
1254 /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
1255 /// let y = x.into_bytes().collect::<Vec<u8>>();
1256 ///
1257 /// assert_eq!(y, vec![0xAB, 0xCD, 0xEF]);
1258 /// ```
1259 pub fn into_bytes(self) -> IntoBytes {
1260 let (iter, bytes) = unsafe {
1261 (Bytes::new(self.bytes()), ptr::read(&self.words))
1262 };
1263
1264 std::mem::forget(self);
1265
1266 IntoBytes { iter, _bytes: bytes}
1267 }
1268
1269 /// An iterator over the individual bits
1270 ///
1271 /// # Examples
1272 /// ```
1273 /// # use bit_byte_bit::{Bits, Iter};
1274 /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
1275 /// let mut ones = 0;
1276 ///
1277 /// for bit in x.iter() { if bit == 1 { ones += 1; } }
1278 ///
1279 /// assert_eq!(ones, 17);
1280 /// ```
1281 pub fn iter(&self) -> Iter { Iter::new(self, 0) }
1282
1283 /// An iterator over the individual bits
1284 ///
1285 /// # Examples
1286 /// ```
1287 /// # use bit_byte_bit::{Bits, Iter};
1288 /// let x = Bits::new([0xAB, 0xCD, 0xEF]);
1289 /// let mut ones = 0;
1290 ///
1291 /// for bit in x.iter_from(0) { if bit == 1 { ones += 1; } }
1292 ///
1293 /// assert_eq!(ones, 17);
1294 ///
1295 /// ones = 0;
1296 ///
1297 /// for bit in x.iter_from(13) { if bit == 1 { ones += 1; } }
1298 ///
1299 /// assert_eq!(ones, 9);
1300 /// ```
1301 pub fn iter_from(&self, index: usize) -> Iter {
1302 assert!(index <= self.nbits, "Index out of bounds");
1303
1304 Iter::new(self, index)
1305 }
1306
1307 /// The number of leading ones.
1308 ///
1309 /// # Examples
1310 /// ```
1311 /// # use bit_byte_bit::{Bits};
1312 /// let x1 = Bits::from([0x0A, 0xFF, 0x03]);
1313 ///
1314 /// assert_eq!(x1.leading_ones(), 10);
1315 ///
1316 /// let x2 = Bits::new([0x0A, 0xFF, 0x0B]);
1317 ///
1318 /// assert_eq!(x2.leading_ones(), 0);
1319 /// ```
1320 pub fn leading_ones(&self) -> usize {
1321 match self.size() {
1322 0 => 0,
1323 n => unsafe {
1324 let pointer = self.words.as_ptr_const();
1325 let last_byte = *pointer.add(n - 1) & self.mask;
1326 let ones = (last_byte << self.padding).leading_ones() as usize;
1327
1328 if ones < (8 - self.padding) { return ones; }
1329
1330 let mut i = n - 2;
1331
1332 while i > 0 && *pointer.add(i) == 0xFF { i -= 1; }
1333
1334 ones + ((self.size() - i - 2) << 3) + ((*pointer.add(i)).leading_ones() as usize)
1335 }
1336 }
1337 }
1338
1339 /// The number of leading zeros.
1340 ///
1341 /// # Examples
1342 /// ```
1343 /// # use bit_byte_bit::{Bits};
1344 /// let x1 = Bits::from([0x0A, 0x00, 0x00]);
1345 ///
1346 /// assert_eq!(x1.leading_zeros(), 0);
1347 ///
1348 /// let x2 = Bits::zeros(20);
1349 ///
1350 /// assert_eq!(x2.leading_zeros(), 20);
1351 /// ```
1352 pub fn leading_zeros(&self) -> usize {
1353 match self.size() {
1354 0 => 0,
1355 1 => unsafe {
1356 let byte = *self.words.as_ptr_const() & self.mask;
1357 (byte.leading_zeros() as usize) - self.padding
1358 },
1359 n => unsafe {
1360 let pointer = self.words.as_ptr_const();
1361 let last_byte = *pointer.add(n - 1) & self.mask;
1362 let zeros = (last_byte.leading_zeros() as usize) - self.padding;
1363
1364 if (zeros + self.padding) < 8 { return zeros; }
1365
1366 let mut i = n - 2;
1367
1368 while i > 0 && *pointer.add(i) == 0 { i -= 1; }
1369
1370 zeros + ((n - i - 2) << 3) + ((*pointer.add(i)).leading_zeros() as usize)
1371 }
1372 }
1373 }
1374
1375 /// The number of bits.
1376 ///
1377 /// # Examples
1378 /// ```
1379 /// # use bit_byte_bit::{Bits};
1380 /// let x1 = Bits::empty();
1381 ///
1382 /// assert_eq!(x1.len(), 0);
1383 ///
1384 /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1385 ///
1386 /// assert_eq!(x2.len(), 20);
1387 ///
1388 /// let x3 = Bits::new([0x0A, 0x0B, 0x0C]);
1389 ///
1390 /// assert_eq!(x3.len(), 24);
1391 ///
1392 /// let x4 = Bits::slice(&[0x0A, 0x0B, 0x0C], 17);
1393 ///
1394 /// assert_eq!(x4.len(), 17);
1395 /// ```
1396 pub fn len(&self) -> usize { self.nbits }
1397
1398 /// Whether all bits are zero.
1399 ///
1400 /// # Examples
1401 /// ```
1402 /// # use bit_byte_bit::{Bits};
1403 /// let x1 = Bits::empty();
1404 ///
1405 /// assert!(!x1.any());
1406 ///
1407 /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1408 ///
1409 /// assert!(x2.any());
1410 ///
1411 /// let x3 = Bits::zeros(20);
1412 ///
1413 /// assert!(!x3.any());
1414 pub fn none(&self) -> bool {
1415 unsafe {
1416 let pointer = self.words.as_ptr_const();
1417
1418 for i in 0..(self.size() - 1) {
1419 if *pointer.add(i) != 0 { return false; }
1420 }
1421
1422 (*pointer.add(self.size() - 1) & self.mask) == 0
1423 }
1424 }
1425
1426 /// Bitwise or of two bit strings.
1427 ///
1428 /// # Examples
1429 /// ```
1430 /// # use bit_byte_bit::{Bits};
1431 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
1432 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
1433 ///
1434 /// assert_eq!(x1.or(&y1), Bits::from([0xA0, 0xB0, 0xC0]));
1435 ///
1436 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
1437 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
1438 ///
1439 /// assert_eq!(x2.len(), 23);
1440 /// assert_eq!(y2.len(), 24);
1441 ///
1442 /// let z = x2.or(&y2);
1443 ///
1444 /// assert_eq!(z.len(), 24);
1445 /// ```
1446 pub fn or(&self, rhs: &Bits) -> Bits { bitop!(self, |, rhs) }
1447
1448 /// Bitwise or of two bit strings.
1449 ///
1450 /// # Examples
1451 /// ```
1452 /// # use bit_byte_bit::{Bits};
1453 /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
1454 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
1455 ///
1456 /// x1.or_mut(&y1);
1457 ///
1458 /// assert_eq!(x1, Bits::from([0xA0, 0xB0, 0xC0]));
1459 ///
1460 /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
1461 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
1462 ///
1463 /// assert_eq!(x2.len(), 23);
1464 /// assert_eq!(y2.len(), 24);
1465 ///
1466 /// x2.or_mut(&y2);
1467 ///
1468 /// assert_eq!(x2.len(), 24);
1469 /// ```
1470 pub fn or_mut(&mut self, rhs: &Bits) { bitop!(assign; self, |=, rhs) }
1471
1472 /// Shifts out the most significant bit.
1473 ///
1474 /// # Examples
1475 /// ```
1476 /// # use bit_byte_bit::{Bits};
1477 /// let mut x1 = Bits::empty();
1478 ///
1479 /// assert_eq!(x1.pop_left(), 0u8);
1480 ///
1481 /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1482 ///
1483 /// assert_eq!(x2.pop_left(), 1u8);
1484 /// assert_eq!(x2.len(), 19);
1485 ///
1486 /// let mut x3 = Bits::new([0x0A, 0x0B, 0x0C]);
1487 ///
1488 /// assert_eq!(x3.pop_left(), 0u8);
1489 /// assert_eq!(x3.len(), 23);
1490 /// ```
1491 pub fn pop_left(&mut self) -> u8 {
1492 match self.size() {
1493 0 => 0,
1494 n => unsafe {
1495 let pointer = self.words.as_ptr_mut();
1496 self.nbits -= 1;
1497
1498 match self.padding {
1499 0 => {
1500 let bit = *pointer.add(n - 1) >> 7;
1501
1502 *pointer.add(n - 1) &= 0x7F;
1503
1504 bit
1505 },
1506 7 => {
1507 let bit = ptr::read(pointer.add(n - 1)) & 1;
1508
1509 self.words.nbytes -= 1;
1510 self.padding = 0;
1511
1512 bit
1513 },
1514 alignment => {
1515 let shift = 8 - alignment - 1;
1516 let bit = *pointer.add(n- 1) >> shift;
1517 *pointer.add(n - 1) &= mask!(shift);
1518 self.padding += 1;
1519
1520 bit
1521 }
1522 }
1523 }
1524 }
1525 }
1526
1527 /// Shifts out the least significant bit.
1528 ///
1529 /// # Examples
1530 /// ```
1531 /// # use bit_byte_bit::{Bits};
1532 /// let mut x1 = Bits::empty();
1533 ///
1534 /// assert_eq!(x1.pop_right(), 0u8);
1535 ///
1536 /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1537 ///
1538 /// assert_eq!(x2.pop_right(), 0u8);
1539 /// assert_eq!(x2.len(), 19);
1540 /// assert_eq!(x2.pop_right(), 1u8);
1541 /// ```
1542 pub fn pop_right(&mut self) -> u8 {
1543 match self.size() {
1544 0 => 0,
1545 _ => {
1546 self.nbits -= 1;
1547 self.padding = (self.padding + 1) & 7;
1548
1549 unsafe {
1550 let pointer = self.words.as_ptr_mut();
1551 let bit = *pointer & 1;
1552
1553 self.words.shift_right(self.size(), 1, 7, 1);
1554
1555 if self.nbits == 0 {
1556 ptr::read(pointer);
1557 self.words.nbytes = 0;
1558 }
1559
1560 bit
1561 }
1562 }
1563 }
1564 }
1565
1566 /// Adds upper bit padding to a bit string.
1567 ///
1568 /// # Examples
1569 /// ```
1570 /// # use bit_byte_bit::{Bits};
1571 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1572 ///
1573 /// x1.push_left(true, 17);
1574 ///
1575 /// assert_eq!(x1.len(), 37);
1576 /// assert_eq!(x1, Bits::from([0x0A, 0x0B, 0xFC, 0xFF, 0x1F]));
1577 ///
1578 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1579 ///
1580 /// x2.push_left(false, 17);
1581 ///
1582 /// assert_eq!(x2.len(), 41);
1583 /// assert_eq!(x2, Bits::slice(&[0x0A, 0x0B, 0x0C, 0x00, 0x00, 0x00], 41));
1584 /// ```
1585 pub fn push_left(&mut self, bit: bool, count: usize) {
1586 if bit { self.push_ones(count); } else { self.push_zeros(count); }
1587 }
1588
1589 /// Adds upper bit padding to a bit string.
1590 ///
1591 /// # Examples
1592 /// ```
1593 /// # use bit_byte_bit::{Bits};
1594 /// let mut x = Bits::from([15, 15, 15]);
1595 ///
1596 /// x.push_byte_left(15, 2);
1597 ///
1598 /// assert_eq!(x.len(), 36);
1599 /// assert_eq!(x, Bits::slice(&[15, 15, 255, 240, 0], 36));
1600 ///
1601 /// x = Bits::new([15, 15, 15]);
1602 ///
1603 /// x.push_byte_left(31, 2);
1604 ///
1605 /// assert_eq!(x.len(), 40);
1606 /// assert_eq!(x, Bits::new([15, 15, 15, 31, 31]));
1607 /// ```
1608 pub fn push_byte_left(&mut self, word: u8, count: usize) {
1609 if count == 0 { return; }
1610
1611 match word {
1612 0 => self.push_zeros(count << 3),
1613 0xFF => self.push_ones(count << 3),
1614 word => unsafe {
1615 self.words.expand_to(self.size() + count);
1616
1617 let pointer = self.words.as_ptr_mut().add(self.size());
1618
1619 for i in 0..count { ptr::write(pointer.add(i), word); }
1620
1621 *pointer.add(self.size() - 1) &= self.mask;
1622
1623 if self.padding > 0 && word != 0 {
1624 self.words.shift_right_from(
1625 self.size(),
1626 self.size() + count,
1627 mask!(self.padding),
1628 (8 - self.padding) & 7,
1629 self.padding
1630 );
1631 }
1632
1633 self.words.nbytes += count;
1634 self.nbits += count << 3;
1635
1636 self.shrink_to_fit()
1637 }
1638 }
1639 }
1640
1641 /// Adds lower bit padding to a bit string.
1642 ///
1643 /// # Examples
1644 /// ```
1645 /// # use bit_byte_bit::{Bits};
1646 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1647 ///
1648 /// x.push_right(true, 4);
1649 ///
1650 /// assert_eq!(x.len(), 24);
1651 /// assert_eq!(x, Bits::from([0xAF, 0xB0, 0xC0]));
1652 /// ```
1653 pub fn push_right(&mut self, bit: bool, count: usize) {
1654 match count {
1655 0 => (),
1656 n => if bit { self.cons_bit(n, 0xFF); } else { self.cons_bit(n, 0) }
1657 }
1658 }
1659
1660 /// Adds lower bit padding to a bit string.
1661 ///
1662 /// # Examples
1663 /// ```
1664 /// # use bit_byte_bit::{Bits};
1665 /// let mut x = Bits::from([15, 15, 15]);
1666 ///
1667 /// x.push_byte_right(31, 2);
1668 ///
1669 /// assert_eq!(x.len(), 36);
1670 /// assert_eq!(x, Bits::from([31, 31, 15, 15, 15]));
1671 /// ```
1672 pub fn push_byte_right(&mut self, word: u8, count: usize) {
1673 let nbytes = self.size() + count;
1674 self.words.expand_to(nbytes);
1675
1676 unsafe {
1677 let pointer = self.words.as_ptr_mut();
1678
1679 ptr::copy(pointer, pointer.add(count), self.size());
1680
1681 for i in 0..count { ptr::write(pointer.add(i), word); }
1682 }
1683
1684 self.words.nbytes = nbytes;
1685 self.nbits += count << 3;
1686 }
1687
1688 /// Sets a bit to zero.
1689 ///
1690 /// # Examples
1691 /// ```
1692 /// # use bit_byte_bit::{Bits};
1693 /// let mut x = Bits::new([15]);
1694 ///
1695 /// assert_eq!(x.i(3), 1u8);
1696 ///
1697 /// x.reset(3);
1698 ///
1699 /// assert_eq!(x.i(3), 0u8);
1700 /// ```
1701 pub fn reset(&mut self, i: usize) {
1702 if i < self.nbits {
1703 unsafe { *self.words.as_ptr_mut().add(i >> 3) &= !(1 << (i & 7)); }
1704 }
1705 }
1706
1707 /// Sets the state of a range of bits to zero.
1708 ///
1709 /// # Examples
1710 /// ```
1711 /// # use bit_byte_bit::{Bits};
1712 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1713 /// x1.reset_bits(7, 10);
1714 ///
1715 /// assert_eq!(x1, Bits::from([0x0A, 0x00, 0x0C]));
1716 ///
1717 /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
1718 /// x2.reset_bits(8, 12);
1719 ///
1720 /// assert_eq!(x2, Bits::slice(&[0x0A, 0x00, 0x00], 20));
1721 /// ```
1722 ///
1723 /// ``` should_panic
1724 /// # use bit_byte_bit::{Bits};
1725 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1726 ///
1727 /// x.reset_bits(21, 14);
1728 /// ```
1729 ///
1730 /// ```should_panic
1731 /// # use bit_byte_bit::{Bits};
1732 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1733 ///
1734 /// x.reset_bits(7, 14);
1735 /// ```
1736 pub fn reset_bits(&mut self, start: usize, count: usize) {
1737 assert!(count <= self.nbits && start <= self.nbits - count, "Invalid range");
1738
1739 let end = if count > (self.nbits - start) { self.nbits } else { start + count };
1740 let mut start = start;
1741 let low_overflow = 8 - (start & 7);
1742
1743 unsafe {
1744 let pointer = self.words.as_ptr_mut();
1745
1746 if low_overflow < 8 {
1747 *pointer.add(start >> 3) &= !(((1 << low_overflow) - 1) << (start & 7));
1748 start = start + low_overflow;
1749 }
1750
1751 let bytes = (end - start) >> 3;
1752 let start_byte = start >> 3;
1753
1754 for i in start_byte..(start_byte + bytes) { *pointer.add(i) = 0 }
1755
1756 let overflow = (end - start) & 7;
1757
1758 if overflow > 0 { *pointer.add(start_byte + bytes) &= !((1 << overflow) - 1); }
1759
1760 if self.size() > 0 { *pointer.add(self.words.nbytes - 1) &= self.mask; }
1761 }
1762 }
1763
1764 /// Sets the state of a byte to zero.
1765 ///
1766 /// # Examples
1767 /// ```
1768 /// # use bit_byte_bit::{Bits};
1769 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1770 ///
1771 /// x.reset_byte(1);
1772 ///
1773 /// assert_eq!(x, Bits::from([0x0A, 0x00, 0x0C]));
1774 ///
1775 /// x.reset_byte(2);
1776 ///
1777 /// assert_eq!(x, Bits::slice(&[0x0A, 0x00, 0x00], 20));
1778 ///```
1779 ///
1780 /// ```should_panic
1781 /// # use bit_byte_bit::{Bits};
1782 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1783 ///
1784 /// x.reset_byte(3);
1785 /// ```
1786 pub fn reset_byte(&mut self, i: usize) {
1787 assert!(i < self.size(), "Index out of range");
1788
1789 unsafe {
1790 let pointer = self.words.as_ptr_mut();
1791 *pointer.add(i) = 0;
1792
1793 if self.size() > 0 { *pointer.add(self.words.nbytes - 1) &= self.mask; }
1794 }
1795 }
1796
1797 /// Sets the state of a range of bytes to zero.
1798 ///
1799 /// # Examples
1800 /// ```
1801 /// # use bit_byte_bit::{Bits};
1802 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1803 ///
1804 /// x.reset_bytes(1, 2);
1805 ///
1806 /// assert_eq!(x, Bits::slice(&[0x0A, 0x00, 0x00], 20));
1807 /// ```
1808 ///
1809 /// ```should_panic
1810 /// # use bit_byte_bit::{Bits};
1811 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1812 ///
1813 /// x.reset_bytes(3, 2);
1814 /// ```
1815 ///
1816 /// ```should_panic
1817 /// # use bit_byte_bit::{Bits};
1818 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
1819 ///
1820 /// x.reset_bytes(0, 4);
1821 /// ```
1822 pub fn reset_bytes(&mut self, start: usize, count: usize) {
1823 assert!(count <= self.size() && start <= self.size() - count, "Invalid range");
1824
1825 unsafe {
1826 let pointer = self.words.as_ptr_mut();
1827
1828 let end = if count > (self.size() - start) { self.size() } else { start + count };
1829
1830 for i in start..end { *pointer.add(i) = 0; }
1831
1832 if end == self.size() && self.padding > 0 { *pointer.add(end - 1) &= self.mask; }
1833 }
1834 }
1835
1836 /// Reverses the order of the bits.
1837 ///
1838 /// # Examples
1839 /// ```
1840 /// # use bit_byte_bit::{Bits};
1841 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1842 ///
1843 /// x1.reverse();
1844 ///
1845 /// assert_eq!(x1, Bits::slice(&[0x03, 0x0D, 0x05], 20));
1846 ///
1847 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1848 ///
1849 /// x2.reverse();
1850 ///
1851 /// assert_eq!(x2, Bits::new([0x30, 0xD0, 0x50]));
1852 /// ```
1853 pub fn reverse(&mut self) {
1854 match self.size() {
1855 0 => (),
1856 n => unsafe {
1857 let aptr = self.words.as_ptr_mut();
1858 *aptr.add(n - 1) &= self.mask;
1859
1860 let mid = n >> 1;
1861 let upper_bound = n - 1;
1862
1863 for i in 0..mid {
1864 let a = (*aptr.add(i)).reverse_bits();
1865
1866 *aptr.add(i) = (*aptr.add(upper_bound - i)).reverse_bits();
1867 *aptr.add(upper_bound - i) = a;
1868 }
1869
1870 if (n & 1) == 1 { *aptr.add(mid) = (*aptr.add(mid)).reverse_bits() }
1871
1872 if self.padding > 0 {
1873 let overflow = 8 - self.padding;
1874 let mask = (1 << overflow) - 1;
1875
1876 self.words.shift_right(self.size(), mask, self.padding, overflow);
1877 }
1878 }
1879 }
1880 }
1881
1882 /// Reverses the order of the bits.
1883 ///
1884 /// # Examples
1885 /// ```
1886 /// # use bit_byte_bit::{Bits};
1887 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1888 ///
1889 /// assert_eq!(x1.reversed(), Bits::slice(&[0x03, 0x0D, 0x05], 20));
1890 ///
1891 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1892 ///
1893 /// assert_eq!(x2.reversed(), Bits::new([0x30, 0xD0, 0x50]));
1894 /// ```
1895 pub fn reversed(&self) -> Self {
1896 let mut cloned = self.clone();
1897
1898 cloned.reverse();
1899
1900 cloned
1901 }
1902
1903 /// Rotates bits to the left.
1904 ///
1905 /// # Examples
1906 /// ```
1907 /// # use bit_byte_bit::{Bits};
1908 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1909 ///
1910 /// x1.rotate_left(4);
1911 ///
1912 /// assert_eq!(x1, Bits::slice(&[0xAC, 0xB0, 0x00], 20));
1913 /// assert_eq!(x1.len(), 20);
1914 ///
1915 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1916 ///
1917 /// x2.rotate_left(4);
1918 ///
1919 /// assert_eq!(x2, Bits::new([0xA0, 0xB0, 0xC0]));
1920 /// assert_eq!(x2.len(), 24);
1921 /// ```
1922 pub fn rotate_left(&mut self, count: usize) {
1923 match (self.size(), count) {
1924 (0, _) | (_, 0) => (),
1925 (n, count) => {
1926 unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
1927
1928 let reduced_count = count % self.nbits;
1929 let other = self.shifted_right(self.nbits - reduced_count);
1930
1931 self.shift_left(reduced_count);
1932 self.or_mut(&other);
1933 }
1934 }
1935 }
1936
1937 /// Rotates bits to the left.
1938 ///
1939 /// # Examples
1940 /// ```
1941 /// # use bit_byte_bit::{Bits};
1942 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1943 ///
1944 /// assert_eq!(x1.rotated_left(4), Bits::slice(&[0xAC, 0xB0, 0x00], 20));
1945 /// assert_eq!(x1.len(), 20);
1946 ///
1947 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1948 ///
1949 /// assert_eq!(x2.rotated_left(4), Bits::new([0xA0, 0xB0, 0xC0]));
1950 /// assert_eq!(x2.len(), 24);
1951 /// ```
1952 pub fn rotated_left(&self, count: usize) -> Self {
1953 match (self.size(), count) {
1954 (0, _) | (_, 0) => self.clone(),
1955 (n, count) => {
1956 unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
1957
1958 let reduced_count = count % self.nbits;
1959 let mut other = self.shifted_left(reduced_count);
1960
1961 other |= self.shifted_right(self.nbits - reduced_count);
1962
1963 other
1964 }
1965 }
1966 }
1967
1968 /// Rotates bits to the right.
1969 ///
1970 /// # Examples
1971 /// ```
1972 /// # use bit_byte_bit::{Bits};
1973 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
1974 ///
1975 /// x1.rotate_right(4);
1976 ///
1977 /// assert_eq!(x1, Bits::slice(&[0xB0, 0xC0, 0x0A], 20));
1978 /// assert_eq!(x1.len(), 20);
1979 ///
1980 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
1981 ///
1982 /// x2.rotate_right(4);
1983 ///
1984 /// assert_eq!(x2, Bits::new([0xB0, 0xC0, 0xA0]));
1985 /// assert_eq!(x2.len(), 24);
1986 /// ```
1987 pub fn rotate_right(&mut self, count: usize) {
1988 match (self.size(), count) {
1989 (0, _) | (_, 0) => (),
1990 (n, count) => {
1991 unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
1992
1993 let reduced_count = count % self.nbits;
1994 let other = self.shifted_left(self.nbits - reduced_count);
1995
1996 self.shift_right(reduced_count);
1997 self.or_mut(&other);
1998 }
1999 }
2000 }
2001
2002 /// Rotates bits to the right.
2003 ///
2004 /// # Examples
2005 /// ```
2006 /// # use bit_byte_bit::{Bits};
2007 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2008 ///
2009 /// assert_eq!(x1.rotated_right(4), Bits::slice(&[0xB0, 0xC0, 0x0A], 20));
2010 /// assert_eq!(x1.len(), 20);
2011 ///
2012 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2013 ///
2014 /// assert_eq!(x2.rotated_right(4), Bits::new([0xB0, 0xC0, 0xA0]));
2015 /// assert_eq!(x2.len(), 24);
2016 /// ```
2017 pub fn rotated_right(&self, count: usize) -> Self {
2018 match (self.size(), count) {
2019 (0, _) | (_, 0) => self.clone(),
2020 (n, count) => {
2021 unsafe { *self.words.as_ptr_mut().add(n - 1) &= self.mask; }
2022
2023 let reduced_count = count % self.nbits;
2024 let mut other = self.shifted_right(reduced_count);
2025
2026 other |= self.shifted_left(self.nbits - reduced_count);
2027
2028 other
2029 }
2030 }
2031 }
2032
2033 /// Sets a bit to one.
2034 ///
2035 /// # Examples
2036 /// ```
2037 /// # use bit_byte_bit::{Bits};
2038 /// let mut x = Bits::new([15]);
2039 ///
2040 /// assert_eq!(x.i(4), 0u8);
2041 ///
2042 /// x.set(4);
2043 ///
2044 /// assert_eq!(x.i(4), 1u8);
2045 /// ```
2046 pub fn set(&mut self, i: usize) {
2047 assert!(i < self.nbits, "Index out of range");
2048
2049 unsafe { *self.words.as_ptr_mut().add(i >> 3) |= 1 << (i & 7); }
2050 }
2051
2052 /// Sets the state of a range of bits to one.
2053 ///
2054 /// # Examples
2055 /// ```
2056 /// # use bit_byte_bit::{Bits};
2057 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2058 /// x1.set_bits(7, 10);
2059 ///
2060 /// assert_eq!(x1, Bits::from([0x8A, 0xFF, 0x0D]));
2061 ///
2062 /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2063 /// x2.set_bits(8, 12);
2064 ///
2065 /// assert_eq!(x2, Bits::slice(&[0x0A, 0xFF, 0x0F], 20));
2066 /// ```
2067 ///
2068 /// ``` should_panic
2069 /// # use bit_byte_bit::{Bits};
2070 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2071 ///
2072 /// x.set_bits(21, 14);
2073 /// ```
2074 ///
2075 /// ```should_panic
2076 /// # use bit_byte_bit::{Bits};
2077 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2078 ///
2079 /// x.set_bits(7, 14);
2080 /// ```
2081 pub fn set_bits(&mut self, start: usize, count: usize) {
2082 assert!(count <= self.nbits && start <= self.nbits - count, "Invalid range");
2083
2084 let end = if count > (self.nbits - start) { self.nbits } else { start + count };
2085 let mut start = start;
2086 let low_overflow = 8 - (start & 7);
2087
2088 unsafe {
2089 let pointer = self.words.as_ptr_mut();
2090
2091 if low_overflow < 8 {
2092 *pointer.add(start >> 3) |= ((1 << low_overflow) - 1) << (start & 7);
2093 start = start + low_overflow;
2094 }
2095
2096 let bytes = (end - start) >> 3;
2097 let start_byte = start >> 3;
2098
2099 for i in start_byte..(start_byte + bytes) { *pointer.add(i) = 0xFF }
2100
2101 let overflow = (end - start) & 7;
2102
2103 if overflow > 0 { *pointer.add(start_byte + bytes) |= (1 << overflow) - 1; }
2104 }
2105 }
2106
2107 /// Sets the state of a byte to all ones.
2108 ///
2109 /// # Examples
2110 /// ```
2111 /// # use bit_byte_bit::{Bits};
2112 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2113 ///
2114 /// x.set_byte(1);
2115 ///
2116 /// assert_eq!(x, Bits::from([0x0A, 0xFF, 0x0C]));
2117 ///
2118 /// x.set_byte(2);
2119 ///
2120 /// assert_eq!(x, Bits::slice(&[0x0A, 0xFF, 0x0F], 20));
2121 ///```
2122 ///
2123 /// ```should_panic
2124 /// # use bit_byte_bit::{Bits};
2125 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2126 ///
2127 /// x.toggle_byte(3);
2128 /// ```
2129 pub fn set_byte(&mut self, i: usize) {
2130 assert!(i < self.size(), "Index out of range");
2131
2132 unsafe {
2133 let pointer = self.words.as_ptr_mut();
2134 *pointer.add(i) = 0xFF;
2135 *pointer.add(self.size() - 1) &= self.mask;
2136 }
2137 }
2138
2139 /// Sets the state of a range of bytes to all ones.
2140 ///
2141 /// # Examples
2142 /// ```
2143 /// # use bit_byte_bit::{Bits};
2144 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2145 ///
2146 /// x.set_bytes(1, 2);
2147 ///
2148 /// assert_eq!(x, Bits::slice(&[0x0A, 0xFF, 0x0F], 20));
2149 /// ```
2150 ///
2151 /// ```should_panic
2152 /// # use bit_byte_bit::{Bits};
2153 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2154 ///
2155 /// x.set_bytes(3, 2);
2156 /// ```
2157 ///
2158 /// ```should_panic
2159 /// # use bit_byte_bit::{Bits};
2160 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2161 ///
2162 /// x.set_bytes(0, 4);
2163 /// ```
2164 pub fn set_bytes(&mut self, start: usize, count: usize) {
2165 assert!(count <= self.size() && start <= self.size() - count, "Invalid range");
2166
2167 unsafe {
2168 let pointer = self.words.as_ptr_mut();
2169
2170 let end = if count > (self.size() - start) { self.size() } else { start + count };
2171
2172 for i in start..end { *pointer.add(i) = 0xFF; }
2173
2174 if end == self.size() && self.padding > 0 { *pointer.add(end - 1) &= self.mask; }
2175 }
2176 }
2177
2178 /// Shifts out upper bits, shifting in zeros on the lower end.
2179 ///
2180 /// # Examples
2181 /// ```
2182 /// # use bit_byte_bit::{Bits};
2183 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2184 ///
2185 /// x1.shift_left(17);
2186 ///
2187 /// assert_eq!(x1, Bits::slice(&[0x00, 0x00, 0x04], 20));
2188 /// assert_eq!(x1.len(), 20);
2189 ///
2190 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2191 ///
2192 /// x2.shift_left(4);
2193 ///
2194 /// assert_eq!(x2, Bits::new([0xA0, 0xB0, 0xC0]));
2195 /// assert_eq!(x2.len(), 24);
2196 /// ```
2197 pub fn shift_left(&mut self, count: usize) {
2198 match (self.size(), count) {
2199 (0, _) | (_, 0) => (),
2200 (_, count) if count >= self.nbits => unsafe {
2201 let pointer = self.words.as_ptr_mut();
2202
2203 for i in 0..self.size() { *pointer.add(i) = 0 }
2204 },
2205 (n, count) => unsafe {
2206 let pointer = self.words.as_ptr_mut();
2207 let shift_overflow = count & 7;
2208 let shift_bytes = count >> 3;
2209
2210 if shift_bytes > 0 {
2211 ptr::copy(pointer, pointer.add(shift_bytes), self.size() - shift_bytes);
2212
2213 for i in 0..shift_bytes { *pointer.add(i) = 0; }
2214
2215 *pointer.add(n - 1) &= self.mask;
2216 }
2217
2218 if shift_overflow > 0 {
2219 let low = 8 - shift_overflow;
2220
2221 for i in 1..n {
2222 *pointer.add(n - i) <<= shift_overflow;
2223 *pointer.add(i) |= *pointer.add(n - i - 1) >> low;
2224 }
2225
2226 *pointer <<= shift_overflow;
2227 }
2228
2229 *pointer.add(n - 1) &= self.mask;
2230 }
2231 }
2232 }
2233
2234 /// Shifts out upper bits, shifting in zeros on the lower end.
2235 ///
2236 /// # Examples
2237 /// ```
2238 /// # use bit_byte_bit::{Bits};
2239 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2240 /// let s1 = x1.shifted_left(17);
2241 ///
2242 /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
2243 /// assert_eq!(s1.len(), 20);
2244 ///
2245 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2246 /// let s2 = x2.shifted_left(4);
2247 ///
2248 /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
2249 /// assert_eq!(s2.len(), 24);
2250 /// ```
2251 pub fn shifted_left(&self, count: usize) -> Self {
2252 let mut clone = self.clone();
2253
2254 clone.shift_left(count);
2255
2256 clone
2257 }
2258
2259 /// Shifts out lower bits, shifting zeros into the upper bits.
2260 ///
2261 /// # Examples
2262 /// ```
2263 /// # use bit_byte_bit::{Bits};
2264 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2265 ///
2266 /// x1.shift_right(17);
2267 ///
2268 /// assert_eq!(x1.len(), 20);
2269 /// assert_eq!(x1, Bits::slice(&[0x06, 0x00, 0x00], 20));
2270 ///
2271 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2272 ///
2273 /// x2.shift_right(4);
2274 ///
2275 /// assert_eq!(x2.len(), 24);
2276 /// assert_eq!(x2, Bits::new([0xB0, 0xC0, 0x00]));
2277 /// ```
2278 pub fn shift_right(&mut self, count: usize) {
2279 match (self.size(), count) {
2280 (0, _) | (_, 0) => (),
2281 (_, count) if count >= self.nbits => unsafe {
2282 let pointer = self.words.as_ptr_mut();
2283
2284 for i in 0..self.size() { *pointer.add(i) = 0 }
2285 },
2286 (n, count) => unsafe {
2287 let pointer = self.words.as_ptr_mut();
2288 *pointer.add(n - 1) &= self.mask;
2289 let nbytes_shift = count >> 3;
2290
2291 ptr::copy(pointer.add(nbytes_shift), pointer, self.size() - nbytes_shift);
2292
2293 for i in (self.size() - nbytes_shift)..self.size() { *pointer.add(i) = 0; }
2294
2295 let overflow = count & 7;
2296
2297 if overflow > 0 {
2298 let mask = (1 << overflow) - 1;
2299 let low = 8 - overflow;
2300
2301 self.words.shift_right(self.size() - nbytes_shift, mask, low, overflow);
2302 }
2303 }
2304 }
2305 }
2306
2307 /// Shifts out lower bits, shifting zeros into the upper bits.
2308 ///
2309 /// # Examples
2310 /// ```
2311 /// # use bit_byte_bit::{Bits};
2312 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2313 /// let s1 = x1.shifted_right(17);
2314 ///
2315 /// assert_eq!(s1.len(), 20);
2316 /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
2317 ///
2318 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2319 /// let s2 = x2.shifted_right(4);
2320 ///
2321 /// assert_eq!(s2.len(), 24);
2322 /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
2323 /// ```
2324 pub fn shifted_right(&self, count: usize) -> Self {
2325 let mut clone = self.clone();
2326
2327 clone.shift_right(count);
2328
2329 clone
2330 }
2331
2332 /// The number of bytes.
2333 ///
2334 /// # Examples
2335 /// ```
2336 /// # use bit_byte_bit::{Bits};
2337 /// let x1 = Bits::empty();
2338 ///
2339 /// assert_eq!(x1.size(), 0);
2340 ///
2341 /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2342 ///
2343 /// assert_eq!(x2.size(), 3);
2344 ///
2345 /// let x3 = Bits::new([0x0A, 0x0B, 0x0C]);
2346 ///
2347 /// assert_eq!(x3.size(), 3);
2348 ///
2349 /// let x4 = Bits::slice(&[0x0A, 0x0B, 0x0C], 13);
2350 ///
2351 /// assert_eq!(x4.size(), 2);
2352 /// ```
2353 pub fn size(&self) -> usize { self.words.nbytes }
2354
2355 /// Splits the bit string.
2356 ///
2357 /// When the index is greater than or equal to the length
2358 /// of the bit string, the second element of the returned
2359 /// pair will be empty. When the index is `0`, the first
2360 /// element will be empty.
2361 ///
2362 /// # Examples
2363 /// ```
2364 /// # use bit_byte_bit::{Bits};
2365 /// let x1 = Bits::empty();
2366 /// let (l1, r1) = x1.split(11);
2367 ///
2368 /// assert_eq!(l1.len(), 0);
2369 /// assert_eq!(r1.len(), 0);
2370 ///
2371 /// let x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2372 /// let (l2, r2) = x2.split(20);
2373 ///
2374 /// assert_eq!(l2, x2);
2375 /// assert_eq!(r2.len(), 0);
2376 ///
2377 /// let (l3, r3) = x2.split(0);
2378 ///
2379 /// assert_eq!(l3.len(), 0);
2380 /// assert_eq!(r3, x2);
2381 ///
2382 /// let (l4, r4) = x2.split(11);
2383 /// assert_eq!(l4, Bits::slice(&[0x0A, 0x03], 11));
2384 /// assert_eq!(r4, Bits::slice(&[0x81, 0x01], 9));
2385 /// ```
2386 pub fn split(&self, i: usize) -> (Bits, Bits) {
2387 if i >= self.nbits { return (self.clone(), Bits::empty()) }
2388
2389 if i == 0 { return (Bits::empty(), self.clone()) }
2390
2391 let rlen = self.nbits - i;
2392 let (lsize, loverflow) = divrem8!(ceil; i);
2393 let idiv8 = i >> 3;
2394 let (rsize, roverflow) = (self.size() - idiv8, rlen & 7);
2395 let (lmask, rmask) = (mask!(loverflow), mask!(roverflow));
2396
2397 unsafe {
2398 let pointer = self.words.as_ptr_mut();
2399 let l = pointer![lsize];
2400 let r = pointer![rsize];
2401
2402 for i in 0..lsize { *l.add(i) = *pointer.add(i); }
2403 for i in 0..rsize { *r.add(i) = *pointer.add(idiv8 + i); }
2404
2405 let rbytes = RawBytes { bytes: NonNull::new(r).unwrap(), cap: rsize, nbytes: rsize };
2406
2407 let mut rbits = Bits {
2408 words: rbytes,
2409 mask: rmask,
2410 nbits: self.nbits - i,
2411 padding: (8 - roverflow) & 7
2412 };
2413
2414 if loverflow > 0 {
2415 *l.add(lsize - 1) &= lmask;
2416
2417 rbits.words.shift_right(rsize, lmask, 8 - loverflow, loverflow);
2418 }
2419
2420 let lbytes = RawBytes { bytes: NonNull::new(l).unwrap(), cap: lsize, nbytes: lsize };
2421
2422 let lbits = Bits {
2423 words: lbytes,
2424 mask: lmask,
2425 nbits: i,
2426 padding: (8 - loverflow) & 7
2427 };
2428
2429 (lbits, rbits)
2430 }
2431 }
2432
2433 /// Whether a bit is one.
2434 ///
2435 /// # Examples
2436 /// ```
2437 /// # use bit_byte_bit::{Bits};
2438 /// let mut x = Bits::from([0x0F]);
2439 ///
2440 /// assert!(x.test(3));
2441 /// assert!(!x.test(4));
2442 /// assert!(!x.test(8));
2443 /// ```
2444 pub fn test(&self, i: usize) -> bool {
2445 unsafe {
2446 i < self.nbits && (*self.words.as_ptr_mut().add(i >> 3) & (1 << (i & 7))) > 0
2447 }
2448 }
2449
2450 /// Flips the state of a bit.
2451 ///
2452 /// # Examples
2453 /// ```
2454 /// # use bit_byte_bit::{Bits};
2455 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2456 ///
2457 /// assert_eq!(x.i(0), 0u8);
2458 /// assert_eq!(x.i(1), 1u8);
2459 ///
2460 /// x.toggle(0);
2461 /// x.toggle(1);
2462 ///
2463 /// assert_eq!(x.i(0), 1u8);
2464 /// assert_eq!(x.i(1), 0u8);
2465 /// ```
2466 ///
2467 /// ```should_panic
2468 /// # use bit_byte_bit::{Bits};
2469 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2470 ///
2471 /// x.toggle(21);
2472 /// ```
2473 pub fn toggle(&mut self, i: usize) {
2474 assert!(i < self.nbits, "Index out of range");
2475
2476 unsafe { *self.words.as_ptr_mut().add(i >> 3) ^= 1 << (i & 7); }
2477 }
2478
2479 /// Flips the state of a range of bits.
2480 ///
2481 /// # Examples
2482 /// ```
2483 /// # use bit_byte_bit::{Bits};
2484 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2485 /// x1.toggle_bits(7, 10);
2486 ///
2487 /// assert_eq!(x1, Bits::from([0x8A, 0xF4, 0x0D]));
2488 ///
2489 /// let mut x2 = Bits::from([0x0A, 0x0B, 0x0C]);
2490 /// x2.toggle_bits(8, 12);
2491 ///
2492 /// assert_eq!(x2, Bits::slice(&[0x0A, 0xF4, 0x03], 20));
2493 /// ```
2494 ///
2495 /// ``` should_panic
2496 /// # use bit_byte_bit::{Bits};
2497 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2498 ///
2499 /// x.toggle_bits(21, 14);
2500 /// ```
2501 ///
2502 /// ```should_panic
2503 /// # use bit_byte_bit::{Bits};
2504 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2505 ///
2506 /// x.toggle_bits(7, 14);
2507 /// ```
2508 pub fn toggle_bits(&mut self, start: usize, count: usize) {
2509 assert!(count <= self.nbits && start <= self.nbits - count, "Invalid range");
2510
2511 let end = if count > (self.nbits - start) { self.nbits } else { start + count };
2512 let mut start = start;
2513 let low_overflow = 8 - (start & 7);
2514
2515 unsafe {
2516 let pointer = self.words.as_ptr_mut();
2517
2518 if low_overflow < 8 {
2519 *pointer.add(start >> 3) ^= ((1 << low_overflow) - 1) << (start & 7);
2520 start = start + low_overflow;
2521 }
2522
2523 let bytes = (end - start) >> 3;
2524 let start_byte = start >> 3;
2525
2526 for i in start_byte..(start_byte + bytes) { *pointer.add(i) = !*pointer.add(i); }
2527
2528 let overflow = (end - start) & 7;
2529
2530 if overflow > 0 { *pointer.add(start_byte + bytes) ^= (1 << overflow) - 1; }
2531 }
2532 }
2533
2534 /// Flips the state of a byte.
2535 ///
2536 /// # Examples
2537 /// ```
2538 /// # use bit_byte_bit::{Bits};
2539 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2540 ///
2541 /// x.toggle_byte(1);
2542 ///
2543 /// assert_eq!(x, Bits::from([0x0A, 0xF4, 0x0C]));
2544 ///
2545 /// x.toggle_byte(2);
2546 ///
2547 /// assert_eq!(x, Bits::slice(&[0x0A, 0xF4, 0x03], 20));
2548 ///```
2549 ///
2550 /// ```should_panic
2551 /// # use bit_byte_bit::{Bits};
2552 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2553 ///
2554 /// x.toggle_byte(3);
2555 /// ```
2556 pub fn toggle_byte(&mut self, i: usize) {
2557 assert!(i < self.size(), "Index out of range");
2558
2559 unsafe {
2560 let pointer = self.words.as_ptr_mut();
2561 *pointer.add(i) = !*pointer.add(i);
2562 *pointer.add(self.size() - 1) &= self.mask;
2563 }
2564 }
2565
2566 /// Flips the state of a range of bytes.
2567 ///
2568 /// # Examples
2569 /// ```
2570 /// # use bit_byte_bit::{Bits};
2571 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2572 ///
2573 /// x.toggle_bytes(1, 2);
2574 ///
2575 /// assert_eq!(x, Bits::slice(&[0x0A, 0xF4, 0x03], 20));
2576 /// ```
2577 ///
2578 /// ```should_panic
2579 /// # use bit_byte_bit::{Bits};
2580 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2581 ///
2582 /// x.toggle_bytes(3, 2);
2583 /// ```
2584 ///
2585 /// ```should_panic
2586 /// # use bit_byte_bit::{Bits};
2587 /// let mut x = Bits::from([0x0A, 0x0B, 0x0C]);
2588 ///
2589 /// x.toggle_bytes(0, 4);
2590 /// ```
2591 pub fn toggle_bytes(&mut self, start: usize, count: usize) {
2592 assert!(count <= self.size() && start <= self.size() - count, "Invalid range");
2593
2594 unsafe {
2595 let pointer = self.words.as_ptr_mut();
2596
2597 let end = if count > (self.size() - start) { self.size() } else { start + count };
2598
2599 for i in start..end { *pointer.add(i) = !*pointer.add(i); }
2600
2601 if end == self.size() && self.padding > 0 { *pointer.add(end - 1) &= self.mask; }
2602 }
2603 }
2604
2605 /// The number of trailing ones.
2606 ///
2607 /// # Examples
2608 /// ```
2609 /// # use bit_byte_bit::{Bits};
2610 /// let x = Bits::from([0xFF, 0x0B, 0x0A]);
2611 ///
2612 /// assert_eq!(x.trailing_ones(), 10);
2613 /// ```
2614 pub fn trailing_ones(&self) -> usize {
2615 match self.size() {
2616 0 => 0,
2617 n => unsafe {
2618 let pointer = self.words.as_ptr_const();
2619 let mut i = 1;
2620
2621 while i < (n - 1) && *pointer.add(i - 1) == 0xFF { i += 1; }
2622
2623 ((i - 1) << 3) + ((*pointer.add(i - 1) & self.mask).trailing_ones() as usize)
2624 }
2625 }
2626 }
2627
2628 /// The number of trailing zeros.
2629 ///
2630 /// # Examples
2631 /// ```
2632 /// # use bit_byte_bit::{Bits};
2633 /// let x1 = Bits::from([0x00, 0x0A, 0x0B]);
2634 ///
2635 /// assert_eq!(x1.trailing_zeros(), 9);
2636 ///
2637 /// let x2 = Bits::zeros(20);
2638 ///
2639 /// assert_eq!(x2.trailing_zeros(), 20);
2640 /// ```
2641 pub fn trailing_zeros(&self) -> usize {
2642 match self.size() {
2643 0 => 0,
2644 n => unsafe {
2645 let pointer = self.words.as_ptr_const();
2646 let mut i = 0;
2647
2648 while i < (n - 1) && *pointer.add(i) == 0 { i += 1; }
2649
2650 let zeros = if i == (n - 1) {
2651 let mut trailing = (*pointer.add(i) & self.mask).trailing_zeros() as usize;
2652
2653 if *pointer.add(i) == 0 { trailing -= self.padding; }
2654
2655 trailing
2656 } else {
2657 (*pointer.add(i)).trailing_zeros() as usize
2658 };
2659
2660 zeros + (i << 3)
2661 }
2662 }
2663 }
2664
2665 /// Trims leading bits.
2666 ///
2667 /// # Examples
2668 /// ```
2669 /// # use bit_byte_bit::{Bits};
2670 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2671 ///
2672 /// x1.trim_end(false);
2673 ///
2674 /// assert_eq!(x1.len(), 20);
2675 /// assert_eq!(x1, Bits::from([0x0A, 0x0B, 0x0C]));
2676 ///
2677 /// x1.trim_end(true);
2678 ///
2679 /// assert_eq!(x1.len(), 18);
2680 /// assert_eq!(x1, Bits::slice(&[0x0A, 0x0B, 0x00], 18));
2681 ///
2682 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
2683 ///
2684 /// x2.trim_end(true);
2685 ///
2686 /// assert_eq!(x2.len(), 24);
2687 /// assert_eq!(x2, Bits::new([0x0A, 0x0B, 0x0C]));
2688 ///
2689 /// x2.trim_end(false);
2690 ///
2691 /// assert_eq!(x2.len(), 20);
2692 /// assert_eq!(x2, Bits::from([0x0A, 0x0B, 0x0C]));
2693 ///
2694 /// let mut x3 = Bits::slice(&[0x0A, 0x0B, 0x00], 18);
2695 ///
2696 /// x3.trim_end(false);
2697 ///
2698 /// assert_eq!(x3.len(), 12);
2699 /// assert_eq!(x3, Bits::from([0x0A, 0x0B]));
2700 ///
2701 /// let mut x4 = Bits::slice(&[0x0A, 0xFB, 0x03], 18);
2702 ///
2703 /// x4.trim_end(true);
2704 ///
2705 /// assert_eq!(x4.len(), 11);
2706 /// assert_eq!(x4, Bits::slice(&[0x0A, 0x0B], 11));
2707 /// ```
2708 pub fn trim_end(&mut self, bit: bool) {
2709 unsafe {
2710 let pointer = self.words.as_ptr_mut();
2711 *pointer.add(self.size() - 1) &= self.mask;
2712 let mut i = self.size();
2713
2714 if self.padding > 0 {
2715 let last_byte = pointer.add(self.size() - 1);
2716
2717 if bit && *last_byte != self.mask {
2718 *last_byte <<= self.padding;
2719 let clo = (*last_byte).leading_ones() as usize;
2720 *last_byte <<= clo;
2721 *last_byte >>= self.padding + clo;
2722 self.nbits-= clo;
2723 let overflow = self.nbits & 7;
2724 self.padding = (8 - overflow) & 7;
2725 self.mask = mask!(overflow);
2726
2727 return;
2728 } else if !bit && *last_byte != 0 {
2729 let clz = (*last_byte).leading_zeros() as usize;
2730
2731 self.nbits = self.nbits + self.padding - clz;
2732 let overflow = self.nbits & 7;
2733 self.padding = (8 - overflow) & 7;
2734 self.mask = mask!(overflow);
2735
2736 return;
2737 }
2738
2739 i -= 1;
2740 }
2741
2742 let match_byte = if bit { 0xFF } else { 0 };
2743
2744 while i > 0 && *pointer.add(i - 1) == match_byte { i -= 1; }
2745
2746 if i == 0 {
2747 for i in 0..self.size() { *pointer.add(i) = 0; }
2748
2749 self.words.nbytes = 0;
2750 self.nbits = 0;
2751 self.padding = 0;
2752 self.mask = 0xFF;
2753 self.words.shrink_to(0);
2754
2755 return;
2756 }
2757
2758 self.words.shrink_to(i);
2759
2760 let trailing = if bit {
2761 (*pointer.add(i - 1)).leading_ones() as usize
2762 } else {
2763 (*pointer.add(i - 1)).leading_zeros() as usize
2764 };
2765
2766 self.words.nbytes = i;
2767 self.nbits = (i << 3) - trailing;
2768 let overflow = self.nbits & 7;
2769 self.padding = (8 - overflow) & 7;
2770 self.mask = mask!(overflow);
2771 *pointer.add(i - 1) &= self.mask;
2772 }
2773 }
2774
2775 /// Trims trailing bits.
2776 ///
2777 /// # Examples
2778 /// ```
2779 /// # use bit_byte_bit::{Bits};
2780 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
2781 ///
2782 /// x1.trim_start(true);
2783 ///
2784 /// assert_eq!(x1.len(), 20);
2785 /// assert_eq!(x1, Bits::from([0x0A, 0x0B, 0x0C]));
2786 ///
2787 /// x1.trim_start(false);
2788 ///
2789 /// assert_eq!(x1.len(), 19);
2790 /// assert_eq!(x1, Bits::from([0x85, 0x05, 0x06]));
2791 ///
2792 /// let mut x2 = Bits::new([0x00, 0x0A, 0x0B]);
2793 ///
2794 /// x2.trim_start(false);
2795 ///
2796 /// assert_eq!(x2.len(), 15);
2797 /// assert_eq!(x2, Bits::slice(&[0x85, 0x05], 15));
2798 ///
2799 /// let mut x3 = Bits::new([0xFF, 0x0B, 0x0C]);
2800 ///
2801 /// x3.trim_start(true);
2802 ///
2803 /// assert_eq!(x3.len(), 14);
2804 /// assert_eq!(x3, Bits::slice(&[0x02, 0x03], 14));
2805 /// ```
2806 pub fn trim_start(&mut self, bit: bool) {
2807 unsafe {
2808 let pointer = self.words.as_ptr_mut();
2809 let last = pointer.add(self.size() - 1);
2810 *last &= self.mask;
2811 let mut i = 0;
2812 let match_byte = if bit { 0xFF } else { 0 };
2813
2814 while i < (self.size() - 1) && *pointer.add(i) == match_byte { i += 1; }
2815
2816
2817 if i == (self.size() - 1) {
2818 if (bit && *last == self.mask) || (!bit && *last == 0)
2819 {
2820 for i in 0..self.size() { *pointer.add(i) = 0; }
2821
2822 self.words.nbytes = 0;
2823 self.nbits = 0;
2824 self.padding = 0;
2825 self.mask = 0xFF;
2826
2827 self.words.shrink_to(0);
2828
2829 return;
2830 }
2831
2832 let trailing = if bit {
2833 (*last).trailing_ones()
2834 } else {
2835 (*last).trailing_zeros()
2836 } as usize;
2837
2838 *pointer = *last >> trailing;
2839
2840 self.padding += trailing;
2841 self.words.nbytes = 1;
2842 self.nbits = 8 - self.padding - trailing;
2843 self.mask = mask!(self.nbits & 7);
2844
2845 self.words.shrink_to(1);
2846
2847 return;
2848 }
2849
2850 ptr::copy(pointer.add(i), pointer, self.size() - i);
2851
2852 self.words.nbytes -= i;
2853 self.nbits -= i << 3;
2854
2855 let trailing = if bit {
2856 (*pointer).trailing_ones()
2857 } else {
2858 (*pointer).trailing_zeros()
2859 } as usize;
2860
2861 if trailing > 0 {
2862 let mask = (1 << trailing) - 1;
2863 let low = 8 - trailing;
2864
2865 self.words.shift_right(self.size(), mask, low, trailing);
2866
2867 self.nbits -= trailing;
2868 let overflow = self.nbits & 7;
2869 self.padding = (8 - overflow) & 7;
2870 self.mask = mask!(overflow);
2871 }
2872
2873 self.shrink_to_fit()
2874 }
2875 }
2876
2877 /// Bitwise exclusive or of two bit strings.
2878 ///
2879 /// # Examples
2880 /// ```
2881 /// # use bit_byte_bit::{Bits};
2882 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
2883 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
2884 ///
2885 /// assert_eq!(x1.xor(&y1), Bits::from([0x80, 0x80, 0x80]));
2886 ///
2887 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
2888 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
2889 ///
2890 /// assert_eq!(x2.len(), 23);
2891 /// assert_eq!(y2.len(), 24);
2892 ///
2893 /// let z = x2.xor(&y2);
2894 ///
2895 /// assert_eq!(z.len(), 24);
2896 /// ```
2897 pub fn xor(&self, rhs: &Bits) -> Bits { bitop!(self, ^, rhs) }
2898
2899 /// Bitwise exclusive or of two bit strings.
2900 ///
2901 /// # Examples
2902 /// ```
2903 /// # use bit_byte_bit::{Bits};
2904 /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
2905 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
2906 ///
2907 /// x1.xor_mut(&y1);
2908 ///
2909 /// assert_eq!(x1, Bits::from([0x80, 0x80, 0x80]));
2910 ///
2911 /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
2912 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
2913 ///
2914 /// assert_eq!(x2.len(), 23);
2915 /// assert_eq!(y2.len(), 24);
2916 ///
2917 /// x2.xor_mut(&y2);
2918 ///
2919 /// assert_eq!(x2.len(), 24);
2920 /// ```
2921 pub fn xor_mut(&mut self, rhs: &Bits) { bitop!(assign; self, ^=, rhs) }
2922
2923 /// Creates a bit string by copying a range of bits.
2924 ///
2925 /// The range is truncated to take no more than the number of available bits from the
2926 /// starting bound. For alternative behavior, consider [Bits::take], which pads zeros
2927 /// when the length exceeds the number of available bits.
2928 ///
2929 /// # Examples
2930 /// ```
2931 /// # use bit_byte_bit::{Bits};
2932 /// let x1 = Bits::empty();
2933 /// let x1_r1 = x1.xrange(1..18);
2934 ///
2935 /// assert_eq!(x1_r1, Bits::empty());
2936 ///
2937 /// let x2 = Bits::zeros(24);
2938 /// let x2_r1 = x2.xrange(8..24);
2939 /// let x2_r2 = x2.xrange(8..=23);
2940 ///
2941 /// assert_eq!(x2_r1, Bits::zeros(16));
2942 /// assert_eq!(x2_r2, x2_r1);
2943 ///
2944 /// let x3 = Bits::from([0x0A, 0x0B, 0x0C]);
2945 /// let x3_r1 = x3.xrange(1..2);
2946 ///
2947 /// assert_eq!(x3_r1, Bits::from([0x01]));
2948 ///
2949 /// let x3_r2 = x3.xrange(0..);
2950 /// let x3_r3 = x3.xrange(..);
2951 ///
2952 /// assert_eq!(x3_r2, x3);
2953 /// assert_eq!(x3_r3, x3_r2);
2954 ///
2955 /// let x3_r4 = x3.xrange(..32);
2956 ///
2957 /// assert_eq!(x3_r4, Bits::from([0x0A, 0x0B, 0x0C]));
2958 /// assert_eq!(x3_r4.len(), 20);
2959 ///
2960 /// let x3_r5 = x3.xrange(18..32);
2961 ///
2962 /// assert_eq!(x3_r5, Bits::from([0x3]));
2963 /// assert_eq!(x3_r5.len(), 2);
2964 ///
2965 /// let x3_r6 = x3.xrange(8..0);
2966 ///
2967 /// assert_eq!(x3_r6, Bits::empty());
2968 /// ```
2969 pub fn xrange<R: RangeBounds<usize>>(&self, bounds: R) -> Self {
2970 if let Bound::Excluded(&usize::MAX) = bounds.start_bound() {
2971 return Bits::empty();
2972 } else if let Bound::Excluded(&0) = bounds.end_bound() {
2973 return Bits::empty();
2974 }
2975
2976 let start = match bounds.start_bound() {
2977 Bound::Included(n) if *n < self.nbits => *n,
2978 Bound::Unbounded => 0,
2979 Bound::Excluded(n) if *n < self.nbits => *n + 1,
2980 _ => self.nbits,
2981 };
2982
2983 let end = match bounds.end_bound() {
2984 Bound::Excluded(n) if *n < self.nbits => *n,
2985 Bound::Included(n) if *n < self.nbits => *n + 1,
2986 _ => self.nbits,
2987 };
2988
2989 if start >= end {
2990 Bits::empty()
2991 } else {
2992 Bits::take(self.bytes(), start, end - start)
2993 }
2994 }
2995
2996 fn cons_bit(&mut self, nbits: usize, fill: u8) {
2997 unsafe {
2998 let (nbytes_padding, overflow) = divrem8!(ceil; nbits);
2999 let nbytes = self.size() + nbytes_padding;
3000
3001 self.words.expand_to(nbytes);
3002
3003 let pointer = self.words.as_ptr_mut();
3004
3005 if self.size() > 0 { *pointer.add(self.size() - 1) &= self.mask; }
3006
3007 ptr::copy(pointer, pointer.add(nbytes_padding), self.size());
3008
3009 for i in 0..nbytes_padding { ptr::write(pointer.add(i), fill); }
3010
3011 *pointer.add(nbytes_padding - 1) &= mask!(overflow);
3012
3013 if overflow > 0 {
3014 let clz = 8 - overflow;
3015 let mask = (1 << clz) - 1;
3016
3017 self.words.shift_right_from(nbytes_padding, nbytes, mask, overflow, clz);
3018 }
3019
3020 self.words.nbytes = nbytes;
3021 self.nbits += nbits;
3022 let new_overflow = self.nbits & 7;
3023 self.padding = (8 - new_overflow) & 7;
3024 self.mask = mask!(new_overflow);
3025 self.shrink_to_fit();
3026 }
3027 }
3028
3029 fn push_ones(&mut self, count: usize) {
3030 unsafe {
3031 let pointer = self.words.as_ptr_mut();
3032 *pointer.add(self.size() - 1) &= self.mask;
3033 let overflow = self.nbits & 7;
3034
3035 if self.padding > 0 && count <= self.padding {
3036 *pointer.add(self.size() - 1) |= ((1 << count) - 1) << overflow;
3037 } else {
3038 *pointer.add(self.size() - 1) |= ((1 << self.padding) - 1) << overflow;
3039
3040 let (byte_len, overflow) = divrem8!(ceil; count - self.padding);
3041
3042 self.words.expand_to(self.size() + byte_len);
3043
3044 let pointer = self.words.as_ptr_mut().add(self.size());
3045
3046 for i in 0..(byte_len - 1) { ptr::write(pointer.add(i), 0xFF); }
3047
3048 ptr::write(pointer.add(byte_len - 1), mask!(overflow));
3049
3050 self.words.nbytes += byte_len;
3051 }
3052
3053 self.nbits += count;
3054 let overflow = self.nbits & 7;
3055 self.padding = (8 - overflow) & 7;
3056 self.mask = mask!(overflow);
3057 }
3058 }
3059
3060 fn push_zeros(&mut self, count: usize) {
3061 unsafe {
3062 let pointer = self.words.as_ptr_mut();
3063 *pointer.add(self.size() - 1) &= self.mask;
3064
3065 if self.padding == 0 || count > self.padding {
3066 let byte_len = 1 + ((count - self.padding - 1) >> 3);
3067
3068 self.words.expand_to(self.size() + byte_len);
3069
3070 let pointer = self.words.as_ptr_mut().add(self.size());
3071
3072 for i in 0..byte_len { ptr::write(pointer.add(i), 0); }
3073
3074 self.words.nbytes += byte_len;
3075 }
3076
3077 self.nbits += count;
3078 let overflow = self.nbits & 7;
3079 self.padding = (8 - overflow) & 7;
3080 self.mask = mask!(overflow);
3081 }
3082 }
3083
3084 fn shrink_to_fit(&mut self) { self.words.shrink_to(1 + ((self.nbits - 1) >> 3)); }
3085}
3086
3087impl Clone for Bits {
3088 fn clone(&self) -> Self {
3089 match self.size() {
3090 0 => Bits::empty(),
3091 nbytes => unsafe {
3092 let pointer = self.words.as_ptr_mut();
3093 let layout = Layout::array::<u8>(nbytes).unwrap();
3094 let clone = alloc::alloc(layout);
3095
3096 for i in 0..nbytes { ptr::write(clone.add(i), *pointer.add(i)); }
3097
3098 *clone.add(nbytes - 1) &= self.mask;
3099
3100 let bytes = RawBytes { bytes: NonNull::new(clone).unwrap(), cap: nbytes, nbytes };
3101
3102 Bits { words: bytes, mask: self.mask, nbits: self.nbits, padding: self.padding }
3103 }
3104 }
3105 }
3106}
3107
3108impl Drop for Bits {
3109 fn drop(&mut self) {
3110
3111 if self.words.nbytes > 0 {
3112 unsafe {
3113 let pointer = self.words.as_ptr_mut();
3114
3115 for i in 0..self.words.nbytes { ptr::read(pointer.add(i)); }
3116 }
3117 }
3118 }
3119}
3120
3121unsafe impl Send for Bits {}
3122
3123unsafe impl Sync for Bits {}
3124
3125/* Section::Display */
3126
3127impl Binary for Bits {
3128 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
3129 unsafe {
3130 let aptr = self.words.as_ptr_const();
3131
3132 if self.padding == 0 {
3133 for i in (0..self.size()).rev() { write!(f, "{:08b}", *aptr.add(i))?; }
3134 } else {
3135 write!(
3136 f,
3137 "{:01$b}",
3138 *aptr.add(self.size() - 1) & self.mask,
3139 8 - self.padding
3140 )?;
3141
3142 for i in (0..(self.size() - 1)).rev() {
3143 write!(f, "{:08b}", *aptr.add(i))?;
3144 }
3145 }
3146
3147 Ok(())
3148 }
3149 }
3150}
3151
3152impl Debug for Bits {
3153 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
3154 write!(f, "Bits<")?;
3155 Binary::fmt(&self, f)?;
3156 write!(f, ": {}>", self.nbits)
3157 }
3158}
3159
3160impl Display for Bits {
3161 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { Binary::fmt(&self, f) }
3162}
3163
3164/* Section::Constructors */
3165
3166impl From<&[u8]> for Bits {
3167 fn from(data: &[u8]) -> Self { Self::from(data.to_vec()) }
3168}
3169
3170impl<const N: usize> From<[u8; N]> for Bits {
3171 fn from(bytes: [u8; N]) -> Self {
3172 let mut nbytes = N;
3173
3174 while nbytes > 0 && bytes[nbytes - 1] == 0 { nbytes -= 1; }
3175
3176 if nbytes == 0 {
3177 Bits::empty()
3178 } else {
3179 let nbits = (nbytes << 3) - (bytes[nbytes - 1].leading_zeros() as usize);
3180 let mut truncated_bytes = bytes[..nbytes].to_vec();
3181 let pointer = truncated_bytes.as_mut_ptr();
3182
3183 std::mem::forget(truncated_bytes);
3184
3185 let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
3186 let overflow = nbits & 7;
3187
3188 Bits { words: bytes, mask: mask!(overflow), nbits, padding: (8 - overflow) & 7 }
3189 }
3190 }
3191}
3192
3193impl From<Vec<u8>> for Bits {
3194 fn from(mut bytes: Vec<u8>) -> Self {
3195 let mut nbytes = bytes.len();
3196
3197 while nbytes > 0 && bytes[nbytes - 1] == 0 { nbytes -= 1; }
3198
3199 match nbytes {
3200 0 => Bits::empty(),
3201 nbytes => {
3202 let nbits = (nbytes << 3) - (bytes[nbytes - 1].leading_zeros() as usize);
3203
3204 bytes.truncate(nbytes);
3205
3206 let cap = bytes.capacity();
3207 let pointer = bytes.as_mut_ptr();
3208 let overflow = nbits & 7;
3209
3210 std::mem::forget(bytes);
3211
3212 let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap, nbytes };
3213
3214 Bits { words: bytes, mask: mask!(overflow), nbits, padding: (8 - overflow) & 7 }
3215 }
3216 }
3217 }
3218}
3219
3220impl From<&[bool]> for Bits {
3221 /// Creates a bit string from booleans.
3222 ///
3223 /// # Examples
3224 /// ```
3225 /// # use bit_byte_bit::{Bits};
3226 /// let bits1 = vec![true, false, true, true, false, true, true];
3227 /// let x1 = Bits::from(bits1.as_slice());
3228 ///
3229 /// assert_eq!(x1.len(), 7);
3230 /// assert_eq!(x1, Bits::from([0x6D]));
3231 ///
3232 /// let bits2 = vec![true, false, true, false, false, false, false, false, false];
3233 /// let x2 = Bits::from(bits2.as_slice());
3234 ///
3235 /// assert_eq!(x2.len(), 9);
3236 /// assert_eq!(x2, Bits::slice(&[0x05, 0x00], 9));
3237 /// ```
3238 fn from(bits: &[bool]) -> Self {
3239 match bits.len() {
3240 0 => Bits::empty(),
3241 nbits => unsafe {
3242 let (nbytes, overflow) = divrem8!(ceil; nbits);
3243 let padding = (8 - overflow) & 7;
3244 let mask = mask!(overflow);
3245 let layout = Layout::array::<u8>(nbytes).unwrap();
3246 let pointer = alloc::alloc(layout);
3247
3248 for i in 0..(nbytes - 1) {
3249 let mut b = 0;
3250 let j = i << 3;
3251
3252 if bits[j + 0] { b |= 1; }
3253 if bits[j + 1] { b |= 2; }
3254 if bits[j + 2] { b |= 4; }
3255 if bits[j + 3] { b |= 8; }
3256 if bits[j + 4] { b |= 16; }
3257 if bits[j + 5] { b |= 32; }
3258 if bits[j + 6] { b |= 64; }
3259 if bits[j + 7] { b |= 128; }
3260
3261 ptr::write(pointer.add(i), b);
3262 }
3263
3264 let mut b = 0;
3265
3266 for i in 0..(8 - padding) {
3267 if bits[nbits - overflow + i] { b |= 1 << i; }
3268 }
3269
3270 ptr::write(pointer.add(nbytes - 1), b);
3271
3272 let bytes = RawBytes { bytes: NonNull::new(pointer).unwrap(), cap: nbytes, nbytes };
3273
3274 Bits { words: bytes, mask, nbits, padding }
3275 }
3276 }
3277 }
3278}
3279
3280impl<const N: usize> From<[bool; N]> for Bits {
3281 /// Creates a bit string from booleans.
3282 ///
3283 /// # Examples
3284 /// ```
3285 /// # use bit_byte_bit::{Bits};
3286 /// let x1 = Bits::from([true, false, true, true, false, true, true]);
3287 ///
3288 /// assert_eq!(x1.len(), 7);
3289 /// assert_eq!(x1, Bits::from([0x6D]));
3290 ///
3291 /// let x2 = Bits::from([true, false, true, false, false, false, false, false, false]);
3292 ///
3293 /// assert_eq!(x2.len(), 9);
3294 /// assert_eq!(x2, Bits::slice(&[0x05, 0x00], 9));
3295 /// ```
3296 fn from(bits: [bool; N]) -> Self { Bits::from(bits.as_slice()) }
3297}
3298
3299impl From<Vec<bool>> for Bits {
3300 /// Creates a bit string from booleans.
3301 ///
3302 /// # Examples
3303 /// ```
3304 /// # use bit_byte_bit::{Bits};
3305 /// let bits1 = vec![true, false, true, true, false, true, true];
3306 /// let x1 = Bits::from(bits1);
3307 ///
3308 /// assert_eq!(x1.len(), 7);
3309 /// assert_eq!(x1, Bits::from([0x6D]));
3310 ///
3311 /// let bits2 = vec![true, false, true, false, false, false, false, false, false];
3312 /// let x2 = Bits::from(bits2);
3313 ///
3314 /// assert_eq!(x2.len(), 9);
3315 /// assert_eq!(x2, Bits::slice(&[0x05, 0x00], 9));
3316 /// ```
3317 fn from(bits: Vec<bool>) -> Self { Bits::from(bits.as_slice()) }
3318}
3319
3320impl FromIterator<u8> for Bits {
3321 fn from_iter<I: IntoIterator<Item=u8>>(iter: I) -> Self {
3322 Bits::from(iter.into_iter().collect::<Vec<u8>>())
3323 }
3324}
3325
3326impl FromIterator<bool> for Bits {
3327 fn from_iter<I: IntoIterator<Item=bool>>(iter: I) -> Self {
3328 Bits::from(iter.into_iter().collect::<Vec<bool>>())
3329 }
3330}
3331
3332/* Section::Order */
3333
3334impl Eq for Bits {}
3335
3336impl Ord for Bits {
3337 /// Compares a bit string with another
3338 ///
3339 /// # Examples
3340 /// ```
3341 /// # use std::cmp::Ordering;
3342 /// # use bit_byte_bit::Bits;
3343 ///
3344 /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
3345 /// let y = Bits::from([0x09, 0x0B, 0x0C]);
3346 /// let z = Bits::from([0x0A, 0x09, 0x0D]);
3347 ///
3348 /// assert_eq!(x.cmp(&y), Ordering::Greater);
3349 /// assert_eq!(x.cmp(&z), Ordering::Less);
3350 /// ```
3351 fn cmp(&self, other: &Self) -> Ordering {
3352 match other.leading_zeros().cmp(&self.leading_zeros()) {
3353 Ordering::Equal => unsafe {
3354 let aptr= self.words.as_ptr_const();
3355 let bptr = other.words.as_ptr_const();
3356
3357 for i in (0..self.size()).rev() {
3358 match (*aptr.add(i)).cmp(&*bptr.add(i)) {
3359 Ordering::Equal => (),
3360 ord => return ord,
3361 }
3362 }
3363
3364 Ordering::Equal
3365 },
3366 ord => ord,
3367 }
3368 }
3369}
3370
3371impl PartialEq for Bits {
3372 /// Whether two bit strings are equal.
3373 ///
3374 /// # Examples
3375 /// ```
3376 /// # use bit_byte_bit::{Bits};
3377 /// let x = Bits::from([0x20, 0x30, 0x40]);
3378 ///
3379 /// assert!(Bits::eq(&x, &x));
3380 ///
3381 /// let y = Bits::from([0xA0, 0xB0, 0xC0]);
3382 ///
3383 /// assert!(Bits::ne(&x, &y));
3384 ///
3385 /// let z1 = Bits::from([0x20, 0x30, 0x40, 0x00]);
3386 ///
3387 /// assert!(Bits::eq(&x, &z1));
3388 ///
3389 /// let z2 = Bits::new([0x20, 0x30, 0x40, 0x00]);
3390 ///
3391 /// assert!(Bits::ne(&x, &z2));
3392 /// ```
3393 fn eq(&self, other: &Self) -> bool {
3394 match (self.nbits, other.nbits) {
3395 (0, 0) => true,
3396 (a, b) if a != b => false,
3397 _ => unsafe {
3398 let aptr = self.words.as_ptr_const();
3399 let bptr = other.words.as_ptr_const();
3400
3401 for i in 0..(self.size() - 1) {
3402 if *aptr.add(i) != *bptr.add(i) { return false; }
3403 }
3404
3405 let last_a = *aptr.add(self.size() - 1) & self.mask;
3406 let last_b = *bptr.add(other.size() - 1) & other.mask;
3407
3408 last_a == last_b
3409 }
3410 }
3411 }
3412}
3413
3414impl PartialOrd for Bits {
3415 /// Compares a bit string with another
3416 ///
3417 /// # Examples
3418 /// ```
3419 /// # use std::cmp::Ordering;
3420 /// # use bit_byte_bit::Bits;
3421 ///
3422 /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
3423 /// let y = Bits::from([0x09, 0x0B, 0x0C]);
3424 /// let z = Bits::from([0x0A, 0x09, 0x0D]);
3425 ///
3426 /// assert_eq!(x.partial_cmp(&y), Some(Ordering::Greater));
3427 /// assert_eq!(x.partial_cmp(&z), Some(Ordering::Less));
3428 /// ```
3429 fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(self.cmp(other)) }
3430}
3431
3432/* Section::Iteration */
3433
3434impl IntoIterator for Bits {
3435 type Item = u8;
3436 type IntoIter = IntoBits;
3437
3438 fn into_iter(self) -> Self::IntoIter { IntoBits::new(self, 0) }
3439}
3440
3441
3442struct Bytes {
3443 start: *const u8,
3444 end: *const u8
3445}
3446
3447impl Bytes {
3448 unsafe fn new(slice: &[u8]) -> Self {
3449 Bytes {
3450 start: slice.as_ptr(),
3451 end: if slice.len() == 0 {
3452 slice.as_ptr()
3453 } else {
3454 unsafe{ slice.as_ptr().add(slice.len()) }
3455 }
3456 }
3457 }
3458}
3459
3460impl DoubleEndedIterator for Bytes {
3461 fn next_back(&mut self) -> Option<Self::Item> {
3462 if self.start == self.end {
3463 None
3464 } else {
3465 unsafe {
3466 self.end = self.end.offset(-1);
3467 Some(ptr::read(self.end))
3468 }
3469 }
3470 }
3471}
3472
3473impl ExactSizeIterator for Bytes {
3474 fn len(&self) -> usize { self.end as usize - self.start as usize }
3475}
3476
3477impl FusedIterator for Bytes { }
3478
3479impl Iterator for Bytes {
3480 type Item = u8;
3481
3482 fn next(&mut self) -> Option<u8> {
3483 match self.start == self.end {
3484 true => None,
3485 false => unsafe {
3486 let old_ptr = self.start;
3487 self.start = self.start.add(1);
3488
3489 Some(ptr::read(old_ptr))
3490 }
3491 }
3492 }
3493
3494 fn size_hint(&self) -> (usize, Option<usize>) {
3495 let len = self.end as usize - self.start as usize;
3496
3497 (len, Some(len))
3498 }
3499}
3500
3501
3502pub struct Iter<'a> {
3503 bits: &'a Bits,
3504 index: usize,
3505 exhausted: bool
3506}
3507
3508impl<'a> Iter<'a> {
3509 fn new(bits: &'a Bits, index: usize) -> Self {
3510 Iter { bits, index, exhausted: bits.nbits == index }
3511 }
3512
3513 /// Moves the iterator ahead until the predicate returns true.
3514 ///
3515 /// This method behaves like [Iterator::skip_while], but doesn't
3516 /// rely on repeated calls to [Iterator::next].
3517 pub fn skip_bits_while<P: FnMut(u8) -> bool>(&mut self, mut f: P) -> usize {
3518 if self.exhausted { return 0; }
3519
3520 match (f(0), f(1)) {
3521 (true, true) => {
3522 let rem = self.bits.len() - self.index;
3523
3524 self.index = self.bits.len();
3525 self.exhausted = true;
3526
3527 rem
3528 },
3529 (false, false) => 0,
3530 (z, _) => {
3531 let ct =
3532 if z { self.bits.trailing_zeros() } else { self.bits.trailing_ones() };
3533
3534 if ct > self.index {
3535 let skipped = ct - self.index;
3536
3537 self.index = ct;
3538 self.exhausted = self.index == self.bits.len();
3539
3540 skipped
3541 } else {
3542 0
3543 }
3544 }
3545 }
3546 }
3547
3548 /// Moves the iterator ahead.
3549 ///
3550 /// This method behaves like [Iterator::skip], but doesn't rely on
3551 /// repeated calls to [Iterator::next].
3552 pub fn skip_bits(&mut self, n: usize) {
3553 if self.exhausted {
3554 return;
3555 } else if (self.index + n) >= self.bits.len() {
3556 self.index = self.bits.len();
3557 self.exhausted = true;
3558 } else {
3559 self.index += n;
3560 }
3561 }
3562}
3563
3564impl<'a> DoubleEndedIterator for Iter<'a> {
3565 fn next_back(&mut self) -> Option<Self::Item> {
3566 if self.index == 0 {
3567 None
3568 } else {
3569 self.index -= 1;
3570 self.exhausted = false;
3571
3572 Some(self.bits.i(self.index))
3573 }
3574 }
3575
3576 fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
3577 if self.index < n {
3578 None
3579 } else {
3580 self.index -= n;
3581 self.exhausted = false;
3582
3583 Some(self.bits.i(self.index))
3584 }
3585 }
3586}
3587
3588impl<'a> ExactSizeIterator for Iter<'a> {
3589 fn len(&self) -> usize { self.bits.len() - self.index }
3590}
3591
3592impl<'a> FusedIterator for Iter<'a> { }
3593
3594impl<'a> Iterator for Iter<'a> {
3595 type Item = u8;
3596
3597 fn next(&mut self) -> Option<Self::Item> {
3598 match self.exhausted {
3599 true => None,
3600 false => {
3601 let bit = self.bits.i(self.index);
3602 self.index += 1;
3603 self.exhausted = self.bits.len() == self.index;
3604
3605 Some(bit)
3606 }
3607 }
3608 }
3609
3610 fn size_hint(&self) -> (usize, Option<usize>) {
3611 let rem = self.bits.len() - self.index;
3612
3613 (rem, Some(rem))
3614 }
3615
3616 fn count(mut self) -> usize {
3617 let rem = self.bits.len() - self.index;
3618
3619 self.index = self.bits.len();
3620 self.exhausted = true;
3621
3622 rem
3623 }
3624
3625 fn last(mut self) -> Option<u8> {
3626 if self.exhausted {
3627 None
3628 } else {
3629 let bit = self.bits.i(self.bits.len() - 1);
3630
3631 self.index = self.bits.len();
3632 self.exhausted = true;
3633
3634 Some(bit)
3635 }
3636 }
3637
3638 fn nth(&mut self, n: usize) -> Option<u8> {
3639 if self.exhausted {
3640 None
3641 } else if self.index + n >= self.bits.len() {
3642 self.index = self.bits.len();
3643 self.exhausted = true;
3644
3645 None
3646 } else {
3647 let bit = self.bits.i(self.index + n);
3648 self.index += n + 1;
3649 self.exhausted = self.index == self.bits.len();
3650
3651 Some(bit)
3652 }
3653 }
3654}
3655
3656
3657pub struct IntoBits {
3658 bits: Bits,
3659 index: usize,
3660 exhausted: bool
3661}
3662
3663impl IntoBits {
3664 fn new(bits: Bits, index: usize) -> Self {
3665 let exhausted = bits.nbits == index;
3666
3667 IntoBits { bits, index, exhausted }
3668 }
3669
3670 /// Moves the iterator ahead until the predicate returns true.
3671 ///
3672 /// This method behaves like [Iterator::skip_while], but doesn't
3673 /// rely on repeated calls to [Iterator::next], instead on the
3674 /// return values to `f(0)` and `f(1)`.
3675 pub fn skip_bits_while<P: FnMut(u8) -> bool>(&mut self, mut f: P) -> usize {
3676 if self.exhausted { return 0; }
3677
3678 match (f(0), f(1)) {
3679 (true, true) => {
3680 let rem = self.bits.len() - self.index;
3681
3682 self.index = self.bits.len();
3683 self.exhausted = true;
3684
3685 rem
3686 },
3687 (false, false) => 0,
3688 (z, _) => {
3689 let ct =
3690 if z { self.bits.trailing_zeros() } else { self.bits.trailing_ones() };
3691
3692 if ct > self.index {
3693 let skipped = ct - self.index;
3694
3695 self.index = ct;
3696 self.exhausted = self.index == self.bits.len();
3697
3698 skipped
3699 } else {
3700 0
3701 }
3702 }
3703 }
3704 }
3705
3706 /// Moves the iterator ahead.
3707 ///
3708 /// This method behaves like [Iterator::skip], but doesn't rely on
3709 /// repeated calls to [Iterator::next].
3710 pub fn skip_bits(&mut self, n: usize) {
3711 if self.exhausted {
3712 return;
3713 } else if (self.index + n) >= self.bits.len() {
3714 self.index = self.bits.len();
3715 self.exhausted = true;
3716 } else {
3717 self.index += n;
3718 }
3719 }
3720}
3721
3722impl DoubleEndedIterator for IntoBits {
3723 fn next_back(&mut self) -> Option<Self::Item> {
3724 if self.index == 0 {
3725 None
3726 } else {
3727 self.index -= 1;
3728 self.exhausted = false;
3729
3730 Some(self.bits.i(self.index))
3731 }
3732 }
3733
3734 fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
3735 if self.index < n {
3736 None
3737 } else {
3738 self.index -= n;
3739 self.exhausted = false;
3740
3741 Some(self.bits.i(self.index))
3742 }
3743 }
3744}
3745
3746impl ExactSizeIterator for IntoBits {
3747 fn len(&self) -> usize { self.bits.len() - self.index }
3748}
3749
3750impl FusedIterator for IntoBits { }
3751
3752impl Iterator for IntoBits {
3753 type Item = u8;
3754
3755 fn next(&mut self) -> Option<Self::Item> {
3756 match self.exhausted {
3757 true => None,
3758 false => {
3759 let bit = self.bits.i(self.index);
3760 self.index += 1;
3761 self.exhausted = self.bits.len() == self.index;
3762
3763 Some(bit)
3764 }
3765 }
3766 }
3767
3768 fn size_hint(&self) -> (usize, Option<usize>) {
3769 let rem = self.bits.len() - self.index;
3770
3771 (rem, Some(rem))
3772 }
3773
3774 fn count(mut self) -> usize {
3775 let rem = self.bits.len() - self.index;
3776
3777 self.index = self.bits.len();
3778 self.exhausted = true;
3779
3780 rem
3781 }
3782
3783 fn last(mut self) -> Option<u8> {
3784 if self.exhausted {
3785 None
3786 } else {
3787 let bit = self.bits.i(self.bits.len() - 1);
3788
3789 self.index = self.bits.len();
3790 self.exhausted = true;
3791
3792 Some(bit)
3793 }
3794 }
3795
3796 fn nth(&mut self, n: usize) -> Option<u8> {
3797 if self.exhausted {
3798 None
3799 } else if self.index + n >= self.bits.len() {
3800 self.index = self.bits.len();
3801 self.exhausted = true;
3802
3803 None
3804 } else {
3805 let bit = self.bits.i(self.index + n);
3806 self.index += n + 1;
3807 self.exhausted = self.index == self.bits.len();
3808
3809 Some(bit)
3810 }
3811 }
3812}
3813
3814
3815pub struct IntoBytes {
3816 _bytes: RawBytes,
3817 iter: Bytes
3818}
3819
3820impl DoubleEndedIterator for IntoBytes {
3821 fn next_back(&mut self) -> Option<Self::Item> { self.iter.next_back() }
3822}
3823
3824impl Drop for IntoBytes {
3825 fn drop(&mut self) { for _ in &mut *self { } }
3826}
3827
3828impl ExactSizeIterator for IntoBytes {
3829 fn len(&self) -> usize { self.iter.len() }
3830}
3831
3832impl FusedIterator for IntoBytes { }
3833
3834impl Iterator for IntoBytes {
3835 type Item = u8;
3836
3837 fn next(&mut self) -> Option<u8> { self.iter.next() }
3838
3839 fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
3840}
3841
3842
3843/* Section::Operators */
3844
3845impl BitAnd for Bits {
3846 type Output = Self;
3847
3848 /// Bitwise and of two bit strings.
3849 ///
3850 /// # Examples
3851 /// ```
3852 /// # use bit_byte_bit::{Bits};
3853 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
3854 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3855 ///
3856 /// assert_eq!(x1 & y1, Bits::new([0x20, 0x30, 0x40]));
3857 ///
3858 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
3859 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3860 ///
3861 /// assert_eq!(x2.len(), 23);
3862 /// assert_eq!(y2.len(), 24);
3863 ///
3864 /// let z = x2 & y2;
3865 ///
3866 /// assert_eq!(z.len(), 24);
3867 /// ```
3868 fn bitand(self, rhs: Self) -> Self::Output { self.and(&rhs) }
3869}
3870
3871impl BitAnd<&Bits> for Bits {
3872 type Output = Bits;
3873
3874 /// Bitwise and of two bit strings.
3875 ///
3876 /// # Examples
3877 /// ```
3878 /// # use bit_byte_bit::{Bits};
3879 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
3880 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3881 ///
3882 /// assert_eq!(x1 & &y1, Bits::new([0x20, 0x30, 0x40]));
3883 ///
3884 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
3885 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3886 ///
3887 /// assert_eq!(x2.len(), 23);
3888 /// assert_eq!(y2.len(), 24);
3889 ///
3890 /// let z = x2 & &y2;
3891 ///
3892 /// assert_eq!(z.len(), 24);
3893 /// ```
3894 fn bitand(self, rhs: &Bits) -> Self::Output { self.and(rhs) }
3895}
3896
3897impl BitAnd<&Bits> for &Bits {
3898 type Output = Bits;
3899
3900 /// Bitwise and of two bit strings.
3901 ///
3902 /// # Examples
3903 /// ```
3904 /// # use bit_byte_bit::{Bits};
3905 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
3906 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3907 ///
3908 /// assert_eq!(x1 & &y1, Bits::new([0x20, 0x30, 0x40]));
3909 ///
3910 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
3911 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3912 ///
3913 /// assert_eq!(x2.len(), 23);
3914 /// assert_eq!(y2.len(), 24);
3915 ///
3916 /// let z = x2 & &y2;
3917 ///
3918 /// assert_eq!(z.len(), 24);
3919 /// ```
3920 fn bitand(self, rhs: &Bits) -> Self::Output { self.and(rhs) }
3921}
3922
3923impl BitAndAssign for Bits {
3924 /// Bitwise and of two bit strings.
3925 ///
3926 /// # Examples
3927 /// ```
3928 /// # use bit_byte_bit::{Bits};
3929 /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
3930 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3931 ///
3932 /// x1 &= y1;
3933 ///
3934 /// assert_eq!(x1, Bits::new([0x20, 0x30, 0x40]));
3935 ///
3936 /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
3937 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3938 ///
3939 /// assert_eq!(x2.len(), 23);
3940 /// assert_eq!(y2.len(), 24);
3941 ///
3942 /// x2 &= y2;
3943 ///
3944 /// assert_eq!(x2.len(), 24);
3945 /// ```
3946 fn bitand_assign(&mut self, rhs: Self) { self.and_mut(&rhs); }
3947}
3948
3949impl BitAndAssign<&Bits> for Bits {
3950 /// Bitwise and of two bit strings.
3951 ///
3952 /// # Examples
3953 /// ```
3954 /// # use bit_byte_bit::{Bits};
3955 /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
3956 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3957 ///
3958 /// x1 &= &y1;
3959 ///
3960 /// assert_eq!(x1, Bits::new([0x20, 0x30, 0x40]));
3961 ///
3962 /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
3963 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3964 ///
3965 /// assert_eq!(x2.len(), 23);
3966 /// assert_eq!(y2.len(), 24);
3967 ///
3968 /// x2 &= &y2;
3969 ///
3970 /// assert_eq!(x2.len(), 24);
3971 /// ```
3972 fn bitand_assign(&mut self, rhs: &Bits) { self.and_mut(rhs); }
3973}
3974
3975impl BitOr for Bits {
3976 type Output = Self;
3977
3978 /// Bitwise or of two bit strings.
3979 ///
3980 /// # Examples
3981 /// ```
3982 /// # use bit_byte_bit::{Bits};
3983 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
3984 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
3985 ///
3986 /// assert_eq!(x1 | y1, Bits::from([0xA0, 0xB0, 0xC0]));
3987 ///
3988 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
3989 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
3990 ///
3991 /// assert_eq!(x2.len(), 23);
3992 /// assert_eq!(y2.len(), 24);
3993 ///
3994 /// let z = x2 | y2;
3995 ///
3996 /// assert_eq!(z.len(), 24);
3997 /// ```
3998 fn bitor(self, rhs: Self) -> Self::Output { self.or(&rhs) }
3999}
4000
4001impl BitOr<&Bits> for Bits {
4002 type Output = Bits;
4003
4004 /// Bitwise or of two bit strings.
4005 ///
4006 /// # Examples
4007 /// ```
4008 /// # use bit_byte_bit::{Bits};
4009 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
4010 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4011 ///
4012 /// assert_eq!(x1 | &y1, Bits::from([0xA0, 0xB0, 0xC0]));
4013 ///
4014 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
4015 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4016 ///
4017 /// assert_eq!(x2.len(), 23);
4018 /// assert_eq!(y2.len(), 24);
4019 ///
4020 /// let z = x2 | &y2;
4021 ///
4022 /// assert_eq!(z.len(), 24);
4023 /// ```
4024 fn bitor(self, rhs: &Bits) -> Self::Output { self.or(rhs) }
4025}
4026
4027impl BitOr<&Bits> for &Bits {
4028 type Output = Bits;
4029
4030 /// Bitwise or of two bit strings.
4031 ///
4032 /// # Examples
4033 /// ```
4034 /// # use bit_byte_bit::{Bits};
4035 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
4036 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4037 ///
4038 /// assert_eq!(x1 | &y1, Bits::from([0xA0, 0xB0, 0xC0]));
4039 ///
4040 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
4041 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4042 ///
4043 /// assert_eq!(x2.len(), 23);
4044 /// assert_eq!(y2.len(), 24);
4045 ///
4046 /// let z = x2 | &y2;
4047 ///
4048 /// assert_eq!(z.len(), 24);
4049 /// ```
4050 fn bitor(self, rhs: &Bits) -> Self::Output { self.or(rhs) }
4051}
4052
4053impl BitOrAssign for Bits {
4054 /// Bitwise or of two bit strings.
4055 ///
4056 /// # Examples
4057 /// ```
4058 /// # use bit_byte_bit::{Bits};
4059 /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
4060 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4061 ///
4062 /// x1 |= y1;
4063 ///
4064 /// assert_eq!(x1, Bits::from([0xA0, 0xB0, 0xC0]));
4065 ///
4066 /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
4067 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4068 ///
4069 /// assert_eq!(x2.len(), 23);
4070 /// assert_eq!(y2.len(), 24);
4071 ///
4072 /// x2 |= y2;
4073 ///
4074 /// assert_eq!(x2.len(), 24);
4075 /// ```
4076 fn bitor_assign(&mut self, rhs: Self) { self.or_mut(&rhs); }
4077}
4078
4079impl BitOrAssign<&Bits> for Bits {
4080 /// Bitwise or of two bit strings.
4081 ///
4082 /// # Examples
4083 /// ```
4084 /// # use bit_byte_bit::{Bits};
4085 /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
4086 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4087 ///
4088 /// x1 |= &y1;
4089 ///
4090 /// assert_eq!(x1, Bits::from([0xA0, 0xB0, 0xC0]));
4091 ///
4092 /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
4093 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4094 ///
4095 /// assert_eq!(x2.len(), 23);
4096 /// assert_eq!(y2.len(), 24);
4097 ///
4098 /// x2 |= &y2;
4099 ///
4100 /// assert_eq!(x2.len(), 24);
4101 /// ```
4102 fn bitor_assign(&mut self, rhs: &Bits) { self.or_mut(rhs); }
4103}
4104
4105impl BitXor for Bits {
4106 type Output = Self;
4107
4108 /// Bitwise exclusive or of two bit strings.
4109 ///
4110 /// # Examples
4111 /// ```
4112 /// # use bit_byte_bit::{Bits};
4113 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
4114 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4115 ///
4116 /// assert_eq!(x1 ^ y1, Bits::from([0x80, 0x80, 0x80]));
4117 ///
4118 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
4119 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4120 ///
4121 /// assert_eq!(x2.len(), 23);
4122 /// assert_eq!(y2.len(), 24);
4123 ///
4124 /// let z = x2 ^ y2;
4125 ///
4126 /// assert_eq!(z.len(), 24);
4127 /// ```
4128 fn bitxor(self, rhs: Self) -> Self::Output { self.xor(&rhs) }
4129}
4130
4131impl BitXor<&Bits> for Bits {
4132 type Output = Bits;
4133
4134 /// Bitwise exclusive or of two bit strings.
4135 ///
4136 /// # Examples
4137 /// ```
4138 /// # use bit_byte_bit::{Bits};
4139 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
4140 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4141 ///
4142 /// assert_eq!(x1 ^ &y1, Bits::from([0x80, 0x80, 0x80]));
4143 ///
4144 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
4145 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4146 ///
4147 /// assert_eq!(x2.len(), 23);
4148 /// assert_eq!(y2.len(), 24);
4149 ///
4150 /// let z = x2 ^ &y2;
4151 ///
4152 /// assert_eq!(z.len(), 24);
4153 /// ```
4154 fn bitxor(self, rhs: &Bits) -> Self::Output { self.xor(&rhs) }
4155}
4156
4157impl BitXor<&Bits> for &Bits {
4158 type Output = Bits;
4159
4160 /// Bitwise exclusive or of two bit strings.
4161 ///
4162 /// # Examples
4163 /// ```
4164 /// # use bit_byte_bit::{Bits};
4165 /// let x1 = Bits::from([0x20, 0x30, 0x40]);
4166 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4167 ///
4168 /// assert_eq!(x1 ^ &y1, Bits::from([0x80, 0x80, 0x80]));
4169 ///
4170 /// let x2 = Bits::from([0x20, 0x30, 0x40]);
4171 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4172 ///
4173 /// assert_eq!(x2.len(), 23);
4174 /// assert_eq!(y2.len(), 24);
4175 ///
4176 /// let z = x2 ^ &y2;
4177 ///
4178 /// assert_eq!(z.len(), 24);
4179 /// ```
4180 fn bitxor(self, rhs: &Bits) -> Self::Output { self.xor(&rhs) }
4181}
4182
4183impl BitXorAssign for Bits {
4184 /// Bitwise exclusive or of two bit strings.
4185 ///
4186 /// # Examples
4187 /// ```
4188 /// # use bit_byte_bit::{Bits};
4189 /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
4190 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4191 ///
4192 /// x1 ^= y1;
4193 ///
4194 /// assert_eq!(x1, Bits::from([0x80, 0x80, 0x80]));
4195 ///
4196 /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
4197 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4198 ///
4199 /// assert_eq!(x2.len(), 23);
4200 /// assert_eq!(y2.len(), 24);
4201 ///
4202 /// x2 ^= y2;
4203 ///
4204 /// assert_eq!(x2.len(), 24);
4205 /// ```
4206 fn bitxor_assign(&mut self, rhs: Self) { self.xor_mut(&rhs); }
4207}
4208
4209impl BitXorAssign<&Bits> for Bits {
4210 /// Bitwise exclusive or of two bit strings.
4211 ///
4212 /// # Examples
4213 /// ```
4214 /// # use bit_byte_bit::{Bits};
4215 /// let mut x1 = Bits::from([0x20, 0x30, 0x40]);
4216 /// let y1 = Bits::from([0xA0, 0xB0, 0xC0]);
4217 ///
4218 /// x1 ^= &y1;
4219 ///
4220 /// assert_eq!(x1, Bits::from([0x80, 0x80, 0x80]));
4221 ///
4222 /// let mut x2 = Bits::from([0x20, 0x30, 0x40]);
4223 /// let y2 = Bits::from([0x0A, 0xB0, 0xC0]);
4224 ///
4225 /// assert_eq!(x2.len(), 23);
4226 /// assert_eq!(y2.len(), 24);
4227 ///
4228 /// x2 ^= &y2;
4229 ///
4230 /// assert_eq!(x2.len(), 24);
4231 /// ```
4232 fn bitxor_assign(&mut self, rhs: &Bits) { self.xor_mut(&rhs); }
4233}
4234
4235impl Div<usize> for Bits {
4236 type Output = (Bits, Bits);
4237
4238 fn div(self, index: usize) -> Self::Output { self.split(index) }
4239}
4240
4241impl Not for Bits {
4242 type Output = Self;
4243
4244 /// Flips every bit.
4245 ///
4246 /// # Examples
4247 /// ```
4248 /// # use bit_byte_bit::{Bits};
4249 /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
4250 ///
4251 /// assert_eq!(!x, Bits::slice(&[0xF5, 0xF4, 0x03], 20));
4252 /// ```
4253 fn not(self) -> Self::Output { self.complement() }
4254}
4255
4256impl Not for &Bits {
4257 type Output = Bits;
4258
4259 /// Flips every bit.
4260 ///
4261 /// # Examples
4262 /// ```
4263 /// # use bit_byte_bit::{Bits};
4264 /// let x = Bits::from([0x0A, 0x0B, 0x0C]);
4265 ///
4266 /// assert_eq!(!&x, Bits::slice(&[0xF5, 0xF4, 0x03], 20));
4267 /// ```
4268 fn not(self) -> Self::Output { self.complement() }
4269}
4270
4271impl Shl<usize> for Bits {
4272 type Output = Self;
4273
4274 /// Shifts out upper bits, shifting in zeros on the lower end.
4275 ///
4276 /// # Examples
4277 /// ```
4278 /// # use bit_byte_bit::{Bits};
4279 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4280 /// let s1 = x1 << 17;
4281 ///
4282 /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4283 /// assert_eq!(s1.len(), 20);
4284 ///
4285 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4286 /// let s2 = x2 << 4;
4287 ///
4288 /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
4289 /// assert_eq!(s2.len(), 24);
4290 /// ```
4291 fn shl(self, count: usize) -> Self::Output { self.shifted_left(count) }
4292}
4293
4294impl Shl<usize> for &Bits {
4295 type Output = Bits;
4296
4297 /// Shifts out upper bits, shifting in zeros on the lower end.
4298 ///
4299 /// # Examples
4300 /// ```
4301 /// # use bit_byte_bit::{Bits};
4302 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4303 /// let s1 = &x1 << 17;
4304 ///
4305 /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4306 /// assert_eq!(s1.len(), x1.len());
4307 ///
4308 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4309 /// let s2 = &x2 << 4;
4310 ///
4311 /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
4312 /// assert_eq!(s2.len(), x2.len());
4313 /// ```
4314 fn shl(self, count: usize) -> Self::Output { self.shifted_left(count) }
4315}
4316
4317impl Shl<&usize> for Bits {
4318 type Output = Self;
4319
4320 /// Shifts out upper bits, shifting in zeros on the lower end.
4321 ///
4322 /// # Examples
4323 /// ```
4324 /// # use bit_byte_bit::{Bits};
4325 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4326 /// let s1 = x1 << &17;
4327 ///
4328 /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4329 /// assert_eq!(s1.len(), 20);
4330 ///
4331 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4332 /// let s2 = x2 << &4;
4333 ///
4334 /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
4335 /// assert_eq!(s2.len(), 24);
4336 /// ```
4337 fn shl(self, count: &usize) -> Self::Output { self.shifted_left(*count) }
4338}
4339
4340impl Shl<&usize> for &Bits {
4341 type Output = Bits;
4342
4343 /// Shifts out upper bits, shifting in zeros on the lower end.
4344 ///
4345 /// # Examples
4346 /// ```
4347 /// # use bit_byte_bit::{Bits};
4348 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4349 /// let s1 = &x1 << &17;
4350 ///
4351 /// assert_eq!(s1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4352 /// assert_eq!(s1.len(), x1.len());
4353 ///
4354 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4355 /// let s2 = &x2 << &4;
4356 ///
4357 /// assert_eq!(s2, Bits::new([0xA0, 0xB0, 0xC0]));
4358 /// assert_eq!(s2.len(), x2.len());
4359 /// ```
4360 fn shl(self, count: &usize) -> Self::Output { self.shifted_left(*count) }
4361}
4362
4363impl ShlAssign<usize> for Bits {
4364 /// Shifts out upper bits, shifting in zeros on the lower end.
4365 ///
4366 /// # Examples
4367 /// ```
4368 /// # use bit_byte_bit::{Bits};
4369 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4370 ///
4371 /// x1 <<= 17;
4372 ///
4373 /// assert_eq!(x1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4374 /// assert_eq!(x1.len(), 20);
4375 ///
4376 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4377 ///
4378 /// x2 <<= 4;
4379 ///
4380 /// assert_eq!(x2, Bits::new([0xA0, 0xB0, 0xC0]));
4381 /// assert_eq!(x2.len(), 24);
4382 /// ```
4383 fn shl_assign(&mut self, count: usize) { self.shift_left(count); }
4384}
4385
4386impl ShlAssign<&usize> for Bits {
4387 /// Shifts out upper bits, shifting in zeros on the lower end.
4388 ///
4389 /// # Examples
4390 /// ```
4391 /// # use bit_byte_bit::{Bits};
4392 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4393 ///
4394 /// x1 <<= &17;
4395 ///
4396 /// assert_eq!(x1, Bits::slice(&[0x00, 0x00, 0x04], 20));
4397 /// assert_eq!(x1.len(), 20);
4398 ///
4399 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4400 ///
4401 /// x2 <<= &4;
4402 ///
4403 /// assert_eq!(x2, Bits::new([0xA0, 0xB0, 0xC0]));
4404 /// assert_eq!(x2.len(), 24);
4405 /// ```
4406 fn shl_assign(&mut self, count: &usize) { self.shift_left(*count); }
4407}
4408
4409impl Shr<usize> for Bits {
4410 type Output = Self;
4411
4412 /// Shifts out lower bits, shifting zeros into the upper bits.
4413 ///
4414 /// # Examples
4415 /// ```
4416 /// # use bit_byte_bit::{Bits};
4417 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4418 /// let s1 = x1 >> 17;
4419 ///
4420 /// assert_eq!(s1.len(), 20);
4421 /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4422 ///
4423 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4424 /// let s2 = x2 >> 4;
4425 ///
4426 /// assert_eq!(s2.len(), 24);
4427 /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
4428 /// ```
4429 fn shr(self, count: usize) -> Self::Output { self.shifted_right(count) }
4430}
4431
4432impl Shr<usize> for &Bits {
4433 type Output = Bits;
4434
4435 /// Shifts out lower bits, shifting zeros into the upper bits.
4436 ///
4437 /// # Examples
4438 /// ```
4439 /// # use bit_byte_bit::{Bits};
4440 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4441 /// let s1 = &x1 >> 17;
4442 ///
4443 /// assert_eq!(s1.len(), x1.len());
4444 /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4445 ///
4446 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4447 /// let s2 = &x2 >> 4;
4448 ///
4449 /// assert_eq!(s2.len(), x2.len());
4450 /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
4451 /// ```
4452 fn shr(self, count: usize) -> Self::Output { self.shifted_right(count) }
4453}
4454
4455impl Shr<&usize> for Bits {
4456 type Output = Self;
4457
4458 /// Shifts out lower bits, shifting zeros into the upper bits.
4459 ///
4460 /// # Examples
4461 /// ```
4462 /// # use bit_byte_bit::{Bits};
4463 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4464 /// let s1 = x1 >> &17;
4465 ///
4466 /// assert_eq!(s1.len(), 20);
4467 /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4468 ///
4469 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4470 /// let s2 = x2 >> &4;
4471 ///
4472 /// assert_eq!(s2.len(), 24);
4473 /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
4474 /// ```
4475 fn shr(self, count: &usize) -> Self::Output { self.shifted_right(*count) }
4476}
4477
4478impl Shr<&usize> for &Bits {
4479 type Output = Bits;
4480
4481 /// Shifts out lower bits, shifting zeros into the upper bits.
4482 ///
4483 /// # Examples
4484 /// ```
4485 /// # use bit_byte_bit::{Bits};
4486 /// let x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4487 /// let s1 = &x1 >> &17;
4488 ///
4489 /// assert_eq!(s1.len(), x1.len());
4490 /// assert_eq!(s1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4491 ///
4492 /// let x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4493 /// let s2 = &x2 >> &4;
4494 ///
4495 /// assert_eq!(s2.len(), 24);
4496 /// assert_eq!(s2, Bits::new([0xB0, 0xC0, 0x00]));
4497 /// ```
4498 fn shr(self, count: &usize) -> Self::Output { self.shifted_right(*count) }
4499}
4500
4501impl ShrAssign<usize> for Bits {
4502 /// Shifts out lower bits, shifting zeros into the upper bits.
4503 ///
4504 /// # Examples
4505 /// ```
4506 /// # use bit_byte_bit::{Bits};
4507 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4508 ///
4509 /// x1 >>= 17;
4510 ///
4511 /// assert_eq!(x1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4512 /// assert_eq!(x1.len(), 20);
4513 ///
4514 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4515 ///
4516 /// x2 >>= 4;
4517 ///
4518 /// assert_eq!(x2, Bits::new([0xB0, 0xC0, 0x00]));
4519 /// assert_eq!(x2.len(), 24);
4520 /// ```
4521 fn shr_assign(&mut self, count: usize) { self.shift_right(count); }
4522}
4523
4524impl ShrAssign<&usize> for Bits {
4525 /// Shifts out lower bits, shifting zeros into the upper bits.
4526 ///
4527 /// # Examples
4528 /// ```
4529 /// # use bit_byte_bit::{Bits};
4530 /// let mut x1 = Bits::from([0x0A, 0x0B, 0x0C]);
4531 ///
4532 /// x1 >>= &17;
4533 ///
4534 /// assert_eq!(x1.len(), 20);
4535 /// assert_eq!(x1, Bits::slice(&[0x06, 0x00, 0x00], 20));
4536 ///
4537 /// let mut x2 = Bits::new([0x0A, 0x0B, 0x0C]);
4538 ///
4539 /// x2 >>= &4;
4540 ///
4541 /// assert_eq!(x2.len(), 24);
4542 /// assert_eq!(x2, Bits::new([0xB0, 0xC0, 0x00]));
4543 /// ```
4544 fn shr_assign(&mut self, count: &usize) { self.shift_right(*count); }
4545}
4546
4547
4548/* Section::Macro */
4549
4550
4551/// Macro implementing a subset of the [Bits] constructors
4552///
4553/// Example
4554/// ```
4555/// # use bit_byte_bit::{Bits, bits};
4556/// let x1 = bits![];
4557///
4558/// assert_eq!(x1, Bits::empty());
4559///
4560/// let x2 = bits![0x0A, 0x0B, 0x0C];
4561///
4562/// assert_eq!(x2, Bits::new([0x0A, 0x0B, 0x0C]));
4563///
4564/// let x3 = bits![0x0A, 0x0B, 0x0C; => 16];
4565///
4566/// assert_eq!(x3, Bits::aligned(16, [0x0A, 0x0B, 0x0C]));
4567///
4568/// let x4 = bits![0x0A, 0x0B, 0x0C; %];
4569///
4570/// assert_eq!(x4, Bits::packed([0x0A, 0x0B, 0x0C]));
4571///
4572/// let x5 = bits![1; 17];
4573///
4574/// assert_eq!(x5, Bits::ones(17));
4575///
4576/// let x6 = bits![0; 17];
4577///
4578/// assert_eq!(x6, Bits::zeros(17));
4579/// assert_eq!(x6.len(), 17);
4580///
4581/// let x7 = bits![8; 0; 17];
4582///
4583/// assert_eq!(x7, Bits::new(vec![0; 17]));
4584/// assert_eq!(x7.len(), 136);
4585/// ```
4586#[macro_export]
4587macro_rules! bits {
4588 () => { Bits::empty() };
4589 (0; $n:expr) => { Bits::zeros($n) };
4590 (1; $n:expr) => { Bits::ones($n) };
4591 (8; $byte:expr; $n:expr) => { Bits::new(vec![$byte; $n]) };
4592 ($($byte:expr),+ $(,)?) => {{ Bits::new(vec![$($byte),+]) }};
4593 ($($byte:expr),+; => $n:expr) => { Bits::aligned($n, vec![$($byte),+]) };
4594 ($($byte:expr),+; %) => { Bits::packed(vec![$($byte),+]) };
4595}
4596
4597/// Packs up to 64 bits as a given integral type.
4598///
4599/// `$bytes` is a byte array large enough to pack `min($length_in_bits, 64)` bits. When
4600/// `$bytes` is an array of values that can be cast as `$int`, the result is
4601/// input-dependent.`$int` is an integral type large enough to hold a value with
4602/// `min($length_in_bits, 64)` bits.
4603///
4604/// In some cases, it could be more efficient to use one of the unrolled forms,
4605/// over the general one. This is because the general case first tries
4606/// to figure out which version of the unrolled code to use.
4607///
4608/// # Example
4609/// ```
4610/// # use bit_byte_bit::{pack_to_int};
4611/// let bytes = [0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF];
4612/// let bytes_u64 = [0x01u64, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF];
4613/// let pack_usize = pack_to_int!(usize; bytes; 17);
4614///
4615/// assert_eq!(pack_usize, 0x12301);
4616///
4617/// let pack_u64_general = pack_to_int!(u64; bytes; 48);
4618///
4619/// let pack_u64_general_u64 = pack_to_int!(bytes_u64; 48);
4620///
4621/// let pack_u64_unrolled = pack_to_int!(u64;
4622/// bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5]
4623/// );
4624///
4625/// let pack_u64_unrolled_u64 = pack_to_int!(
4626/// bytes_u64[0], bytes_u64[1], bytes_u64[2], bytes_u64[3], bytes_u64[4], bytes_u64[5]
4627/// );
4628///
4629/// let pack_u64_unrolled_bytes = pack_to_int!(u64;
4630/// 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB
4631/// );
4632///
4633/// let pack_u64_unrolled_u64_bytes = pack_to_int!(
4634/// 0x01u64, 0x23, 0x45, 0x67, 0x89, 0xAB
4635/// );
4636///
4637/// assert_eq!(pack_u64_general, 0xAB8967452301);
4638/// assert_eq!(pack_u64_general, pack_u64_general_u64);
4639/// assert_eq!(pack_u64_general, pack_u64_unrolled);
4640/// assert_eq!(pack_u64_general, pack_u64_unrolled_u64);
4641/// assert_eq!(pack_u64_general, pack_u64_unrolled_bytes);
4642/// assert_eq!(pack_u64_general, pack_u64_unrolled_u64_bytes);
4643/// ```
4644///
4645/// ```should_panic
4646/// # use bit_byte_bit::{pack_to_int};
4647/// let bytes = vec![0x01, 0x23];
4648///
4649/// // panics since `bytes.len() == 2` and 8 bytes are expected
4650/// let pack_u16 = pack_to_int!(u64; bytes; 64);
4651/// ```
4652
4653/// ```should_panic
4654/// # use bit_byte_bit::{pack_to_int};
4655/// let bytes = [0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF];
4656///
4657/// // panics because of eventual left shift with overflow due to treating a
4658/// // u16 value as if it had 64 bits.
4659/// let pack_u16 = pack_to_int!(u16; bytes; 64);
4660/// ```
4661#[macro_export]
4662macro_rules! pack_to_int {
4663 ($int:ty; $bytes:expr; $length_in_bits:expr) =>{{
4664 if $length_in_bits == 0 {
4665 0
4666 } else {
4667 let (sat_length, mask) = if $length_in_bits >= 64 {
4668 (64, 0xFFFFFFFFFFFFFFFFu64 as $int)
4669 } else {
4670 ($length_in_bits, ((1u64 << $length_in_bits) - 1) as $int)
4671 };
4672
4673 let packed = match sat_length {
4674 n if n <= 8 => $bytes[0] as $int,
4675 n if n <= 16 => pack_to_int!($int; $bytes[0], $bytes[1]),
4676 n if n <= 24 => pack_to_int!($int; $bytes[0], $bytes[1], $bytes[2]),
4677 n if n <= 32 => pack_to_int!($int; $bytes[0], $bytes[1], $bytes[2], $bytes[3]),
4678 n if n <= 40 => pack_to_int!($int;
4679 $bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4]
4680 ),
4681 n if n <= 48 => pack_to_int!($int;
4682 $bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4], $bytes[5]
4683 ),
4684 n if n <= 56 => pack_to_int!($int;
4685 $bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4], $bytes[5], $bytes[6]
4686 ),
4687 _ => pack_to_int!($int;
4688 $bytes[0], $bytes[1], $bytes[2], $bytes[3],
4689 $bytes[4], $bytes[5], $bytes[6], $bytes[7]
4690 )
4691 };
4692
4693 packed & mask
4694 }
4695 }};
4696 ($ty:ty; $b0:expr, $b1:expr) =>{ ($b0 as $ty) | (($b1 as $ty) << 8) };
4697 ($ty:ty; $b0:expr, $b1:expr, $b2:expr) => {
4698 pack_to_int!($ty; $b0, $b1) | (($b2 as $ty) << 16)
4699 };
4700 ($ty:ty; $b0:expr, $b1:expr, $b2:expr, $b3:expr) => {
4701 pack_to_int!($ty; $b0, $b1, $b2) | (($b3 as $ty) << 24)
4702 };
4703 ($ty:ty; $b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr) => {
4704 pack_to_int!($ty; $b0, $b1, $b2, $b3) | (($b4 as $ty) << 32)
4705 };
4706 ($ty:ty; $b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr) => {
4707 pack_to_int!($ty; $b0, $b1, $b2, $b3, $b4) | (($b5 as $ty) << 40)
4708 };
4709 ($ty:ty; $b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr, $b6:expr) => {
4710 pack_to_int!($ty; $b0, $b1, $b2, $b3, $b4, $b5) | (($b6 as $ty) << 48)
4711 };
4712 ($ty:ty; $b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr, $b6:expr, $b7:expr) => {
4713 pack_to_int!($ty; $b0, $b1, $b2, $b3, $b4, $b5, $b6) | (($b7 as $ty) << 56)
4714 };
4715 ($bytes:expr; $length_in_bits:expr) =>{{
4716 if $length_in_bits == 0 {
4717 0
4718 } else {
4719 let (sat_length, mask) = if $length_in_bits >= 64 {
4720 (64, 0xFFFFFFFFFFFFFFFFu64)
4721 } else {
4722 ($length_in_bits, ((1 << $length_in_bits) - 1))
4723 };
4724
4725 let packed = match sat_length {
4726 n if n <= 8 => $bytes[0],
4727 n if n <= 16 => pack_to_int!($bytes[0], $bytes[1]),
4728 n if n <= 24 => pack_to_int!($bytes[0], $bytes[1], $bytes[2]),
4729 n if n <= 32 => pack_to_int!($bytes[0], $bytes[1], $bytes[2], $bytes[3]),
4730 n if n <= 40 => pack_to_int!($bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4]),
4731 n if n <= 48 => pack_to_int!(
4732 $bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4], $bytes[5]
4733 ),
4734 n if n <= 56 => pack_to_int!(
4735 $bytes[0], $bytes[1], $bytes[2], $bytes[3], $bytes[4], $bytes[5], $bytes[6]
4736 ),
4737 _ => pack_to_int!(
4738 $bytes[0], $bytes[1], $bytes[2], $bytes[3],
4739 $bytes[4], $bytes[5], $bytes[6], $bytes[7]
4740 )
4741 };
4742
4743 packed & mask
4744 }
4745 }};
4746 ($b0:expr, $b1:expr) =>{ $b0 | ( $b1 << 8) };
4747 ($b0:expr, $b1:expr, $b2:expr) => { pack_to_int!($b0, $b1) | ($b2 << 16) };
4748 ($b0:expr, $b1:expr, $b2:expr, $b3:expr) => { pack_to_int!($b0, $b1, $b2) | ($b3 << 24) };
4749 ($b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr) => {
4750 pack_to_int!($b0, $b1, $b2, $b3) | ($b4 << 32)
4751 };
4752 ($b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr) => {
4753 pack_to_int!($b0, $b1, $b2, $b3, $b4) | ($b5 << 40)
4754 };
4755 ($b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr, $b6:expr) => {
4756 pack_to_int!($b0, $b1, $b2, $b3, $b4, $b5) | ($b6 << 48)
4757 };
4758 ($b0:expr, $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr, $b6:expr, $b7:expr) => {
4759 pack_to_int!($b0, $b1, $b2, $b3, $b4, $b5, $b6) | ($b7 << 56)
4760 }
4761}