Commit graph

475 commits

Author SHA1 Message Date
Josh Stone
27ddbf4d16 Avoid closures in the default <Zip as ZipImpl>::next 2019-08-12 15:03:44 -07:00
Josh Stone
9ef95ff4a6 Reduce genericity in FlattenCompat 2019-08-12 15:03:44 -07:00
Josh Stone
40ecbc7b7d Avoid closures in OnceWith and Successors 2019-08-12 15:03:44 -07:00
Josh Stone
7539fc69d5 Reduce genericity in Iterator::last 2019-08-12 15:03:44 -07:00
Josh Stone
0e300e4380 Reduce the genericity of Map folds 2019-08-12 15:03:44 -07:00
Josh Stone
6a04c762ff Explicitly test Iterator::position overflows 2019-08-12 15:03:44 -07:00
Josh Stone
af1bfbebe3 Explicitly test Iterator::count overflows 2019-08-12 15:03:44 -07:00
Josh Stone
95e2a4f23d Use if-let in is_sorted_by 2019-08-12 15:03:44 -07:00
Josh Stone
e67620afc4 Reduce the genericity of closures in the iterator traits
By default, closures inherit the generic parameters of their scope,
including `Self`. However, in most cases, the closures used to implement
iterators don't need to be generic on the iterator type, only its `Item`
type. We can reduce this genericity by redirecting such closures through
local functions.

This does make the closures more cumbersome to write, but it will
hopefully reduce duplication in their monomorphizations, as well as
their related type lengths.
2019-08-12 15:03:44 -07:00
Ilija Tovilo
77bfd7fd1a
Don't use associated type bounds in docs until it is stable 2019-08-09 13:40:54 +02:00
Ilija Tovilo
3d231accee
Add missing #![feature(associated_type_bounds)] 2019-08-09 11:19:45 +02:00
Ilija Tovilo
3a6a29b4ec
Use associated_type_bounds where applicable - closes #61738 2019-08-08 22:39:15 +02:00
Mazdak Farrokhzad
c32735d03c
Rollup merge of #62459 - timvermeulen:result_sum_internal_iteration, r=scottmcm
Use internal iteration in the Sum and Product impls of Result and Option

This PR adds internal iteration to the `ResultShunt` iterator type underlying the `Sum` and `Product` impls of `Result`. I had to change `ResultShunt` to hold a mutable reference to an error instead, similar to `itertools::ProcessResults`, in order to be able to pass the `ResultShunt` itself by value (which is necessary for internal iteration).

`ResultShunt::process` can unfortunately no longer be an associated function because that would make it generic over the lifetime of the error reference, which wouldn't work, so I turned it into the free function `process_results`.

I removed the `OptionShunt` type and forwarded the `Sum` and `Product` impls of `Option` to their respective impls of `Result` instead, to avoid having to repeat the internal iteration logic.
2019-08-06 15:36:27 +02:00
Mazdak Farrokhzad
fe998dbfe4
Rollup merge of #61457 - timvermeulen:double_ended_iters, r=scottmcm
Implement DoubleEndedIterator for iter::{StepBy, Peekable, Take}

Now that `DoubleEndedIterator::nth_back` has landed, `StepBy` and `Take` can have an efficient `DoubleEndedIterator` implementation. I don't know if there was any particular reason for `Peekable` not having a `DoubleEndedIterator` implementation, but it's quite trivial and I don't see any drawbacks to having it.

I'm not very happy about the implementation of `Peekable::try_rfold`, but I didn't see another way to only take the value out of `self.peeked` in case `self.iter.try_rfold` didn't exit early.

I only added `Peekable::rfold` (in addition to `try_rfold`) because its `Iterator` implementation has both `fold` and `try_fold` (and for similar reasons I added `Take::try_rfold` but not `Take::rfold`). Do we have any guidelines on whether we want both? If we do want both, maybe we should investigate which iterator adaptors override `try_fold` but not `fold` and add the missing implementations. At the moment I think that it's better to always have iterator adaptors implement both, because some iterators have a simpler `fold` implementation than their `try_fold` implementation.

The tests that I added may not be sufficient because they're all just existing tests where `next`/`nth`/`fold`/`try_fold` are replaced by their DEI counterparts, but I do think all paths are covered. Is there anything in particular that I should probably also test?
2019-08-06 08:17:31 +02:00
Tim Vermeulen
2e41ba8742 Use internal iteration in the Sum and Product impls of Result and Option 2019-07-29 02:40:50 +02:00
Stargateur
3334802c83 Refactoring use commun code between option, result and accum 2019-07-27 02:17:56 +02:00
Mazdak Farrokhzad
ad21558b85
Rollup merge of #62481 - czipperz:iterator-last-nth-use-for_each, r=scottmcm
Use `fold` in `Iterator::last` default implementation

We already use it in all the other methods.  Consistency + potential perf is a pretty nice win!
2019-07-10 16:08:23 +02:00
Chris Gregory
76a8bc2473 Use fold in Iterator::last
Replace last impl with fold
2019-07-09 21:26:49 -07:00
Josh Stone
7171c83ab2 Tracking issue 62544 for iter_is_partitioned 2019-07-09 15:18:33 -07:00
Josh Stone
4c22e48f6e Tracking issue 62543 for iter_partition_in_place 2019-07-09 15:17:47 -07:00
Tim Vermeulen
56ebfb185b Implement DoubleEndedIterator for iter::{StepBy, Peekable, Take} 2019-07-09 23:38:57 +02:00
Josh Stone
0492f972c7 Return the true count from partition_in_place 2019-07-09 12:39:25 -07:00
Josh Stone
cd0ebc43c7 Rename partition_mut to partition_in_place 2019-07-09 12:39:25 -07:00
Josh Stone
cdeec0a618 Capitalize example comment
Co-Authored-By: Mazdak Farrokhzad <twingoow@gmail.com>
2019-07-09 12:39:25 -07:00
Josh Stone
60f1449b61 Add Iterator::partition_mut() and is_partitioned()
`partition_mut()` swaps `&mut T` items in-place to satisfy the
predicate, so all `true` items precede all `false` items. This requires
a `DoubleEndedIterator` so we can search from front and back for items
that need swapping.

`is_partitioned()` checks whether the predicate is already satisfied.
2019-07-09 12:39:25 -07:00
bors
78ca1bda35 Auto merge of #62473 - timvermeulen:is_sorted_by_key, r=scottmcm
Only call the closure parameter of Iterator::is_sorted_by_key once per item

See https://github.com/rust-lang/rust/issues/53485#issuecomment-472314004.

This changes `Iterator::is_sorted_by_key` to only call the given closure once for each item, which allows us to pass the items to the closure by value instead of by reference.

**Important**: `is_sorted_by_key` for slices and slice iterators is now no longer implemented in terms of the custom `slice::Iter::is_sorted_by` implementation. It's a trade-off: we could forward `slice::Iter::is_sorted_by_key` to it directly for potential SIMD benefits, but that would mean that the closure is potentially called twice for (almost) every element of the slice.
2019-07-08 12:03:06 +00:00
Tim Vermeulen
98b54fbd7a Only call the closure parameter of Iterator::is_sorted_by_key once per item 2019-07-07 20:46:38 +02:00
Ivan Enderlin
643ae635e9
doc(libcore) Fix CS
A small PR to fix a small CS typo in `iter/traits/collect.rs`.
2019-06-28 14:01:58 +02:00
Julien Cretin
b8106b59d2 Fix meta-variable binding errors in macros
The errors are either:
- The meta-variable used in the right-hand side is not bound (or defined) in the
  left-hand side.
- The meta-variable used in the right-hand side does not repeat with the same
  kleene operator as its binder in the left-hand side. Either it does not repeat
  enough, or it uses a different operator somewhere.

This change should have no semantic impact.
2019-06-23 01:30:41 +02:00
Mazdak Farrokhzad
3e08f1b57e
Rollup merge of #60454 - acrrd:issues/54054_skip, r=scottmcm
Add custom nth_back to Skip

Implementation of nth_back for Skip.
Part of #54054
2019-06-20 08:35:58 +02:00
Mazdak Farrokhzad
3a8dc44f3c
Rollup merge of #61671 - koalatux:nth-back-range, r=KodrAus
implement nth_back for Range(Inclusive)

This is part of  #54054.
2019-06-12 04:22:51 +02:00
Josh Stone
c127f537e9 Use for_each in Iterator::partition
We already use this for `unzip`, but `partition` is not much different.
2019-06-10 14:17:48 -07:00
Adrian Friedli
8590074a01
implement nth_back for RangeInclusive 2019-06-09 22:45:11 +02:00
Adrian Friedli
26d4c8f01c
implement nth_back for Range 2019-06-08 22:30:45 +02:00
Lzu Tao
0c35c699d4 Stabilize iter_nth_back feature 2019-05-30 18:00:17 +00:00
Andrea Corradi
e80a37558d Add custom nth_back for Skip 2019-05-29 22:33:38 +02:00
Mazdak Farrokhzad
61545b6975
Rollup merge of #60542 - timvermeulen:step_sub_usize, r=scottmcm
Add Step::sub_usize

Required for #54054.

I'm aware that the `Step` trait needs a rework, but this still seems like a reasonable addition?

This currently doesn't compile because Chalk contains a type that implement this trait, and this is a breaking change. How can that be fixed?
2019-05-29 08:15:49 +02:00
Mazdak Farrokhzad
d67d1f24dc
Rollup merge of #58975 - jtdowney:iter_arith_traits_option, r=dtolnay
Implement `iter::Sum` and `iter::Product` for `Option`

This is similar to the existing implementation for `Result`. It will take each item into the accumulator unless a `None` is returned.

I based a lot of this on #38580. From that discussion it didn't seem like this addition would be too controversial or difficult. One thing I still don't understand is picking the values for the `stable` attribute. This is my first non-documentation PR for rust so I am open to any feedback on improvements.
2019-05-29 08:15:48 +02:00
David Tolnay
9f8d934f27
Bump Sum and Product for Option<T> to 1.37 2019-05-28 16:00:39 -07:00
Mazdak Farrokhzad
a449bc3ad0
Rollup merge of #61237 - DevQps:expand-iterator-docs, r=Mark-Simulacrum
Updated the Iterator docs with information about overriding methods.

# Description

Updated the Iterator docs with information about overriding methods.

closes #60223
2019-05-28 11:49:00 +02:00
Christian
b560b9cd36 Updated the Iterator docs with information about overriding methods. 2019-05-27 16:17:39 +02:00
Tim Vermeulen
f1d0829e20 Add Step::sub_usize 2019-05-25 02:53:08 +02:00
Steven Fackler
8a22bc3b30 Revert "Add implementations of last in terms of next_back on a bunch of DoubleEndedIterators."
This reverts commit 3e86cf36b5.
2019-05-22 14:09:34 -07:00
Josh Stone
90dd35918d Use iter() for iterating arrays by slice
These `into_iter()` calls will change from iterating references to
values if we ever get `IntoIterator` for arrays, which may break the
code using that iterator. Calling `iter()` is future proof.
2019-05-17 19:56:35 -07:00
Mazdak Farrokhzad
bab03cecfe
Rollup merge of #60130 - khuey:efficient_last, r=sfackler
Add implementations of last in terms of next_back on a bunch of DoubleEndedIterators

Provided a `DoubleEndedIterator` has finite length, `Iterator::last` is equivalent to `DoubleEndedIterator::next_back`. But searching forwards through the iterator when it's unnecessary is obviously not good for performance. I ran into this on one of the collection iterators.

I tried adding appropriate overloads for a bunch of the iterator adapters like filter, map, etc, but I ran into a lot of type inference failures after doing so.

The other interesting case is what to do with `Repeat`. Do we consider it part of the contract that `Iterator::last` will loop forever on it? The docs do say that the iterator will be evaluated until it returns None. This is also relevant for the adapters, it's trivially easy to observe whether a `Map` adapter invoked its closure a zillion times or just once for the last element.
2019-05-14 22:00:09 +02:00
Mazdak Farrokhzad
b71f8d4e1b Stabilize Iterator::copied in 1.36.0. 2019-04-27 16:45:30 +02:00
varkor
7f0f0e31ec Remove double trailing newlines 2019-04-22 16:57:01 +01:00
Kyle Huey
3e86cf36b5 Add implementations of last in terms of next_back on a bunch of DoubleEndedIterators.
r?Manishearth
2019-04-19 21:52:43 -07:00
Mazdak Farrokhzad
3ad9fcccbb
Rollup merge of #60098 - Centril:libcore-deny-more, r=varkor
libcore: deny `elided_lifetimes_in_paths`

r? @varkor
2019-04-19 06:03:30 +02:00
Mazdak Farrokhzad
291e44b381
Rollup merge of #60023 - koalatux:nth-back, r=scottmcm
implement specialized nth_back() for Bytes, Fuse and Enumerate

Hi,

After my first PR has been successfully merged, here is my second pull request :-)

Also this PR contains some specializations for the problem discussed in #54054.
2019-04-19 06:03:12 +02:00