1 use core::ops::{Range, RangeFrom, RangeFull, RangeTo};
2 
3 // Taken from https://github.com/bluss/odds/blob/master/src/range.rs.
4 
5 /// **IndexRange** is implemented by Rust's built-in range types, produced
6 /// by range syntax like `..`, `a..`, `..b` or `c..d`.
7 pub trait IndexRange<T = usize> {
8     #[inline]
9     /// Start index (inclusive)
start(&self) -> Option<T>10     fn start(&self) -> Option<T> {
11         None
12     }
13     #[inline]
14     /// End index (exclusive)
end(&self) -> Option<T>15     fn end(&self) -> Option<T> {
16         None
17     }
18 }
19 
20 impl<T> IndexRange<T> for RangeFull {}
21 
22 impl<T: Copy> IndexRange<T> for RangeFrom<T> {
23     #[inline]
start(&self) -> Option<T>24     fn start(&self) -> Option<T> {
25         Some(self.start)
26     }
27 }
28 
29 impl<T: Copy> IndexRange<T> for RangeTo<T> {
30     #[inline]
end(&self) -> Option<T>31     fn end(&self) -> Option<T> {
32         Some(self.end)
33     }
34 }
35 
36 impl<T: Copy> IndexRange<T> for Range<T> {
37     #[inline]
start(&self) -> Option<T>38     fn start(&self) -> Option<T> {
39         Some(self.start)
40     }
41     #[inline]
end(&self) -> Option<T>42     fn end(&self) -> Option<T> {
43         Some(self.end)
44     }
45 }
46