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