Force exhaustion in iter::ArrayChunks::into_remainder#123406
Force exhaustion in iter::ArrayChunks::into_remainder#123406bors merged 1 commit intorust-lang:masterfrom
Conversation
| #[inline] | ||
| pub fn into_remainder(self) -> Option<array::IntoIter<I::Item, N>> { | ||
| pub fn into_remainder(mut self) -> Option<array::IntoIter<I::Item, N>> { | ||
| while let Some(_) = self.next() {} |
There was a problem hiding this comment.
| while let Some(_) = self.next() {} | |
| if self.remainder.is_none() { | |
| while let Some(_) = self.next() {} | |
| } |
If I: DoubleEndedIterator + ExactSizeIterator (thus Self: DoubleEndedIterator), and self.next_back() has been called, and there is a remainder, then self.remainder is already set to Some, so we can skip exhausting the iterator. (Optimization , not required for correctness).
Hypothetically, specialization could be used to do the "fast" thing if I: DEI + ESI regardless of if the remainder has already been found, but in general that would be unsound (I think?), since user implementations of DEI/ESI can have lifetime requirements.
There was a problem hiding this comment.
Nice catch regarding next_back. I'll implement it.
I didn't get your point about specialization.
ed0f1ce to
d9a8903
Compare
| pub fn into_remainder(self) -> Option<array::IntoIter<I::Item, N>> { | ||
| pub fn into_remainder(mut self) -> Option<array::IntoIter<I::Item, N>> { | ||
| if self.remainder.is_none() { | ||
| while let Some(_) = self.next() {} |
There was a problem hiding this comment.
Hmm, normally we say to use for_each(drop) for this
rust/library/core/src/iter/traits/iterator.rs
Line 1996 in 0e15f5e
but I guess this can't use that because it consumes it :/
Maybe it should be
| while let Some(_) = self.next() {} | |
| self.try_for_each(NeverShortCircuit::wrap_mut_1(drop)); |
?
Meh, we can always change it later if it ends up mattering. This is probably fine.
|
Thanks for the fix! I wondered for a bit about what would happen with this after exhaustion or if it's called twice, but then I remembered it's @bors r+ |
…cottmcm Force exhaustion in iter::ArrayChunks::into_remainder Closes: rust-lang#123333
…cottmcm Force exhaustion in iter::ArrayChunks::into_remainder Closes: rust-lang#123333
…kingjubilee Rollup of 9 pull requests Successful merges: - rust-lang#117919 (Introduce perma-unstable `wasm-c-abi` flag) - rust-lang#123406 (Force exhaustion in iter::ArrayChunks::into_remainder) - rust-lang#123752 (Properly handle emojis as literal prefix in macros) - rust-lang#123935 (Don't inline integer literals when they overflow - new attempt) - rust-lang#123980 ( Add an opt-in to store incoming edges in `VecGraph` + misc) - rust-lang#124019 (Use raw-dylib for Windows synchronization functions) - rust-lang#124110 (Fix negating `f16` and `f128` constants) - rust-lang#124112 (Fix ICE when there is a non-Unicode entry in the incremental crate directory) - rust-lang#124116 (when suggesting RUST_BACKTRACE=1, add a special note for Miri's env var isolation) r? `@ghost` `@rustbot` modify labels: rollup
…kingjubilee Rollup of 7 pull requests Successful merges: - rust-lang#123406 (Force exhaustion in iter::ArrayChunks::into_remainder) - rust-lang#123752 (Properly handle emojis as literal prefix in macros) - rust-lang#123935 (Don't inline integer literals when they overflow - new attempt) - rust-lang#123980 ( Add an opt-in to store incoming edges in `VecGraph` + misc) - rust-lang#124019 (Use raw-dylib for Windows synchronization functions) - rust-lang#124110 (Fix negating `f16` and `f128` constants) - rust-lang#124116 (when suggesting RUST_BACKTRACE=1, add a special note for Miri's env var isolation) r? `@ghost` `@rustbot` modify labels: rollup
Rollup merge of rust-lang#123406 - krtab:fix_remainder_iterchunk, r=scottmcm Force exhaustion in iter::ArrayChunks::into_remainder Closes: rust-lang#123333
Closes: #123333