mod join_ones;
use crate::endian::{BigEndian, DefaultEndian, Endian, LittleEndian};
pub use self::join_ones::JoinOnes;
mod sealed {
pub trait Sealed {}
impl<T> Sealed for &mut T where T: ?Sized + crate::Bits {}
impl<T> Sealed for &T where T: ?Sized + crate::Bits {}
impl<T> Sealed for [T] {}
impl<T, const N: usize> Sealed for [T; N] {}
impl<T, E> Sealed for crate::set::Set<T, E> where T: ?Sized {}
}
pub(crate) use self::sealed::Sealed;
pub trait Bits: Sealed {
type IterOnes<'a>: Iterator<Item = u32>
where
Self: 'a;
type IterOnesIn<'a, E>: Iterator<Item = u32>
where
Self: 'a,
E: Endian;
type IterZeros<'a>: Iterator<Item = u32>
where
Self: 'a;
type IterZerosIn<'a, E>: Iterator<Item = u32>
where
Self: 'a,
E: Endian;
fn count_ones(&self) -> u32;
fn count_zeros(&self) -> u32;
fn bits_capacity(&self) -> u32;
fn all_zeros(&self) -> bool;
fn all_ones(&self) -> bool;
fn test_bit(&self, index: u32) -> bool;
fn test_bit_in<E>(&self, index: u32) -> bool
where
E: Endian;
#[inline]
fn test_bit_le(&self, index: u32) -> bool {
self.test_bit_in::<LittleEndian>(index)
}
#[inline]
fn test_bit_be(&self, index: u32) -> bool {
self.test_bit_in::<BigEndian>(index)
}
fn iter_ones(&self) -> Self::IterOnes<'_>;
fn iter_ones_in<E>(&self) -> Self::IterOnesIn<'_, E>
where
E: Endian;
#[inline]
fn iter_ones_le(&self) -> Self::IterOnesIn<'_, LittleEndian> {
self.iter_ones_in()
}
#[inline]
fn iter_ones_be(&self) -> Self::IterOnesIn<'_, BigEndian> {
self.iter_ones_in()
}
fn iter_zeros(&self) -> Self::IterZeros<'_>;
fn iter_zeros_in<E>(&self) -> Self::IterZerosIn<'_, E>
where
E: Endian;
#[inline]
fn iter_zeros_le(&self) -> Self::IterZerosIn<'_, LittleEndian> {
self.iter_zeros_in()
}
#[inline]
fn iter_zeros_be(&self) -> Self::IterZerosIn<'_, BigEndian> {
self.iter_zeros_in()
}
fn join_ones_in<I, E>(&self, iter: I) -> JoinOnes<'_, Self, E, I::IntoIter>
where
I: IntoIterator,
E: Endian,
{
JoinOnes::new(self.iter_ones_in(), iter.into_iter())
}
#[inline]
fn join_ones<I>(&self, iter: I) -> JoinOnes<'_, Self, DefaultEndian, I::IntoIter>
where
I: IntoIterator,
{
JoinOnes::new(self.iter_ones_in(), iter.into_iter())
}
#[inline]
fn join_ones_le<I>(&self, iter: I) -> JoinOnes<'_, Self, LittleEndian, I::IntoIter>
where
I: IntoIterator,
{
self.join_ones_in(iter)
}
#[inline]
fn join_ones_be<I>(&self, iter: I) -> JoinOnes<'_, Self, BigEndian, I::IntoIter>
where
I: IntoIterator,
{
self.join_ones_in(iter)
}
}
impl<T> Bits for &T
where
T: ?Sized + Bits,
{
type IterOnes<'a> = T::IterOnes<'a>
where
Self: 'a;
type IterOnesIn<'a, E> = T::IterOnesIn<'a, E>
where
Self: 'a,
E: Endian;
type IterZeros<'a> = T::IterZeros<'a>
where
Self: 'a;
type IterZerosIn<'a, E> = T::IterZerosIn<'a, E>
where
Self: 'a,
E: Endian;
#[inline]
fn count_ones(&self) -> u32 {
(**self).count_ones()
}
#[inline]
fn count_zeros(&self) -> u32 {
(**self).count_zeros()
}
#[inline]
fn bits_capacity(&self) -> u32 {
(**self).bits_capacity()
}
#[inline]
fn all_zeros(&self) -> bool {
(**self).all_zeros()
}
#[inline]
fn all_ones(&self) -> bool {
(**self).all_ones()
}
#[inline]
fn test_bit(&self, index: u32) -> bool {
(**self).test_bit(index)
}
#[inline]
fn test_bit_in<E>(&self, index: u32) -> bool
where
E: Endian,
{
(**self).test_bit_in::<E>(index)
}
#[inline]
fn iter_ones(&self) -> Self::IterOnes<'_> {
(**self).iter_ones()
}
#[inline]
fn iter_ones_in<E>(&self) -> Self::IterOnesIn<'_, E>
where
E: Endian,
{
(**self).iter_ones_in()
}
#[inline]
fn iter_zeros(&self) -> Self::IterZeros<'_> {
(**self).iter_zeros()
}
#[inline]
fn iter_zeros_in<E>(&self) -> Self::IterZerosIn<'_, E>
where
E: Endian,
{
(**self).iter_zeros_in()
}
}
impl<T> Bits for &mut T
where
T: ?Sized + Bits,
{
type IterOnesIn<'a, E> = T::IterOnesIn<'a, E>
where
Self: 'a,
E: Endian;
type IterOnes<'a> = T::IterOnes<'a>
where
Self: 'a;
type IterZerosIn<'a, E> = T::IterZerosIn<'a, E>
where
Self: 'a,
E: Endian;
type IterZeros<'a> = T::IterZeros<'a>
where
Self: 'a;
#[inline]
fn count_ones(&self) -> u32 {
(**self).count_ones()
}
#[inline]
fn count_zeros(&self) -> u32 {
(**self).count_zeros()
}
#[inline]
fn bits_capacity(&self) -> u32 {
(**self).bits_capacity()
}
#[inline]
fn all_zeros(&self) -> bool {
(**self).all_zeros()
}
#[inline]
fn all_ones(&self) -> bool {
(**self).all_ones()
}
#[inline]
fn test_bit(&self, index: u32) -> bool {
(**self).test_bit(index)
}
#[inline]
fn test_bit_in<E>(&self, index: u32) -> bool
where
E: Endian,
{
(**self).test_bit_in::<E>(index)
}
#[inline]
fn iter_ones(&self) -> Self::IterOnes<'_> {
(**self).iter_ones()
}
#[inline]
fn iter_ones_in<E>(&self) -> Self::IterOnesIn<'_, E>
where
E: Endian,
{
(**self).iter_ones_in()
}
#[inline]
fn iter_zeros(&self) -> Self::IterZeros<'_> {
(**self).iter_zeros()
}
#[inline]
fn iter_zeros_in<E>(&self) -> Self::IterZerosIn<'_, E>
where
E: Endian,
{
(**self).iter_zeros_in()
}
}