diff options
| author | Steven Fackler <sfackler@gmail.com> | 2017-06-30 08:34:53 -1000 |
|---|---|---|
| committer | Steven Fackler <sfackler@gmail.com> | 2017-06-30 08:34:53 -1000 |
| commit | 0a9c13624d2fede5c6ce8e5aa7f486403098bde6 (patch) | |
| tree | 0eab912d432fe03866fdaf362710bd7bf0752703 /src/liballoc/range.rs | |
| parent | e72580cf091190c6258648e4cfbca083f20ece3d (diff) | |
| download | rust-0a9c13624d2fede5c6ce8e5aa7f486403098bde6.tar.gz rust-0a9c13624d2fede5c6ce8e5aa7f486403098bde6.zip | |
Revert "Stabilize RangeArgument"
This reverts commit 143206d54d7558c2326212df99efc98110904fdb.
Diffstat (limited to 'src/liballoc/range.rs')
| -rw-r--r-- | src/liballoc/range.rs | 138 |
1 files changed, 136 insertions, 2 deletions
diff --git a/src/liballoc/range.rs b/src/liballoc/range.rs index 0a058c47a50..f862da0d61e 100644 --- a/src/liballoc/range.rs +++ b/src/liballoc/range.rs @@ -11,8 +11,142 @@ #![unstable(feature = "collections_range", reason = "waiting for dust to settle on inclusive ranges", issue = "30877")] -#![rustc_deprecated(reason = "moved to core::ops", since = "1.19.0")] //! Range syntax. -pub use core::ops::RangeArgument; +use core::ops::{RangeFull, Range, RangeTo, RangeFrom, RangeInclusive, RangeToInclusive}; +use Bound::{self, Excluded, Included, Unbounded}; + +/// `RangeArgument` is implemented by Rust's built-in range types, produced +/// by range syntax like `..`, `a..`, `..b` or `c..d`. +pub trait RangeArgument<T: ?Sized> { + /// Start index bound. + /// + /// Returns the start value as a `Bound`. + /// + /// # Examples + /// + /// ``` + /// #![feature(alloc)] + /// #![feature(collections_range)] + /// + /// extern crate alloc; + /// + /// # fn main() { + /// use alloc::range::RangeArgument; + /// use alloc::Bound::*; + /// + /// assert_eq!((..10).start(), Unbounded); + /// assert_eq!((3..10).start(), Included(&3)); + /// # } + /// ``` + fn start(&self) -> Bound<&T>; + + /// End index bound. + /// + /// Returns the end value as a `Bound`. + /// + /// # Examples + /// + /// ``` + /// #![feature(alloc)] + /// #![feature(collections_range)] + /// + /// extern crate alloc; + /// + /// # fn main() { + /// use alloc::range::RangeArgument; + /// use alloc::Bound::*; + /// + /// assert_eq!((3..).end(), Unbounded); + /// assert_eq!((3..10).end(), Excluded(&10)); + /// # } + /// ``` + fn end(&self) -> Bound<&T>; +} + +// FIXME add inclusive ranges to RangeArgument + +impl<T: ?Sized> RangeArgument<T> for RangeFull { + fn start(&self) -> Bound<&T> { + Unbounded + } + fn end(&self) -> Bound<&T> { + Unbounded + } +} + +impl<T> RangeArgument<T> for RangeFrom<T> { + fn start(&self) -> Bound<&T> { + Included(&self.start) + } + fn end(&self) -> Bound<&T> { + Unbounded + } +} + +impl<T> RangeArgument<T> for RangeTo<T> { + fn start(&self) -> Bound<&T> { + Unbounded + } + fn end(&self) -> Bound<&T> { + Excluded(&self.end) + } +} + +impl<T> RangeArgument<T> for Range<T> { + fn start(&self) -> Bound<&T> { + Included(&self.start) + } + fn end(&self) -> Bound<&T> { + Excluded(&self.end) + } +} + +#[unstable(feature = "inclusive_range", reason = "recently added, follows RFC", issue = "28237")] +impl<T> RangeArgument<T> for RangeInclusive<T> { + fn start(&self) -> Bound<&T> { + Included(&self.start) + } + fn end(&self) -> Bound<&T> { + Included(&self.end) + } +} + +#[unstable(feature = "inclusive_range", reason = "recently added, follows RFC", issue = "28237")] +impl<T> RangeArgument<T> for RangeToInclusive<T> { + fn start(&self) -> Bound<&T> { + Unbounded + } + fn end(&self) -> Bound<&T> { + Included(&self.end) + } +} + +impl<T> RangeArgument<T> for (Bound<T>, Bound<T>) { + fn start(&self) -> Bound<&T> { + match *self { + (Included(ref start), _) => Included(start), + (Excluded(ref start), _) => Excluded(start), + (Unbounded, _) => Unbounded, + } + } + + fn end(&self) -> Bound<&T> { + match *self { + (_, Included(ref end)) => Included(end), + (_, Excluded(ref end)) => Excluded(end), + (_, Unbounded) => Unbounded, + } + } +} + +impl<'a, T: ?Sized + 'a> RangeArgument<T> for (Bound<&'a T>, Bound<&'a T>) { + fn start(&self) -> Bound<&T> { + self.0 + } + + fn end(&self) -> Bound<&T> { + self.1 + } +} |
