use cairo_lang_sierra::extensions::utils::Range;
use num_bigint::{BigInt, BigUint, Sign};
use num_traits::One;
pub trait RangeExt {
fn zero_based_bit_width(&self) -> u32;
fn offset_bit_width(&self) -> u32;
}
impl RangeExt for Range {
fn zero_based_bit_width(&self) -> u32 {
let width = if self.lower.sign() == Sign::Minus {
let lower_width = (self.lower.magnitude() - BigUint::one()).bits() + 1;
let upper_width = {
let upper = &self.upper - &BigInt::one();
match upper.sign() {
Sign::Minus => (upper.magnitude() - BigUint::one()).bits() + 1,
Sign::NoSign => 0,
Sign::Plus => (upper.magnitude() + BigUint::one()).bits(),
}
};
lower_width.max(upper_width) as u32
} else {
(&self.upper - &BigInt::one()).bits() as u32
};
width.max(1)
}
fn offset_bit_width(&self) -> u32 {
((self.size() - BigInt::one()).bits() as u32).max(1)
}
}