Skip to content

Commit 49894ee

Browse files
committed
Implement ExactSizeIterator for Zip<A, Repeat<B>>
Where: A: ExactSizeIterator, B: Clone, And the symmetrical instance. The only other instance for `ExactSizeIterator<Zip<_, _>>` requires each zipped iterator to be `ExactSizeIterator`, and since `Repeat` does not implement `ExactSizeIterator`, these instances don't overlap with anything.
1 parent 8a1b399 commit 49894ee

File tree

2 files changed

+32
-1
lines changed
  • library
    • coretests/tests/iter/adapters
    • core/src/iter/adapters

2 files changed

+32
-1
lines changed

library/core/src/iter/adapters/zip.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::cmp;
22
use crate::fmt::{self, Debug};
33
use crate::iter::{
4-
FusedIterator, InPlaceIterable, SourceIter, TrustedFused, TrustedLen, UncheckedIterator,
4+
FusedIterator, InPlaceIterable, Repeat, SourceIter, TrustedFused, TrustedLen, UncheckedIterator,
55
};
66
use crate::num::NonZero;
77

@@ -413,6 +413,22 @@ where
413413
{
414414
}
415415

416+
#[stable(feature = "exact_size_zip_repeat", since = "1.91.0")]
417+
impl<A, B> ExactSizeIterator for Zip<A, Repeat<B>>
418+
where
419+
A: ExactSizeIterator,
420+
B: Clone,
421+
{
422+
}
423+
424+
#[stable(feature = "exact_size_zip_repeat", since = "1.91.0")]
425+
impl<A, B> ExactSizeIterator for Zip<Repeat<A>, B>
426+
where
427+
A: Clone,
428+
B: ExactSizeIterator,
429+
{
430+
}
431+
416432
#[doc(hidden)]
417433
#[unstable(feature = "trusted_random_access", issue = "none")]
418434
unsafe impl<A, B> TrustedRandomAccess for Zip<A, B>

library/coretests/tests/iter/adapters/zip.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,3 +370,18 @@ fn test_issue_82291() {
370370
zip.next();
371371
assert_eq!(called.get(), 1);
372372
}
373+
374+
#[test]
375+
fn zip_repeat_bounds() {
376+
let iter = [1, 2, 3].into_iter().zip(repeat(2));
377+
let (lower, upper) = iter.size_hint();
378+
assert_eq!(lower, 3);
379+
assert_eq!(upper, Some(3));
380+
assert_eq!(iter.len(), 3);
381+
382+
let iter = repeat(2).zip([1, 2, 3].into_iter());
383+
let (lower, upper) = iter.size_hint();
384+
assert_eq!(lower, 3);
385+
assert_eq!(upper, Some(3));
386+
assert_eq!(iter.len(), 3);
387+
}

0 commit comments

Comments
 (0)