diff --git a/src/lib.rs b/src/lib.rs index ec19563..5517302 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,3 +37,39 @@ pub fn tokenize<'a>( > { lexer::Tokenizer::new_with_errors(bytes) } + +trait BitSize { + fn bits(&self) -> u32; +} + +macro_rules! impl_bitsize_int { + ($($ty:ty)*) => { + + $( +impl BitSize for $ty { + fn bits(&self) -> u32 { + Self::BITS as u32 - self.trailing_zeros() as u32 + } +})* + }; +} + +impl_bitsize_int!(u8 u16 u32 u64 u128); + +impl BitSize for &[u8] { + fn bits(&self) -> u32 { + let bytes = self.as_ref(); + let mut bits = bytes.len() * u8::BITS as usize; + + for &d in bytes.iter().rev() { + if d == 0 { + bits -= u8::BITS as usize; + } else { + bits -= d.leading_zeros() as usize; + break; + } + } + + bits as u32 + } +}