nbits/
lib.rs

1//! Bit operations on `[u8]`
2//!
3//! # Usage
4//!   `[u16]` chunks to mnemonic indices by 11 bits.  
5//!   `[u8]` chunks to base64 indices by 6 bits.  
6//!
7//! # Examples
8//! ```
9//! use nbits::{XBits, FromBits};
10//!
11//! assert_eq!(vec![0b1111_1111, 0b1100_0000].bits().all_one(), false);
12//! assert_eq!(vec![0b1111_1111, 0b1100_0000].bits().trailing_zeros(), 6);
13//!
14//! assert_eq!(
15//!     [0b1111_0000_u8].bits().iter().collect::<Vec<bool>>(),
16//!     vec![true, true, true, true, false, false, false, false]
17//! );
18//!
19//! assert_eq!(
20//!     vec![0b1111_1111, 0b1111_1111].bits().chunks(6).collect::<Vec<u8>>(),
21//!     vec![0b11_1111, 0b11_1111, 0b11_1100]
22//! );
23//!
24//! assert_eq!(
25//!     vec![0b1111_1111; 3].bits().chunks(11).collect::<Vec<u16>>(),
26//!     vec![0b111_1111_1111, 0b111_1111_1111, 0b110_0000_0000]
27//! );
28//!
29//! assert_eq!(
30//!    vec![0b1111_1111, 0b1100_0000].bits_mut().reverse().to_ref().as_bytes(),
31//!    vec![0b0000_0011, 0b1111_1111]
32//! );
33//!
34//! assert_eq!(
35//!     Vec::from_bits([true, true, true, true, false, false, false, false].iter().copied()),
36//!     [0b1111_0000]
37//! );
38//!
39//! assert_eq!(
40//!     Vec::from_bits_chunk([0b11_1111_u8, 0b11_1111, 0b11_1111].into_iter(), 6),
41//!     vec![0b1111_1111, 0b1111_1111, 0b1100_0000]
42//! );
43//!
44//! assert_eq!(
45//!     Vec::from_bits_chunk([0b1111_u16, 0b1111, 0b1111].into_iter(), 6),
46//!     vec![0b001111_00, 0b1111_0011, 0b1100_0000]
47//! );
48//! ```
49
50mod core;
51mod nbits;
52mod xbits;
53
54pub use core::{BitArith, BitIterator, Bitwise, FromBits};
55pub use nbits::NBits;
56pub use xbits::{BitsMut, BitsRef, XBits};
57
58/// Assert overflow of parameter
59/// # Parameters
60/// - $n: parameter
61/// - $min: minimum value
62/// - $max: maximum value
63/// - $name: function name
64macro_rules! assert_overflow {
65    ($n: ident, $min: expr, $max: expr, $name: literal) => {
66        let (name, param, n, min, max) = ($name, stringify!($n), $n, $min, $max);
67        assert!(
68            $min as usize <= $n as usize && $n as usize <= $max as usize,
69            "[nbits] {name} parameter `{param}` overflow: `{n}` not in `{min}..={max}`",
70        );
71    };
72}
73pub(crate) use assert_overflow;