sv_parser_pp/
range.rs

1use std::cmp::Ordering;
2
3#[derive(Copy, Clone, Debug, Eq)]
4pub struct Range {
5    pub begin: usize,
6    pub end: usize,
7}
8
9impl Range {
10    pub fn new(begin: usize, end: usize) -> Self {
11        assert!(begin <= end);
12        Range { begin, end }
13    }
14
15    pub fn offset(&mut self, offset: usize) {
16        self.begin += offset;
17        self.end += offset;
18    }
19}
20
21impl PartialEq for Range {
22    fn eq(&self, other: &Self) -> bool {
23        if self.begin <= other.begin {
24            other.begin < self.end
25        } else {
26            self.begin < other.end
27        }
28    }
29}
30
31impl Ord for Range {
32    fn cmp(&self, other: &Self) -> Ordering {
33        if self.eq(other) {
34            Ordering::Equal
35        } else {
36            self.begin.cmp(&other.begin)
37        }
38    }
39}
40
41impl PartialOrd for Range {
42    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
43        Some(self.cmp(other))
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50    use std::collections::BTreeMap;
51
52    #[test]
53    fn test_btreemap() {
54        let mut map = BTreeMap::new();
55        map.insert(Range::new(0, 10), String::from("0-10"));
56        map.insert(Range::new(10, 15), String::from("10-15"));
57        assert_eq!(map.get(&Range::new(0, 1)), Some(&String::from("0-10")));
58        assert_eq!(map.get(&Range::new(3, 4)), Some(&String::from("0-10")));
59        assert_eq!(map.get(&Range::new(10, 11)), Some(&String::from("10-15")));
60        assert_eq!(map.get(&Range::new(15, 16)), None);
61    }
62}