63 lines
1.5 KiB
Rust
63 lines
1.5 KiB
Rust
use std::cmp::Ordering;
|
|
|
|
#[derive(Copy, Clone, Debug, Eq)]
|
|
pub struct Range {
|
|
pub begin: usize,
|
|
pub end: usize,
|
|
}
|
|
|
|
impl Range {
|
|
pub fn new(begin: usize, end: usize) -> Self {
|
|
assert!(begin <= end);
|
|
Range { begin, end }
|
|
}
|
|
|
|
pub fn offset(&mut self, offset: usize) {
|
|
self.begin += offset;
|
|
self.end += offset;
|
|
}
|
|
}
|
|
|
|
impl PartialEq for Range {
|
|
fn eq(&self, other: &Self) -> bool {
|
|
if self.begin <= other.begin {
|
|
other.begin < self.end
|
|
} else {
|
|
self.begin < other.end
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Ord for Range {
|
|
fn cmp(&self, other: &Self) -> Ordering {
|
|
if self.eq(other) {
|
|
Ordering::Equal
|
|
} else {
|
|
self.begin.cmp(&other.begin)
|
|
}
|
|
}
|
|
}
|
|
|
|
impl PartialOrd for Range {
|
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
|
Some(self.cmp(other))
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use std::collections::BTreeMap;
|
|
|
|
#[test]
|
|
fn test_btreemap() {
|
|
let mut map = BTreeMap::new();
|
|
map.insert(Range::new(0, 10), String::from("0-10"));
|
|
map.insert(Range::new(10, 15), String::from("10-15"));
|
|
assert_eq!(map.get(&Range::new(0, 1)), Some(&String::from("0-10")));
|
|
assert_eq!(map.get(&Range::new(3, 4)), Some(&String::from("0-10")));
|
|
assert_eq!(map.get(&Range::new(10, 11)), Some(&String::from("10-15")));
|
|
assert_eq!(map.get(&Range::new(15, 16)), None);
|
|
}
|
|
}
|