#![no_std]
#[cfg(any(test, feature = "std"))]
#[macro_use]
extern crate std;
pub trait BitSet {
fn bit_len(&self) -> usize;
fn bit_init(&mut self, value: bool) -> &mut Self;
#[inline]
fn bit_fmt(&self) -> &BitFmt<Self> {
unsafe { &*(self as *const _ as *const _) }
}
fn bit_test(&self, bit: usize) -> bool;
fn bit_set(&mut self, bit: usize) -> &mut Self;
fn bit_reset(&mut self, bit: usize) -> &mut Self;
fn bit_flip(&mut self, bit: usize) -> &mut Self;
fn bit_cond(&mut self, bit: usize, value: bool) -> &mut Self;
fn bit_all(&self) -> bool;
fn bit_any(&self) -> bool;
#[inline]
fn bit_none(&self) -> bool {
!self.bit_any()
}
fn bit_eq(&self, rhs: &Self) -> bool;
fn bit_disjoint(&self, rhs: &Self) -> bool;
fn bit_subset(&self, rhs: &Self) -> bool;
#[inline]
fn bit_superset(&self, rhs: &Self) -> bool {
rhs.bit_subset(self)
}
fn bit_or(&mut self, rhs: &Self) -> &mut Self;
fn bit_and(&mut self, rhs: &Self) -> &mut Self;
fn bit_andnot(&mut self, rhs: &Self) -> &mut Self;
fn bit_xor(&mut self, rhs: &Self) -> &mut Self;
fn bit_not(&mut self) -> &mut Self;
fn bit_mask(&mut self, rhs: &Self, mask: &Self) -> &mut Self;
fn bit_count(&self) -> usize;
}
#[macro_export]
macro_rules! bitset {
($init:expr; $($bit:expr),* $(,)?) => {{
use $crate::BitSet;
#[allow(unused_mut)]
match $init {
mut this => {
$(this.bit_set($bit as usize);)*
this
},
}
}};
}
#[macro_export]
macro_rules! bitor {
($init:expr; $($bits:expr),* $(,)?) => {{
use $crate::BitSet;
#[allow(unused_mut)]
match $init {
mut this => {
$(this.bit_or(&$bits);)*
this
},
}
}};
}
#[macro_export]
macro_rules! impl_bitset {
() => {
#[inline]
fn bit_len(&self) -> usize {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_len(<Self as ops::Deref>::deref(self))
}
#[inline]
fn bit_init(&mut self, value: bool) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_init(<Self as ops::DerefMut>::deref_mut(self), value);
self
}
#[inline]
fn bit_test(&self, bit: usize) -> bool {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_test(<Self as ops::Deref>::deref(self), bit)
}
#[inline]
fn bit_set(&mut self, bit: usize) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_set(<Self as ops::DerefMut>::deref_mut(self), bit);
self
}
#[inline]
fn bit_reset(&mut self, bit: usize) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_reset(<Self as ops::DerefMut>::deref_mut(self), bit);
self
}
#[inline]
fn bit_flip(&mut self, bit: usize) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_flip(<Self as ops::DerefMut>::deref_mut(self), bit);
self
}
#[inline]
fn bit_cond(&mut self, bit: usize, value: bool) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_cond(<Self as ops::DerefMut>::deref_mut(self), bit, value);
self
}
#[inline]
fn bit_all(&self) -> bool {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_all(<Self as ops::Deref>::deref(self))
}
#[inline]
fn bit_any(&self) -> bool {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_any(<Self as ops::Deref>::deref(self))
}
#[inline]
fn bit_none(&self) -> bool {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_none(<Self as ops::Deref>::deref(self))
}
#[inline]
fn bit_eq(&self, rhs: &Self) -> bool {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_eq(<Self as ops::Deref>::deref(self), <Self as ops::Deref>::deref(rhs))
}
#[inline]
fn bit_disjoint(&self, rhs: &Self) -> bool {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_disjoint(<Self as ops::Deref>::deref(self), <Self as ops::Deref>::deref(rhs))
}
#[inline]
fn bit_subset(&self, rhs: &Self) -> bool {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_subset(<Self as ops::Deref>::deref(self), <Self as ops::Deref>::deref(rhs))
}
#[inline]
fn bit_superset(&self, rhs: &Self) -> bool {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_superset(<Self as ops::Deref>::deref(self), <Self as ops::Deref>::deref(rhs))
}
#[inline]
fn bit_or(&mut self, rhs: &Self) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_or(<Self as ops::DerefMut>::deref_mut(self), <Self as ops::Deref>::deref(rhs));
self
}
#[inline]
fn bit_and(&mut self, rhs: &Self) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_and(<Self as ops::DerefMut>::deref_mut(self), <Self as ops::Deref>::deref(rhs));
self
}
#[inline]
fn bit_andnot(&mut self, rhs: &Self) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_andnot(<Self as ops::DerefMut>::deref_mut(self), <Self as ops::Deref>::deref(rhs));
self
}
#[inline]
fn bit_xor(&mut self, rhs: &Self) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_xor(<Self as ops::DerefMut>::deref_mut(self), <Self as ops::Deref>::deref(rhs));
self
}
#[inline]
fn bit_not(&mut self) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_not(<Self as ops::DerefMut>::deref_mut(self));
self
}
#[inline]
fn bit_mask(&mut self, rhs: &Self, mask: &Self) -> &mut Self {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_mask(<Self as ops::DerefMut>::deref_mut(self), <Self as ops::Deref>::deref(rhs), <Self as ops::Deref>::deref(mask));
self
}
#[inline]
fn bit_count(&self) -> usize {
use ::core::ops;
<<Self as ops::Deref>::Target as $crate::BitSet>::bit_count(<Self as ops::Deref>::deref(self))
}
};
}
mod uint;
mod slice;
mod simd;
#[cfg(feature = "std")]
mod stdty;
mod fmt;
pub use self::fmt::BitFmt;
#[cfg(test)]
fn unary_tests<T: ?Sized + BitSet>(bits: &mut T) {
bits.bit_init(false);
assert_eq!(bits.bit_any(), false);
assert_eq!(bits.bit_all(), false);
for i in 0..bits.bit_len() {
bits.bit_set(i & !1);
}
assert_eq!(bits.bit_any(), true);
assert_eq!(bits.bit_all(), false);
for i in 0..bits.bit_len() {
assert_eq!(bits.bit_test(i), i & 1 == 0);
}
bits.bit_not();
for i in 0..bits.bit_len() {
bits.bit_flip(i);
assert_eq!(bits.bit_test(i), i & 1 == 0);
}
bits.bit_init(true);
assert_eq!(bits.bit_any(), true);
assert_eq!(bits.bit_all(), true);
for i in 0..bits.bit_len() {
bits.bit_reset(i & !1);
}
assert_eq!(bits.bit_any(), true);
assert_eq!(bits.bit_all(), false);
for i in 0..bits.bit_len() {
assert_eq!(bits.bit_test(i), i & 1 != 0);
}
bits.bit_not();
for i in 0..bits.bit_len() {
bits.bit_flip(i);
assert_eq!(bits.bit_test(i), i & 1 != 0);
}
assert!(!bits.bit_disjoint(bits));
assert!(bits.bit_subset(bits));
assert!(bits.bit_superset(bits));
}