Skip to main content

litex/common/
count_range_integer.rs

1use crate::common::helper::is_number_string_literally_integer_without_dot;
2use crate::obj::Number;
3
4/// Integer `closed_range(a, b)` has `max(0, b - a + 1)` points; non-integer endpoints yield `None`.
5pub fn count_closed_range_integer_endpoints(a: &Number, b: &Number) -> Option<Number> {
6    let as_ = a.normalized_value.trim();
7    let bs = b.normalized_value.trim();
8    if !is_number_string_literally_integer_without_dot(as_.to_string())
9        || !is_number_string_literally_integer_without_dot(bs.to_string())
10    {
11        return None;
12    }
13    let ai: i128 = as_.parse().ok()?;
14    let bi: i128 = bs.parse().ok()?;
15    if ai > bi {
16        return Some(Number::new("0".to_string()));
17    }
18    let cnt = bi.checked_sub(ai)?.checked_add(1)?;
19    Some(Number::new(cnt.to_string()))
20}
21
22/// Integer `range(a, b)` is half-open `[a, b)`; size `max(0, b - a)` when `b > a`.
23pub fn count_half_open_range_integer_endpoints(a: &Number, b: &Number) -> Option<Number> {
24    let as_ = a.normalized_value.trim();
25    let bs = b.normalized_value.trim();
26    if !is_number_string_literally_integer_without_dot(as_.to_string())
27        || !is_number_string_literally_integer_without_dot(bs.to_string())
28    {
29        return None;
30    }
31    let ai: i128 = as_.parse().ok()?;
32    let bi: i128 = bs.parse().ok()?;
33    if bi <= ai {
34        return Some(Number::new("0".to_string()));
35    }
36    let cnt = bi.checked_sub(ai)?;
37    Some(Number::new(cnt.to_string()))
38}