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}