| use core::ops::{Range, RangeFrom, RangeFull, RangeTo}; |
| |
| // Taken from https://github.com/bluss/odds/blob/master/src/range.rs. |
| |
| /// **IndexRange** is implemented by Rust's built-in range types, produced |
| /// by range syntax like `..`, `a..`, `..b` or `c..d`. |
| pub trait IndexRange<T = usize> { |
| #[inline] |
| /// Start index (inclusive) |
| fn start(&self) -> Option<T> { |
| None |
| } |
| #[inline] |
| /// End index (exclusive) |
| fn end(&self) -> Option<T> { |
| None |
| } |
| } |
| |
| impl<T> IndexRange<T> for RangeFull {} |
| |
| impl<T: Copy> IndexRange<T> for RangeFrom<T> { |
| #[inline] |
| fn start(&self) -> Option<T> { |
| Some(self.start) |
| } |
| } |
| |
| impl<T: Copy> IndexRange<T> for RangeTo<T> { |
| #[inline] |
| fn end(&self) -> Option<T> { |
| Some(self.end) |
| } |
| } |
| |
| impl<T: Copy> IndexRange<T> for Range<T> { |
| #[inline] |
| fn start(&self) -> Option<T> { |
| Some(self.start) |
| } |
| #[inline] |
| fn end(&self) -> Option<T> { |
| Some(self.end) |
| } |
| } |