use crate::bit::bitwise_via_std as via;
use crate::{BitLength, Bitwise, BitwiseMut, BitwisePair, BitwisePairMut, IntoBitIterator};
macro_rules! implement_unsigned_int_traits {
($word_type:ty) => {
impl BitLength for $word_type {
fn bit_len(&self) -> usize {
Self::BLOCK_BIT_LEN
}
const BLOCK_BIT_LEN: usize = <$word_type>::BITS as usize;
}
delegate_bitwise!($word_type, via::BitwiseViaStd);
delegate_bitwise_mut!($word_type, via::BitwiseMutViaStd);
delegate_bitwise_pair!($word_type, $word_type, via::BitwisePairViaStd);
delegate_bitwise_pair_mut!($word_type, $word_type, via::BitwisePairMutViaStd);
impl IntoBitIterator for $word_type {
type BitIterator = via::BitIteratorForUnsignedInt<$word_type>;
fn iter_bits(self) -> Self::BitIterator {
via::BitIteratorForUnsignedInt::<$word_type>::from_bits(&self)
}
}
impl IntoBitIterator for &$word_type {
type BitIterator = via::BitIteratorForUnsignedInt<$word_type>;
fn iter_bits(self) -> Self::BitIterator {
via::BitIteratorForUnsignedInt::<$word_type>::from_bits(self)
}
}
impl<'life> IntoBitIterator for &'life [$word_type] {
type BitIterator = via::BitIteratorForUnsignedIntSlice<'life, $word_type>;
fn iter_bits(self) -> Self::BitIterator {
via::BitIteratorForUnsignedIntSlice::<'_, $word_type>::from_bits(self)
}
}
};
}
pub type BitIterator<'life> = via::BitIteratorForUnsignedIntSlice<'life, u64>;
implement_unsigned_int_traits!(u16);
implement_unsigned_int_traits!(u32);
implement_unsigned_int_traits!(u64);
implement_unsigned_int_traits!(u128);