udbg/
range.rs

1//!
2//! Utilities for type which has range, such as module, memory page, etc.
3//!
4
5use core::cmp::Ordering;
6use core::ops::Range;
7
8pub trait RangeValue<T: Copy + PartialOrd<T> = usize>: Sized {
9    fn as_range(&self) -> Range<T>;
10
11    fn cmp(&self, val: T) -> Ordering {
12        let r = self.as_range();
13        if val >= r.start && val < r.end {
14            Ordering::Equal
15        } else if val < r.start {
16            Ordering::Greater
17        } else {
18            Ordering::Less
19        }
20    }
21
22    #[inline]
23    fn contains(&self, v: T) -> bool {
24        self.as_range().contains(&v)
25    }
26
27    fn binary_search<'a, S: AsRef<[Self]> + 'a>(s: &'a S, val: T) -> Option<&'a Self> {
28        let slice = s.as_ref();
29        slice
30            .binary_search_by(|x| x.cmp(val))
31            .ok()
32            .and_then(|i| slice.get(i))
33    }
34
35    fn binary_search_mut<'a, S: AsMut<[Self]> + 'a>(s: &'a mut S, val: T) -> Option<&'a mut Self> {
36        let slice = s.as_mut();
37        let i = slice.binary_search_by(|x| x.cmp(val)).ok()?;
38        slice.get_mut(i)
39    }
40}