diff options
| author | bors <bors@rust-lang.org> | 2021-07-20 23:47:48 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-07-20 23:47:48 +0000 |
| commit | fabf502a7a24dfd2dfbc33030cb3d4bad7496b81 (patch) | |
| tree | 45cf4d9c708e8ab22da67088798fd69910e84938 /library/core/tests | |
| parent | b41936b92cd8463020207cb2f62a4247942ef2e4 (diff) | |
| parent | c3ac8d8b8683fdb7f247e9107397ec8948ad4568 (diff) | |
| download | rust-fabf502a7a24dfd2dfbc33030cb3d4bad7496b81.tar.gz rust-fabf502a7a24dfd2dfbc33030cb3d4bad7496b81.zip | |
Auto merge of #87168 - the8472:flatten-len, r=scottmcm
implement TrustedLen for Flatten/FlatMap if the U: IntoIterator == [T; N] This only works if arrays are passed directly instead of array iterators because we need to be sure that they have not been advanced before Flatten does its size calculation. resolves #87094
Diffstat (limited to 'library/core/tests')
| -rw-r--r-- | library/core/tests/iter/adapters/flatten.rs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/library/core/tests/iter/adapters/flatten.rs b/library/core/tests/iter/adapters/flatten.rs index 4bbae6947bf..aaac39c2979 100644 --- a/library/core/tests/iter/adapters/flatten.rs +++ b/library/core/tests/iter/adapters/flatten.rs @@ -1,4 +1,5 @@ use super::*; +use core::array; use core::iter::*; #[test] @@ -109,3 +110,42 @@ fn test_double_ended_flatten() { assert_eq!(it.next(), None); assert_eq!(it.next_back(), None); } + +#[test] +fn test_trusted_len_flatten() { + fn assert_trusted_len<T: TrustedLen>(_: &T) {} + let mut iter = array::IntoIter::new([[0; 3]; 4]).flatten(); + assert_trusted_len(&iter); + + assert_eq!(iter.size_hint(), (12, Some(12))); + iter.next(); + assert_eq!(iter.size_hint(), (11, Some(11))); + iter.next_back(); + assert_eq!(iter.size_hint(), (10, Some(10))); + + let iter = array::IntoIter::new([[(); usize::MAX]; 1]).flatten(); + assert_eq!(iter.size_hint(), (usize::MAX, Some(usize::MAX))); + + let iter = array::IntoIter::new([[(); usize::MAX]; 2]).flatten(); + assert_eq!(iter.size_hint(), (usize::MAX, None)); + + let mut a = [(); 10]; + let mut b = [(); 10]; + + let iter = array::IntoIter::new([&mut a, &mut b]).flatten(); + assert_trusted_len(&iter); + assert_eq!(iter.size_hint(), (20, Some(20))); + core::mem::drop(iter); + + let iter = array::IntoIter::new([&a, &b]).flatten(); + assert_trusted_len(&iter); + assert_eq!(iter.size_hint(), (20, Some(20))); + + let iter = [(), (), ()].iter().flat_map(|_| [(); 1000]); + assert_trusted_len(&iter); + assert_eq!(iter.size_hint(), (3000, Some(3000))); + + let iter = [(), ()].iter().flat_map(|_| &a); + assert_trusted_len(&iter); + assert_eq!(iter.size_hint(), (20, Some(20))); +} |
