litex/common/
count_range_integer.rs1use crate::common::helper::is_number_string_literally_integer_without_dot;
2use crate::prelude::*;
3
4pub 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
22pub 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}