-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Change trait RangeArgument to struct RangeBounds. #43033
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,142 +11,7 @@ | |
#![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")] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As this module only contained There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Will do! |
||
|
||
//! Range syntax. | ||
|
||
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 | ||
} | ||
} | ||
use core::ops::RangeBounds; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This would need to be "1.21.0" now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will do!