Commit graph

500 commits

Author SHA1 Message Date
Tim Vermeulen
58ba1f51ef Add Iterator comparison methods that take a comparison function 2019-09-06 15:30:17 +02:00
Mazdak Farrokhzad
a852ebb084
Rollup merge of #64174 - GuillaumeGomez:missing-iterator-examples, r=sfackler
Add missing code examples on Iterator trait

Fixes #63865

cc @rust-lang/docs
2019-09-06 09:36:44 +02:00
Guillaume Gomez
c9bd2f73a3 Add missing code examples on Iterator trait 2019-09-05 13:38:11 +02:00
Xiang Fan
0e597d4c47 Rev::rposition counts from the wrong end
Because of a compiler bug that adding `Self: ExactSizeIterator` makes
the compiler forget `Self::Item` is `<I as Iterator>::Item`, we remove
this specialization for now.
2019-08-30 21:17:36 +08:00
Mateusz Mikuła
7f4aba40fc Apply clippy::needless_return suggestions 2019-08-22 12:02:02 +02:00
Tim Vermeulen
ec54340756 Fix bug in iter::Chain::size_hint 2019-08-18 21:47:23 +02:00
Mazdak Farrokhzad
477db05066
Rollup merge of #62737 - timvermeulen:cycle_try_fold, r=scottmcm
Override Cycle::try_fold

It's not very pretty, but I believe this is the simplest way to correctly implement `Cycle::try_fold`. The following may seem correct:
```rust
loop {
    acc = self.iter.try_fold(acc, &mut f)?;
    self.iter = self.orig.clone();
}
```
...but this loops infinitely in case `self.orig` is empty, as opposed to returning `acc`. So we first have to fully iterate `self.orig` to check whether it is empty or not, and before _that_, we have to iterate the remaining elements of `self.iter`.

This should always call `self.orig.clone()` the same amount of times as repeated `next()` calls would.

r? @scottmcm
2019-08-17 11:13:42 +02:00
Mazdak Farrokhzad
e632dafba2
Rollup merge of #60492 - acrrd:issues/54054_chain, r=SimonSapin
Add custom nth_back for Chain

Implementation of nth_back for Chain.
Part of #54054
2019-08-16 18:22:20 +02:00
Mazdak Farrokhzad
0bd3a85255
Rollup merge of #63615 - jens1o:patch-1, r=jonas-schievink
Fix typo in DoubleEndedIterator::nth_back doc
2019-08-16 08:26:42 +02:00
Mazdak Farrokhzad
7dbd98fa9a
Rollup merge of #63584 - Centril:cleanup-core-with-more-atb, r=alexreg
libcore: more cleanups using `#![feature(associated_type_bounds)]`

Turns out this was indeed a bootstrapping issue from a test with `./x.py check` locally after https://github.com/rust-lang/rust/pull/63534 merged.

Closes https://github.com/rust-lang/rust/issues/63393

r? @alexreg
cc @iluuu1994
cc https://github.com/rust-lang/rust/issues/52662
2019-08-16 08:26:39 +02:00
Jens Hausdorf
e046a7af49
Fix typo in DoubleEndedIterator::nth_back doc 2019-08-15 22:16:59 +02:00
Mazdak Farrokhzad
f54503c908 libcore: more cleanups using associated_type_bounds 2019-08-15 09:59:25 +02:00
Josh Stone
fc4d037169 Reduce genericity in Inspect 2019-08-12 15:03:44 -07:00
Josh Stone
f1003546db Reduce genericity in Scan 2019-08-12 15:03:44 -07:00
Josh Stone
0f82c0c210 Reduce genericity in Take 2019-08-12 15:03:44 -07:00
Josh Stone
46a62ca9a4 Reduce genericity in Skip 2019-08-12 15:03:44 -07:00
Josh Stone
2d7fc4dd49 Reduce genericity in TakeWhile 2019-08-12 15:03:44 -07:00
Josh Stone
5902522c04 Reduce genericity in SkipWhile 2019-08-12 15:03:44 -07:00
Josh Stone
ff60eca7a1 Avoid closures in Peekable 2019-08-12 15:03:44 -07:00
Josh Stone
df3d686598 Reduce genericity in Enumerate 2019-08-12 15:03:44 -07:00
Josh Stone
ac113f01fb Reduce genericity in Filter and FilterMap 2019-08-12 15:03:44 -07:00
Josh Stone
b1fd3d024d Remove genericity in StepBy::size_hint 2019-08-12 15:03:44 -07:00
Josh Stone
d940ddf8f5 Reduce genericity in Copied and Cloned 2019-08-12 15:03:44 -07:00
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
Tim Vermeulen
688c11216a Override Cycle::try_fold 2019-07-17 01:16:49 +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