1use 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}