2 releases
0.1.1 | Sep 19, 2020 |
---|---|
0.1.0 | Jul 9, 2020 |
#1121 in Data structures
1,838 downloads per month
Used in 10 crates
(2 directly)
32KB
796 lines
BitSet
Straightforward, no-std compatible, simd optimized, BitSet API.
Examples
This crate provides its functionality through the BitSet
trait.
use bitset_core::BitSet;
The containers for the bitset provided by this crate are unsigned integers, slices of unsigned integers and simd-like types, and Vec<_>
, Box<[_]>
if the std
feature is enabled (enabled by default).
use bitset_core::BitSet;
let mut bits = [0u32; 4];
assert_eq!(bits.bit_len(), 4 * 32);
bits.bit_init(true); // Set all bits to true
assert!(bits.bit_all()); // All bits are set
bits.bit_reset(13); // Reset the 13th bit
assert!(bits.bit_any()); // At least some bits are set
bits.bit_flip(42); // Flip the 42nd bit twice (no change)
bits.bit_flip(42);
bits.bit_cond(1, false); // Set the bit to runtime value
assert_eq!(bits.bit_test(42), true);
assert_eq!(bits.bit_test(13), false);
assert_eq!(bits.bit_test(1), false);
assert_eq!(bits.bit_count(), 4 * 32 - 2);
Simd optimization is provided by using underlying primitives such as [u32; 4]
which match the hardware's 128-bit simd registers. The compiler is heavily encouraged to vectorize these primitives.
use bitset_core::BitSet;
let mut a = [[0x21212121u32; 4]; 16];
let b = [[0x55555555u32; 4]; 16];
a.bit_or(&b);
a.bit_and(&b);
a.bit_xor(&b);
a.bit_not();
assert_eq!(a, [[0xffffffffu32; 4]; 16]);
For non fixed-size containers using the std
feature BitSet
is also implemented for Vec<T>
and Box<[T]>
(where [T]
: BitSet
).
Future work includes making everything const fn to enable all of this at compiletime, blocked on support for traits in const fn.
License
Licensed under MIT License, see license.txt.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, shall be licensed as above, without any additional terms or conditions.