Add Range[Inclusive]::is_empty#48087
Conversation
During the RFC, it was discussed that figuring out whether a range is empty was subtle, and thus there should be a clear and obvious way to do it. It can't just be ExactSizeIterator::is_empty (also unstable) because not all ranges are ExactSize -- not even Range<i32> or RangeInclusive<usize>.
|
r? @shepmaster (rust_highfive has picked a reviewer for you, use r? to override) |
| /// #![feature(exact_size_is_empty)] | ||
| /// | ||
| /// let mut one_element = 0..1; | ||
| /// let mut one_element = std::iter::once(0); |
There was a problem hiding this comment.
Why is this related to this PR?
There was a problem hiding this comment.
Because using 0..1 means the code wasn't actually using ExactSizeIterator; the inherent method was getting picked up instead. For normal code that's not a problem--they do exactly the same thing--but I figured the doctest should actually use the method it's documenting.
| assert_eq!(ExactSizeIterator::is_empty(&r), false); | ||
| assert_eq!(r.nth(10), None); | ||
| assert_eq!(r.is_empty(), true); | ||
| assert_eq!(ExactSizeIterator::is_empty(&r), true); |
There was a problem hiding this comment.
Is this going to be a concern for end users?
There was a problem hiding this comment.
ExactSizeIterator::is_empty (also unstable)
ah, nvm
There was a problem hiding this comment.
Range::is_empty is strictly more general, so it's not a problem in a world where everything is stable. It may be a slight hiccup in nightly, but I would expect it to be solved in the wild by adding the new feature gate, rather than the annoying UFCS. Here I just changed it to the other method because I didn't want to change what the test was testing. (It would be a problem if we wanted to stabilize ExactSizeIterator::is_empty first, as mentioned in the OP, but I feel like this should be less controversial than the new trait method, especially since there are a bunch of iterators that aren't ExactSize that could provide an efficient is_empty.)
| assert!( (EPSILON ..= NAN).is_empty()); | ||
| assert!( (NAN ..= EPSILON).is_empty()); | ||
| assert!( (NAN ..= NAN).is_empty()); | ||
| } |
There was a problem hiding this comment.
WDYT about a test that calls next on a Range{Inclusive} and makes sure it transitions from not empty to empty?
There was a problem hiding this comment.
Good thought; I'll change all of these to look for is_empty instead of 1..=0: https://github.com/rust-lang/rust/blob/master/src/libcore/tests/iter.rs#L1433
| assert_eq!(r.nth(10), None); | ||
| assert_eq!(r.is_empty(), true); | ||
| assert_eq!(r, 1..=0); // We may not want to document/promise this detail | ||
| assert_eq!(ExactSizeIterator::is_empty(&r), true); |
There was a problem hiding this comment.
Changed RangeInclusive exhaustion tests to check is_empty, updated the docs to unspecify the post-iteration value of a RangeInclusive, and added some more Range tests using its is_empty.
|
Since you're defining LGTM other than this documentation bit, but I'd also like someone from @rust-lang/libs to sign-off. |
|
Looks good to me! Especially as unstable I think this can land when it's good to go |
|
Added the |
|
@bors r=kennytm,alexcrichton |
|
📌 Commit 22b0489 has been approved by |
…alexcrichton Add Range[Inclusive]::is_empty During rust-lang/rfcs#1980, it was discussed that figuring out whether a range is empty was subtle, and thus there should be a clear and obvious way to do it. It can't just be ExactSizeIterator::is_empty (also unstable) because not all ranges are ExactSize -- such as `Range<i64>` and `RangeInclusive<usize>`. Things to ponder: - Unless this is stabilized first, this makes stabilizing ExactSizeIterator::is_empty more icky, since this hides that. - This is only on `Range` and `RangeInclusive`, as those are the only ones where it's interesting. But one could argue that it should be on more for consistency, or on RangeArgument instead. - The bound on this is PartialOrd, since that works ok (see tests for float examples) and is consistent with `contains`. But ranges like `NAN..=NAN`_are_ kinda weird. - [x] ~~There's not a real issue number on this yet~~
…alexcrichton Add Range[Inclusive]::is_empty During rust-lang/rfcs#1980, it was discussed that figuring out whether a range is empty was subtle, and thus there should be a clear and obvious way to do it. It can't just be ExactSizeIterator::is_empty (also unstable) because not all ranges are ExactSize -- such as `Range<i64>` and `RangeInclusive<usize>`. Things to ponder: - Unless this is stabilized first, this makes stabilizing ExactSizeIterator::is_empty more icky, since this hides that. - This is only on `Range` and `RangeInclusive`, as those are the only ones where it's interesting. But one could argue that it should be on more for consistency, or on RangeArgument instead. - The bound on this is PartialOrd, since that works ok (see tests for float examples) and is consistent with `contains`. But ranges like `NAN..=NAN`_are_ kinda weird. - [x] ~~There's not a real issue number on this yet~~
…alexcrichton Add Range[Inclusive]::is_empty During rust-lang/rfcs#1980, it was discussed that figuring out whether a range is empty was subtle, and thus there should be a clear and obvious way to do it. It can't just be ExactSizeIterator::is_empty (also unstable) because not all ranges are ExactSize -- such as `Range<i64>` and `RangeInclusive<usize>`. Things to ponder: - Unless this is stabilized first, this makes stabilizing ExactSizeIterator::is_empty more icky, since this hides that. - This is only on `Range` and `RangeInclusive`, as those are the only ones where it's interesting. But one could argue that it should be on more for consistency, or on RangeArgument instead. - The bound on this is PartialOrd, since that works ok (see tests for float examples) and is consistent with `contains`. But ranges like `NAN..=NAN`_are_ kinda weird. - [x] ~~There's not a real issue number on this yet~~
During rust-lang/rfcs#1980, it was discussed that figuring out whether a range is empty was subtle, and thus there should be a clear and obvious way to do it. It can't just be ExactSizeIterator::is_empty (also unstable) because not all ranges are ExactSize -- such as
Range<i64>andRangeInclusive<usize>.Things to ponder:
RangeandRangeInclusive, as those are the only ones where it's interesting. But one could argue that it should be on more for consistency, or on RangeArgument instead.contains. But ranges likeNAN..=NANare kinda weird.There's not a real issue number on this yet