From d9e6d99286b9c35916acd875a92bc3763491ff3c Mon Sep 17 00:00:00 2001 From: Janis Date: Mon, 23 Dec 2024 00:55:19 +0100 Subject: [PATCH] bit-length helper for integers and byte slices --- src/lib.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) 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 + } +}